东北大学专业课初试考C语言和数据结构
复试考:软工,网络,java,数据库四门
专业课C语言部分(都是运行过的,应该没问题):
2001
//C语言 四
#include
#include
#include
#define N 30
#define MIN -10000
typedef struct{
int num;
int val;
}max;
int main(){
int m,n;
int a[N][N];
max row[N];//记录各行最大值
printf("输入数组行,列:\n");
scanf("%d%d",&m,&n);
printf("输入数组信息:\n");
for(int i=0;irow[i].val)
row[i].val = a[i][j];
}
}
for(int i=m-1;i>0;--i){//对各行最大值排序
for(int j=0;jrow[j+1].val){
int temp = row[j].val;
row[j].val = row[j+1].val;
row[j+1].val = temp;
temp = row[j].num;
row[j].num = row[j+1].num;
row[j+1].num = temp;
}
}
}
for(int i=0;i
#include//strcmp,strcpy
#include//exit
#define N 1024
int main(){
FILE *fp;//定义文件指针
char *text[N];
char p[N],q[N];
/*
用fgets(..)读入数据时,先定义一个字符数组或字符指针,如果定义了字符指针 ,那么一定要初始化。
char s[100]; //可以。
char *s; //不可以,因为只是声明了一个指针。但并没有为它分配内存缓冲区。
所以,如果要用指针,则 char *s=(char *)malloc(100*sizeof(char));为其分配内存空间
*/
int num;
int i,j,len;
fp = fopen("dict.txt","r");
if(fp==NULL){
printf("can not open file\n");
exit(0);
}
/*
fgets(...)读入文本行时的两种情况:
1.如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。
并且在s的最后插入字符串结束标志'\0'。
ps:在'\0'之前还有一个'\n'。p[strlen(p)-1]='\0';这句话可以把'\n'消去
2.如果n小于等于一行的字符串的长度,那么读入n-1个字符,
此时并没有读入\n因为并没有到行尾 ,同样在最后会插入'\0'.
*/
num=0;
while(fgets(p,1024,fp)!=NULL){
/*
如果读入成功,则返回缓冲区的地址。
如果读入错误或遇到文件结尾(EOF),则返回NULL.
*/
p[strlen(p)-1]='\0';//把'\n'消去
text[num]=(char *)malloc(N*sizeof(char));
strcpy(text[num++],p);
}
printf("%d\n",num);
//scanf("%s",q); 不能用%s,%s输入时遇到空格或回车则结束
gets(q);
i=0;
j=num-1;
while(i<=j){//i<=j,因为i==j时可能是正确结果
printf("%d %d\n",i,j);
if(strcmp(q,text[(i+j)/2])==0){
printf("%s\n",q);
break;/到结果要及时退出,否则会死循环
}
else if(strcmp(q,text[(i+j)/2])>0)
i=(i+j)/2+1;
else
j=(i+j)/2-1;
}
printf("%d %d\n",i,j);
if(i>j)
printf("查找失败\n");
fclose(fp);
return 0;
}
/*
测试数据:(测试数据最后有一个回车!)
book/n./This is a book.
desk/n./This is our desk.
sequence/n./a sequence of.
student/n./I am a student.
we/n./we are the world.
*/
编程题(四)副本
#include
#include
#include
#define N 1024
int main(){
FILE *fp;
char *text[N];
int num = 0;
char p[N],q[N];
fp = fopen("dict.txt","r");//"r"
if(fp==NULL){
printf("can not open file\n");
exit(0);
}
while(fgets(p,N,fp)!=NULL){
p[strlen(p)-1] = '\0';//当N大于一行的长度时会多读一个'\n',所以要消掉
text[num] = (char *)malloc(N*sizeof(char));//给指针分配空间
strcpy(text[num++],p);
}
for(int i=0;i0)
i=(i+j)/2+1;
else
j=(i+j)/2-1;
}
if(i>j)
printf("查找失败\n");
fclose(fp);
return 0;
}
编程题(五)
#include
#include
#include
typedef struct Lnode{
int num;
struct Lnode *next;
}Lnode;
int main(){
int n;
Lnode *L;
Lnode *p,*q;
L=(Lnode *)malloc(sizeof(Lnode));
L->next=NULL;
q=L;
scanf("%d",&n);
for(int i=1;i<=n;i++){//创建链表,给每个结点编号
p=(Lnode *)malloc(sizeof(Lnode));
p->num=i;
p->next=NULL;
q->next=p;
q=q->next;
}
/*
p=L->next;
while(p!=NULL){
printf("%d\n",p->num);
p=p->next;
}
*/
int i=0,temp=0;
while(L->next!=NULL){//判断圈子里是否还有人
p=L;//p指向待删除结点的前驱
while(p->next!=NULL){//圈子有人的时候开始数数,并且数到此轮最后一个人
i++;
if(i==pow(2,temp)){
printf("%d %d\n",temp,p->next->num);
temp++;
q=p->next;//退出圈子,删除结点
p->next=q->next;
free(q);
}
else//下一个人数数
p=p->next;
}
}
return 0;
}
2011
//C语言基础(1)
#include
struct num{
int x;
int y;
}a[]={{2,32},{8,16},{4,48}};
int main(){
struct num *p=a+1;//p指向{8,16}
int x;
x=p->y/a[0].x*++p->x;//16/2*9=72
/*
优先级:第一级:(),[],->,. 左结合
第二级:++,--,*,& 右结合
第三级:+,-,*,/
*/
printf("%d\n",x);
return 0;
}
//编程题(1)
#include
#include
int main(){
FILE *fp;
char buf;
int count=0;
fp=fopen("data.txt","r");
if(fp==NULL){
printf("can not open file\n");
exit(0);
}
//不能用fgets(),因为fgets是按行读
//可以用fgetc,返回值:返回所得到的字符;若读入错误,返回EOF。
while(fscanf(fp,"%c",&buf)>0){//fscanf返回的是实际读取的数据个数,出错或者到结尾返回EOF。PS:EOF的值是-1
count++;
printf("%c",buf);
if(buf=='\n'){
count = 0;
continue;
}
if(count%30==0)
printf("\n");
}
fclose(fp);
return 0;
}
//编程题(2)
#include
#include
#include
//将串str1中i个字符到第j个字符之间的字符替换成串str2
char *stuff(char *str1,char *str2,int i,int j){
static char buf[100];//设置为static变量!!!
char *p,*q;
q = buf;
p = str1;
while(p!=(str1+i)){//把str1前i个字符赋值给buf,p!=(p+i)不对
*q = *p;
p++;
q++;
}
p = str2;
while(*p!='\0'){//把str2赋值给buf
*q = *p;
++p;
++q;
}
p = str1+j-1;
while(*p!='\0'){//把str1第j个字符开始的剩余串赋值给buf
*q = *p;
++p;
++q;
}
*q = '\0';//字符串结束标志
return buf;
}
int main(){
char s1[100],s2[100];
int i,j;
gets(s1);
gets(s2);
scanf("%d%d",&i,&j);
char *s3=stuff(s1,s2,i,j);
puts(s3);
return 0;
}
//鞍点
#include
#include
#include
#define N 100
#define MIN -10000000
int main(){
int a[N][N];
int row[N],col[N];
int m,n;
scanf("%d%d",&m,&n);
for(int i=0;ia[k][col[h]]){
flag = 0;
}
}
if(flag)
++h;
}
if(h==0)
printf("没有鞍点\n");
else{
printf("鞍点:\n");
for(int i=0;i
long f(int n,int m){
if(m==0||m>n)
return 0;
if(m==1||m==n)
return 1;
if(n>m&&m>0)
return m*f(n-1,m)+f(n-1,m-1);
}
int main(){
int a,b;
scanf("%d%d",&a,&b);
printf("%ld\n",f(a,b));
return 0;
}
//九宫格
#include
int main(){
int a[3][3];
for(int i=0;i<3;++i){
for(int j=0;j<3;++j){
scanf("%d",&a[i][j]);
}
}
int flag=1;
for(int i=0;i<8;++i){//判断是否有重复数字
int temp=*(*a+i);
for(int j=i+1;j<9;++j){
if(temp == *(*a+j)){
flag = 0;
break;
}
}
}
int sum=a[0][0]+a[0][1]+a[0][2];
if((a[1][0]+a[1][1]+a[1][2])!=sum||(a[2][0]+a[2][1]+a[2][2])!=sum)//判断各行
flag = 0;
if((a[0][0]+a[1][0]+a[2][0])!=sum||(a[0][1]+a[1][1]+a[2][1])!=sum||(a[0][2]+a[1][2]+a[2][2])!=sum)//判断各列
flag = 0;
if((a[0][0]+a[1][1]+a[2][2])!=sum||(a[0][2]+a[1][1]+a[2][0])!=sum)//判断对角线
flag = 0;
if(flag)
printf("满足要求\n");
else
printf("不满足要求\n");
return 0;
}
//编程 3
//读取file1中的单词到指针数组,冒泡排序,再逐个插入到file2
#include
#include
#include
#define N 100
int main(){
FILE *fpin,*fpout;//定义文件指针
char *dict[N];
fpin = fopen("file1.txt","r");//"r",必须是双引号
if(fpin==NULL){
printf("can not open file\n");
exit(0);
}
int k=0;
dict[k] = (char *)malloc(N*sizeof(char));
while(fscanf(fpin,"%s",dict[k])>0){//fscanf返回的是实际读取的数据个数,出错或者到结尾返回EOF。
++k;
dict[k] = (char *)malloc(N*sizeof(char));
}
fclose(fpin);
for(int i=k-1;i>0;--i){//冒泡排序
for(int j=0;j0){
char *temp = dict[j];
dict[j] = dict[j+1];
dict[j+1] = temp;
}
}
}
fpout = fopen("file2.txt","w");
if(fpout==NULL){
printf("can not open file\n");
exit(0);
}
for(int i=0;i
int main(){
int i=10;
while(1){
if(i%5==1&&i%6==5&&i%7==4&&i%11==10){
printf("%d\n",i);
break;
}
++i;
}
return 0;
}
//C语言 2
#include
int main(){
char str[100];
char *p;
int m=0,n=0;
gets(str);
p=str;
while(*p!='\0'){
if(*p>='a'&&*p<='z')
++m;
if(*p>='A'&&*p<='Z')
++n;
++p;
}
printf("小写字母个数:%d,大写字母个数:%d\n",m,n);
--p;
while(p!=str){
if(*p>='A'&&*p<='Z')
printf("%c ",*p);
--p;
}
if(*p>='A'&&*p<='Z')//判断第一个字符是否大写
printf("%c \n",*p);
return 0;
}
//鞍点
#include
#define N 10
int main(){
int a[N][N];
int row[N],col[N];
int m,n;
scanf("%d%d",&m,&n);
for(int i=0;ia[k][col[h]])
flag=0;
}
if(flag)//如果是鞍点,则记录
++h;
}
if(h==0)
printf("不存在鞍点\n");
else{
printf("共有%d个鞍点:\n",h);
for(int i=0;i
void copy(char *s1,char *s2,int k){
int i=k-1,j=0;
while(*(s1+i)!='\0'){
*(s2+j)=*(s1+i);
++i;
++j;
}
*(s2+j)='\0';//别忘了这一句,‘\0’是字符串结束的标志
}
int main(){
char s1[100],s2[100];
int k;
gets(s1);//不能用%s
scanf("%d",&k);
copy(s1,s2,k);
printf("%s\n",s2);
return 0;
}
2016
//2016编程第一题
#include
int main(){
int n;
int sum=0,k=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int temp=1;
for(int j=1;j<=i;j++){
k++;
temp*=k;
}
sum+=temp;
}
printf("前%d项之和:%d\n",n,sum);
return 0;
}
//2016编程第三题
#include
int search_ch(char s[],char ch){
int i=0;
while(s[i]!='\0'){
if(s[i]==ch)
return i+1;
++i;
}
return 0;
}
int main(){
char str[100];
char target;
int location;
//scanf("%s",str);//%s遇到空格或换行符则结束
gets(str);
scanf("%c",&target);
location = search_ch(str,target);
if(location==0)
printf("字符串%s不含字符:%c\n",str,target);
else
printf("%c在%s中首次出现的位置是:%d",target,str,location);
return 0;
}
C语言练习
//最大公约数,最小公倍数
#include
int gcd(int a,int b){
int temp;
if(a
// f[0]=1,f[1]=1,f[n]=f[n-1]+f[n-2]
void fab(int *f,int i){//f[]仅仅是数组的copy
if(i==11)
return ;
else{
//*(f+i)=f[i-1]+f[i-2];
f[i]=f[i-1]+f[i-2];
fab(f,i+1);
}
}
int main(){
int f[100];
int n;
f[0]=0;
f[1]=1;
fab(f,2);
scanf("%d",&n);
printf("%d\n",f[n]);
return 0;
}
//今天是今年的第几天
//能被4整除但不能被100整除,或能被400整除的年份即为闰年
#include
int main(){
int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int year,month,day;
int sum=0;//记录总天数
scanf("%d%d%d",&year,&month,&day);
for(int i=1;i
#include
int strcmp1(char *s1,char *s2){
int len1=strlen(s1);
int len2=strlen(s2);
int len=len1*(s2+i))
return 1;
if(*(s1+i)<*(s2+i))
return -1;
++i;
}
return 0;
}
int main(){
char s1[100],s2[100];
gets(s1);
gets(s2);
printf("%d\n",strcmp1(s1,s2));
return 0;
}
//打印杨辉三角
/*
a[0][0]=1
a[1][0]=1 a[1][1]=1
a[2][0]=1 a[2][1]=a[1][0]+a[1][1] a[2][2]=1
1
1 1
1 2 1
1 3 3 1
*/
#include
#include
int main(){
int a[100][100];
a[0][0]=1;
for(int i=1;i<=9;i++){
for(int j=0;j<=i;j++){
if(j==0||j==i)
a[i][j]=1;
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(int i=0;i<=9;i++){
for(int j=0;j<=i;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
//冒泡排序
#include
#include
int main(){
int a[100];
int n;
scanf("%d",&n);
for(int i=0;i0;--i){//比较n-1轮
for(int j=0;ja[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(int i=0;i
int main(){
for(int i=1;i<=1000;++i){
int sum=0;
for(int j=1;j<=i/2;++j){
if(i%j==0)
sum+=j;
}
if(sum==i)
printf("%d ",i);
}
return 0;
}
//统计单词
#include
int main(){
char str[100];
gets(str);
int i=0;
int count=0;
//第一个单词之前没有空格,单词与单词之间可以有多个空格
while(str[i]!='\0'){
while((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
++i;
while(str[i]==' ')
++i;
++count;
}
printf("单词个数:%d\n",count);
return 0;
}
//鞍点
#include
#define N 10
int main(){
int a[N][N];
int row[N],col[N];
int m,n;
scanf("%d%d",&m,&n);
for(int i=0;ia[k][col[h]])
flag=0;
}
if(flag)//如果是鞍点,则记录
++h;
}
if(h==0)
printf("不存在鞍点\n");
else{
printf("共有%d个鞍点:\n",h);
for(int i=0;i