电子科技大学820计算机复试自己编写C复试答案.docx
《电子科技大学820计算机复试自己编写C复试答案.docx》由会员分享,可在线阅读,更多相关《电子科技大学820计算机复试自己编写C复试答案.docx(38页珍藏版)》请在冰豆网上搜索。
![电子科技大学820计算机复试自己编写C复试答案.docx](https://file1.bdocx.com/fileroot1/2023-1/5/57cd78da-b82b-4f81-9e58-d5d0bde4abb5/57cd78da-b82b-4f81-9e58-d5d0bde4abb51.gif)
电子科技大学820计算机复试自己编写C复试答案
1、单链表逆序(考频:
5次)——不用输入就在函数生成
函数生成数据如下:
Head=malloc(sizeof(structLNode));
Head->next=NULL;
For(i=5;i>=0;i--)
{
P=malloc(sizeof(structLNode));
P->val=i;
P->next=head->next;
Head->next=p;//头插法建立数据
}
#include
#include
structLNode
{
intval;
structLNode*next;
}LNode[5]={{1,NULL},{2,NULL},{3,NULL},{4,NULL},{5,NULL}};
//建立单链表
voidreverse(structLNode*Head)
{
structLNode*p,*q;
p=Head->next;
Head->next=NULL;
while(p)//注意这里,重点在这里!
{
q=p->next;
p->next=Head->next;
Head->next=p;
p=q;
}
p=Head->next;
while(p)
{
printf("%-4d",p->val);
p=p->next;
}
printf("\n");
}
voidmain()
{
inti,e,n;
structLNode*p,*Head,*q;
Head=(structLNode*)malloc(sizeof(structLNode));
p=Head;
printf("输入建立单链表所需的整数个数:
");
scanf("%d",&n);
printf("输入%d个数据,以回车键隔开:
\n",n);
for(i=0;i{
q=(structLNode*)malloc(sizeof(structLNode));
scanf("%d",&e);
q->val=e;
p->next=q;
p=q;
}
p->next=NULL;//至关重要的一步!
!
!
p=Head->next;
printf("建立单链表的结果如下\n");
while(p)
{
printf("%-4d",p->val);
p=p->next;
}
printf("\n");
/*for(i=0;i<5;i++)
{
printf("%-7d",LNode[i].val);
}
printf("\n");
*/
printf("单链表逆序结果如下:
\n");
reverse(Head);
}
2、计算1-x+x^2/2!
-x^3/3!
+...+x^n/n!
,x是单浮点数,n是整数(考频:
3次)
#include
voidmain()
{
intj,n,flag=-1;
floatx,sum1=1,sum2=1,sum=1;
printf("请输入求和用到的x和n,用英文逗号隔开\n");
scanf("%f,%d",&x,&n);
if(n==0)//等于和赋值弄错了!
!
!
{
printf("求和的值为1.0\n");
return;
}
for(j=1;j<=n;j++)
{
sum1*=x;
sum2*=j;
sum+=flag*(sum1/sum2);
flag=-flag;
}
printf("求和的值=%f\n\n",sum);
}
3、数质因数分解(考频:
2次)
#include
#defineN20
intisPrime(intn)
{
inti=2;
while(n%i!
=0)
i++;
if(i==n)
return1;
else
return0;
}
voidmain()
{
intnum,i,a[N],j=-1;
printf("请输入需要分解的正整数:
\n");
scanf("%d",&num);
printf("%d=",num);
if(num<=0)
{
printf("输入数据错误!
请重新输入!
\n");
return;
}
while(num>=4)
{
for(i=2;i<=num;i++)
{
if(num%i==0&&isPrime(i))
{
a[++j]=i;
num/=i;
break;
}
}
}
if(num>1)
{
a[++j]=num;
}
for(i=0;i<=j;i++)
{
printf("%d",a[i]);
if(iprintf("*");
}
printf("\n");
}
4、字符串逆序,不申请新的数组空间
#include
#include
#defineN100
voidreverse(charstr[])
{
intlen,i;
chartemp;
len=strlen(str);
for(i=0;i<(len/2);i++)//次数这里出错,相当于没有交换
{
temp=str[i];
str[i]=str[len-i-1];
str[len-i-1]=temp;
}
//str[i]='\0';结束符一直在
}
voidmain()
{
charstr[N],*res;
printf("请输入字符串:
\n");
scanf("%s",str);
reverse(str);
printf("逆序的结果如下:
\n%s\n",str);
}
5、file1的容全部复制到file2中,且在file2的每一行都要加上行号,最后返回file1中的字符个数。
#include
#include
/*
voidmain()
{
FILE*fp1,*fp2;
fp1=fopen("c:
\\1.txt","r");//重要,不存在不会创建新文件!
!
!
if(fp1!
=NULL)
printf("成功打开\n");
}
*/
/*
#defineMAX1000
voidmain()
{
FILE*fp1,*fp2;
charc='\n';
fp1=fopen("1.txt","r");
fp2=fopen("2.txt","w");
while(!
feof(fp1))
{
chartemp[MAX];
fgets(temp,MAX,fp1);//每次都读到换行符结束,换行符算一位,字符串最后面一定是'\0',有换行符则加在'\0'前面,'\n'==10==换行符
fputs(temp,fp2);
}
fclose(fp1);
fclose(fp2);
}*/
voidmain()
{
FILE*fp1,*fp2;
chartemp;
intcounts=0,row=1;
fp1=fopen("file1.txt","r");
fp2=fopen("file2.txt","w+");
while(!
feof(fp1))
{
temp=fgetc(fp1);
if(temp!
=32&&temp!
='\n'&&temp!
=EOF)//32代表'',10代表'\n'
{
++counts;
}
if(temp!
='\n')
{
fputc(temp,fp2);
}
else
{
fprintf(fp2,"行号为:
%d",row++);
fprintf(fp2,"\n");
}
}
fprintf(fp2,"行号为:
%d",row);
fclose(fp1);
fclose(fp2);
printf("file1.doc文件中的字符总数为:
%d\n",counts);
}
5、分数四则运算
#include
longgcd(longm,longn)
{
while(n)
{
longt=m%n;
m=n;
n=t;
}
returnm;
}
voidcount(charflag,longup1,longup2,longdown1,longdown2)
{
longt;
switch(flag)
{
case'+':
up1=up1*down2+up2*down1;
down1=down1*down2;
break;
case'-':
up1=up1*down2-up2*down1;
down1=down1*down2;
break;
case'*':
up1=up1*up2;
down1=down1*down2;
break;
case'/':
up1=up1*down2;
down2=down1*up2;
break;
}
t=gcd(up1,down1);
if(up1==down1)
printf("1\n");
else
printf("%d/%d\n",up1/t,down1/t);
}
intmain()
{
longup1,up2,down1,down2;
charflag;
printf("请输入两个正分数\n");
while(~scanf("%ld/%ld%c%ld/%ld",&up1,&down1,&flag,&up2,&down2))
{
count(flag,up1,up2,down1,down2);
}
return0;
}
7、编写一个函数,使之能完成以下功能:
利用递归方法找出一个数组中的最大值和最小值,要求递归调用函数的格式如下:
MinMaxValue(arr,n,&max,&min),其中arr是给定的数组,n是数组的个数,max、min分别是最大值和最小值。
#include"stdio.h"
#defineN10
voidMinMaxValue(intarr[],intn,int*max,int*min)
{
if(n>=0)
{
if(*max*max=arr[n];
if(*min>arr[n])
*min=arr[n];
MinMaxValue(arr,n-1,max,min);
}
}
intmain()
{
intmax=-32768,min=32767;
inta[]={1,54,23,65,87,12,54,87,98,233};
MinMaxValue(a,N-1,&max,&min);
printf("Max=%d,Min=%d\n",max,min);
return0;
}
8、编写一个完整的程序,使之能完成以下功能:
一段名为file.c的程序,该程序中含有括号,现要检查程序中的括号是否配对,提示:
利用堆栈实现。
(15分)
#include
#defineStackchar
#defineMax999
intjudge(charp[])
{
intlen=strlen(p);
inttop=-1,i;
Stacks[Max];
for(i=0;i{
switch(p[i])
{
case'(':
case'[':
case'{':
s[++top]=p[i];//只要是左括号就放进去
break;
case')':
if(s[top]=='(')
top--;
elsereturn0;
break;
case']':
if(s[top]=='[')
top--;
elsereturn0;
break;
case'}':
if(s[top]=='{')
top--;
elsereturn0;
break;
}
}
if(top==-1)
return1;
else
return0;
}
voidmain()
{
charp[Max];
FILE*fin;
if(!
(fin=fopen("file.txt","r")))
printf("failed");
while(!
feof(fin))
{
fscanf(fin,"%s",p);
}
printf("%d\n",judge(p));
fclose(fin);
}
9、统计字符串中的数字字符次数,字符串仅由数字字符构成
#include
voidmain()
{
chartemp[50];
char*str;
inti,counts[10]={0};
printf("请输入长度不超过50的字符串(只含有数字字符):
\n");
str=temp;
scanf("%s",str);
for(i=0;i<50;i++)
{
counts[str[i]-'0']++;
}
for(i=0;i<10;i++)
printf("数字%d出现的次数--------%d\n",i,counts[i]);
}
10、利用结构数组和指向结构的指针,输出学生最低、最高成绩以及相应的学号(若有相同的分数,要输出多个学号)
#include
#defineN10
structstudent
{
intnum;
intscore;
}student_info[100],*pS;
voidmain()
{
inti,max,min;
printf("请输入学生学号和成绩,以逗号进行隔开\n");
for(i=0;i{
scanf("%d,%d",&(student_info[i].num),&(student_info[i].score));
}
max=min=student_info[0].score;
pS=student_info+1;
for(i=1;i{
if(pS->score>max)
max=pS->score;
if(pS->scoremin=pS->score;
}
//printf("最高分为%d,最低分为%d\n",max,min);
pS=student_info;
for(i=0;i{
if(pS->score==max)//又把等号弄错了
printf("最高分为%d,学号为%d\n",pS->score,pS->num);
}
pS=student_info;
for(i=0;i{
if(pS->score==min)
printf("最低分为%d,学号为%d\n",pS->score,pS->num);
}
}
11、删除输入的字符串中的大小写字母和数字,并统计有重复的字符及其重复次数
#include
#include
structcharInfo{
charval;
intcount;
}strInfo[100];
intdelChar(char*str,charc)
{
inti=0,count=0;
//len=strlen(str);不算结束符
while(str[i]!
='\0')
{
if(str[i]==c)
{
memcpy(&str[i],&str[i+1],strlen(&str[i+1])+1);
++count;
}
else
++i;
}
returncount;
}
voidmain()
{
char*str,temp[1000];
inti;
str=temp;
for(i=0;i<10;i++)
{
strInfo[i].val='0'+i;
strInfo[i].count=0;
}
for(i=0;i<26;i++)
{
strInfo[i+10].val='A'+i;
strInfo[i].count=0;
}
for(i=0;i<26;i++)
{
strInfo[i+36].val='a'+i;
strInfo[i].count=0;
}
scanf("%s",str);//str本来就是地址
for(i=0;i<62;i++)
{
strInfo[i].count=delChar(str,strInfo[i].val);
}
printf("\n\nresult=%s\n\n\n",str);
for(i=0;i<62;i++)
{
printf("%c出现次数%d\n",strInfo[i].val,strInfo[i].count);
}
printf("\n\n");
}
12、小括号匹配
#include
#defineMAX100
typedefintBOOL;//注意这个分号,bool是c++独有的
#definetrue1
#definefalse0
BOOLIsPair(FILE*fp)
{
charSTACK[MAX],temp;
inttop=-1;
while(!
feof(fp))
{
temp=fgetc(fp);
if(temp=='(')
STACK[++top]=temp;
if(temp==')')
{
if(STACK[top]=='(')
--top;
else
returnfalse;
}
}
if(top==-1)
returntrue;
else
returnfalse;
}
voidmain()
{
FILE*fp;
fp=fopen("file.txt","r");
if(IsPair(fp))
printf("配对成功!
\n");
else
printf("配对失败!
\n");
}
13、生日大小比较
#include
intcmpBirth(char*st1,char*st2)
{
inti;
for(i=0;i<8;i++)
{
if(*st1&&*st2&&(*st1==*st2))
{
++st1;
++st2;
}
elseif(*st1-*st2>0)
return1;
else
return0;
}
}
voidmain()
{
charstr1[20],str2[20];
char*st1,*st2;
printf("请输入要进行对比的两个,以回车键进行隔开\n");
scanf("%s",str1);
scanf("%s",str2);
if(cmpBirth(str1+6,str2+6))
printf("第二个人年龄更大一些\n");
else
printf("第一个人年龄更大一些\n");
}
简洁版答案
intisbothsame(charstr1[19],charstr2[19])
{
intlow=6,hight=13;
while(lowreturnstr1[low]-str2[low];
}
14、移动链表最大结点至尾部
#include
#include
structLNode
{
intdata;
structLNode*next;
};
structLNode*CreateLinklist()
{
structLNode*p,*Head,*q;
intn,i;
Head=(structLNode*)malloc(sizeof(structLNode));
Head->next=NULL;
printf("请输入链表结点个数\n");
scanf("%d",&n);
q=Head;
printf("输入数据\n");
for(i=0;i{
p=(structLNode*)malloc(sizeof(structLNode));
scanf("%d",&(p->data));
q->next=p;
q=p;
}
q->next=NULL;
printf("输入的链表如下所示\n");
p=Head->next;
while(p)
{
printf("%-4d",p->data);
p=p->next;
}
returnHead;
}
voidLNodeFind(structLNode*Linklist)
{
structLNode*p=Linklist->next,*q,*r;
intmax=p->data,counts=0,flag=1;
p=p->next;
while(p)
{
if(p->data>=max)
{
max=p->data;
++counts;
}
p=p->next;
}
while(counts)
{
p=Linklist->next;
q=Linklist;
flag=1;//利用flag控制不