C语言题库补充题答案doc.docx
《C语言题库补充题答案doc.docx》由会员分享,可在线阅读,更多相关《C语言题库补充题答案doc.docx(34页珍藏版)》请在冰豆网上搜索。
![C语言题库补充题答案doc.docx](https://file1.bdocx.com/fileroot1/2023-1/10/105467c6-35f5-4639-b1d0-c26d0f613fe1/105467c6-35f5-4639-b1d0-c26d0f613fe11.gif)
C语言题库补充题答案doc
C语言程序设计
题库
补充题参考答案
注:
所附答案仅为参考答案,程序中cin和cout为C++语言中的输入输出语句,在C语言中可用scanf和printf语句替换。
第二部分:
补充
1.输入一个5行5列的二维数组,编程实现:
(1)求出其中的最大值和最小值及其对应的
行列位置;
(2)求出上三角各元素之和。
voidfindmaxmin(floatarrary[5][5]);〃求最大值和最小值及其对应的行列位置
floatupright(floatarrary⑸[5]);//求上三角上各元素之和(上三角的元素a[i]fj],i+j<5)voidmain()
{
floatarrary[5][5];
printf("pleaseinputarrary:
\n");
for(inti=0;iv5;i++)〃输入一个5行5列的二维数组
{
fbr(intj=O;j<5;j++)
{
Scanf(u%f,&airaTy[i][j]);
}
}findmaxmin(arrary);//^最大值和最小值及其对应的行列位置printf("_t三角各元素之和为:
%f\n",upright(arrary));//^<上三角上各元素之和
}
voidfindmaxmin(floatarrary⑸[5])//求最大值及其对应的行列位置
{
inti,j,maxrow=0,maxcolum=0,mainrow=0,mincolum=0;
floatmax,min;
max=arrary[0][0];
min=arrary[0][0];
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(arrary[i][j]>max)
{
max=arrary[i][j];maxrow=i;
maxcolum=j;
}
if(arrary[i][j]{
min=arrary[i][j];
minrow=i;
mincolum^j;
}
}
printf("max=%htmaxrow=%d\tmaxcolum=%d\n",max,maxrow,maxcolum);printf(}
floatupright(floatarrary⑸[5])//求上三角上各元素之和
{
floatsum=0;
inti,j;
for(i=0;i<5;i卄)
{
for(j=i;j<5;j++)
{
sum=sum+arrary[i][j];
}
returnsum;
}
2.编写程序实现求e54的幕级数。
x和n的值从键盘输入。
xXx2xn
e=1+—+——++——
1!
2!
n\
doubleex(intn,doublex);
longfac(intn);
doublefxi(inti);
voidmain()
{
intn;
doublex;
print("pleaseinputn,x\nH);scanf(“%d%f',&n,&x);printf("%fex(n,x));
}
doublefxi(intm)〃求x的n次方
{
doublefx=l;
for(inti=0;i<=m;i++)
{
fx=fx*i;
}
returnfx;
}
longfac(intn)〃求n!
{
longf;
辻(n<0)
{
printf("n<0,dataerror!
\n");
f=-l;
}
elseif(n==0lln==l)
{
f=l;
}
else
{
f=fac(n-l)*n;
}
returnf;
}
doubleex(intn,doublex)
{
inti;
doublefex=0;
for(i=0;i<=n;i++)
{
fex=fex+fxi(i)/fac(i);
}returnfex;
}
3.从键盘输入50个学生信息,对学生按成绩进行由小到大排序,并输出排序后学生信息,学生信息结构如下:
structstudent
{
charname[10];
intnum;
floatscore;
};
voidinput(studentstu[50])//学生信息的输入
{
inti;
printf("pleaseinputstudentsinfo:
\n*');
for(i=0;i<50;i++)
{
scanf(<<%s%d%f,,&stu[i].name,&stu[i].num,&stu[i].score);
}
}
voidsort(studentstu[50])//按成绩有小到大排序
{
inti,j;
studentstudtemp;
for(i=0;i<50-l;i++)
{
for(j=0;j<50-j-l;j++)
{
if(stu[i].score>stu[i+1].score)
{
strcpy(studtemp.name,stu[i].name);studtemp.num=stu[i].num;studtemp.score=stu[i].score;
strcpy(stu[i].name,stu[i+1].name);
stu[i].num=stu[i+1].num;
stu[i].score=stu[i+1].score;
strcpy(stu[i+1].name,studtemp.name);
stu[i+l].num=studtemp.num;
stu[i+l].score=studtemp.score;
voidoutput(studentstu[50])
{
inti;
for(i=0;i<50;i++)
{
printf(4t%s%d%f\n,,,stu[i].name,stu[i].num,stu[i].score);
4.从键盘输入4个字符串,编程求出它们中最小的一个。
voidmain()
{
charstring[20];
charstr[4][20];inti;
fbr(i=0;i<4;i++)
{
gets(str[i]);
}
strcpy(string,str[O]);
for(i=1;i<4;i++)
{
if(strcmp(string,str[i])>0)
{
strcpy(string,str[i]);
}
}
printf("minstring=%f\n",string);
5.从键盘输入一个长度为n的字符串,编程实现其逆序输出。
voidmain()
{
charstr[100];
inti,len=0;
printf(\n‘‘);
gets(str);
for(i=O;str[i]!
=,\O,;i++)
{
len++;
}
for(len=len-l;len>=0;len—)
{
printf(tt%c,,,str[len]);
}
6.求下列式子之和,假定n=10
S=1+(1+2)+(1+2+3)++(1+2+3++n)
longsum(intn)〃求]+2+...+n之和
{
longsumtemp=0;
for(inti=l;i<=n;i++)
{
sumtemp=sumtemp+i;
}
returnsumtemp;
}
voidmain()
{
intn;
longS=0;
scanf(“%(f',&n);
for(inti=l;i<=n;i++)
{
S=S+sum(i);
}
printf(<<%ld\n,,,S);
}
7.编程实现:
求某字符串中前n个字符中的最大字符。
要求:
字符串和n均由键盘键入。
charmax(stringstr,intn)〃求出字符串str中前n个字符中的最大字符
{
charch;
ch=str[O];
for(inti=l;i{
if(str[i]>ch)
{
ch=str[i];
)
}
returnch;
}
voidmain()
{
charstr[100];
intn;
printf("pleaseinputastring:
*'\n);
gets(str);
printf("pleaseinputanumbern:
\nH);
scanf(“%d'',&n);
printf("Themaxchar:
%c\n",max(str,n));
8.编程计算从键盘输入的字符串中子串“XY”出现的次数。
intCounter(charsorcstr[],chardeststr[2],intn);〃统计子字符串deststr在字符串sorcstr中出现的次数voidmain()
{
charstr[100];
charsubstr[2];
intlen;
printf("pleaseinputastring:
\nH);
gets(str);
len=strlen(str);
printf("pleaseinputasubstringAn");
scanf("%s",substr);
printf("count(%c%c)=%d\nn,substr[0],substr[l],Counter(str,substr,len));
}
intCounter(charsorcstr[],chardeststr[2],intn)
{
intcount=0;//iB录deststr子字符串出现的次数
inti;
for(i=0;i{
if(sorcstr[i]==deststr[0]&&sorcstr[i+1]==deststr[1])
{
count=count+1;
)
}
returncount;
}
222
9.勾股数就是满足*+*='的自然数,打印出50以内的所有勾股数。
voidmain()
{
intx,y,z;
for(x=1;x<=50;x++)
{
for(y=x+l;y<=50;y++)
{
for(z=2;z<=50;z++)
{
if(x*x+y*y==z*z)
{
printf(n(%d,%d,%d)\n,?
x,y,z);
10•利用卡尔丹公式计算三次方程%3+^+^=°的一个实根。
卡尔丹公式:
voidmain()
floatp,q,xl,x2,x;
printf(^^请输入p,q值\n”);
scanf(“%f%f',&p,&q);
xl=(-q/2+((p/2)*(p/2)+(q/3)*(q/3)*(q/3))/2)/3;x2=(-q/2-((q/2)*(q/2)+(p/3)*(p/3)*(p/3)"2)/3;x=xl+x2;
printf(“x=%f”,x);
11.编写程序实现从键盘输入字符串,当遇到"时结束输入,并将输入的字符按倒序输出。
voidmain()
{
charstring[100];
inti=0;
printf(\n‘‘);
while(l)
{
scanf(“%c",&string[i]);
if(srting[i]==,i,)
{
break;
}
else
{i++;}
}
len=strlen(string);
for(;len>=0;len—)
printf(''%c”,string[len]);
}
12.编写程序计算下面函数的值。
?
?
=0
n=1
n>1
1
fn(x)=<*
(2“_1)*X*尢_1(*)_(“_1)*兀_2(工)
voidmain()
{
intx,n;
floatp(int,int);
printf("inputn&x:
H);
scanf(t4%d%d,&n,&x);
printf("n=%d,x=%d\n",n,x);
printf("P%d(x)=\n",n,p(n,x));
}
floatp(intn,intx)
{if(n==0)
return(l);
elseif(n==l)
return(x);
else
return(((2*n-l)*x*p((n-l),x)-(n-l)*p((n-2),x))/n);
}
13.某公司选领导,现有3个侯选人,有50位选民。
请设计一个程序,计算选票,选出胜利者,并打印出他们的选票数。
structPerson〃声明结构体类型Person
{
charname[20];
intcount;
};
voidmain()
{
Personleader[3]={nLin,0,"Zhang",0,nFunn,0};
〃定义Person类型的数组,内容为3个候选人的姓名和当前的得票数
inti,j;
charleader_name[20];//leader_name为投票人所选的人的姓名for(i=0;i<50;i++)
{cin»leader_name;//先后输入50张票上所写的姓名for(j=0;j<3;j++)〃将票上姓名与3个候选人的姓名比较
{
if(strcmp(leader_name,leader[j].name)==O)
{
leader[j].count++;〃如果与某一候选人的姓名相同,就给他加一票
}
}
}
cout«endl;
for(i=0;i<3;i++)〃输出3个候选人的姓名与最后得票数
{cout«leader[i].name«":
"«leader[i].count«endl;
}
return0;
14.有两个5*5的矩阵,编程求出它们的和与积。
voidmain()
{
floatArraryA[5][5],ArraryB⑸[5];
floatMui⑸[5]={0},Sum[5]⑸;
inti,j,k;
〃输入数组A的数据
printf("pleaseinputArraryAAn");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
scanf(“%f',&ArraryA[i][j]);
}
}
〃输入数组B的数据
printf("pleaseinputArraryBAn");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
scanf(“%f',&ArraryB[i][j]);
}
〃计算ArraryXArraryB
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
for(k=0;k<5;k++)
{
Mul[i][j]+=ArraryA[i][k]*ArraryB[k][j];
}
}
}
〃输出积的结果
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printfC'%f\t”,Mul[i][j]);
}
printf(“\n”);
}
〃计算Arrary+ArraryB
for(i=0;i<5;i++)
{
for(j=0;j<5;j卄)
{
Sum[i][j]+=ArraryA[i][j]*ArraryB[i][j];
}
}
〃输出和的结果
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf(“%f\t”,Sum[i][j]);
}
printf(“\n”);
}
15.一个班级有30名学生,学生信息包括:
学号、姓名,每个学生有5门功课,请利用有关指针的知识,编写一程序计算每个学生的的平均成绩,并找出总成绩最高的学生并打印其学号。
structstudent
{
intnum;//学号
charname[20];〃姓名
floatscore[5];//5门课程成绩
floatavescore;//平均成绩
};
voidinput(studentstu[30]);〃输入学生信息
voidaverscor(studentstu[]);//计算平均成绩
voidtopsum(studentstu[]);〃计算总成绩,并输出总成绩最高的学生信息voidmain()
{
studentstu[30];
printf("pleaseinput30students'sinfo:
\nH);input(stu);〃输入学生信息averscor(stu);〃计算每个学生的平均成绩topsum(stu);//计算总成绩
return0;
}
voidinput(studentstu[30])〃输入学生信息
{
student*p=stu;
inti,j;
for(i=0;i<30;i++,p++){
printf("pleaseinputstudent[%d]numandname”,i);scanf("%d%s",&(p->num),&(p->name));
printf("pleaseinputstudent[%d]3cource'sscore:
\nH,i);for(j=0;j<5;j++)
{
scanf(tt%f,,&p->score[j]);
}
}
}
voidaverscor(studentstu[])〃计算平均成绩
{
student*p=stu;
floattemp;
inti,j;for(i=0;iv30;i++,p++)
temp=O;
for(j=0;j<5;j++)
{temp=temp+p->score[j];
}
p->avescore=temp/5;
}
}
voidtopsum(studentstu[])〃计算总成绩,并输出总成绩最高的学生信息{
student*p=stu;
floattemp[30];
inti,j;
floattempt;
for(i=0;i<30;i++,p++)〃计算总成绩,并存放于temp数组中
{
temp[i]=0;
for(j=0;j<5;j++)
{
temp[i]=temp[i]+p->score[j];
}
}
〃查找总成绩最高的学生并输出
tempt=temp[0];
j=0;
for(i=l;i<30;i++)
{
if(temp[i]>tempt)
{
tempt=temp[i];
j=i;
}
}
printf("总成绩最高的学生是\n");
printf("no:
%d\tname:
%s\n",stu[j].num,stu[j].name);
}
16.建立带头结点的单链表,从键盘输入一个数,若链表中无该数,则在链表尾插入新结点,
当输入数据为0时,则停止建立链表,并打印该链表所有结点的信息。
结点类型如下:
structnode
{
intdata;
structnode*next;
};
#include
node*creat(void)〃定义函数。
{
node*head;
node*p],*p2;
intn=0;
pl=p2=(structnode*)malloc(sizeof(structnode));〃开辟一个新单元,并使pl,p2指向它
printfC'请输入一个数据:
\nH);
scanf("%dH,pl->data);
head=NULL;
while((*pl).data!
=0)
{
n=n+1;
if(n==l)
{
head=pl;
}
else
{
p2->next=pl;
}
p2=pl;
p1=(structnode*)malloc(sizeof(structnode));
printf(”请输入一个数据:
\nn);
scanf("%d",pl->data);
}
p2->next=NULL;
returnhead;
}
voidprintchain(node*p)//〃查找节点并打印信息
node*pl;if(p==NULL)//是空表printf("listnull!
\n");
}
P1=P;while(pl!
=NULL)//pl指向的不是所要找的结点且后面还有结点{
printf("%d\t",pl->data);pl=pl->next;
}//pl后移一个结点
}
voidmain()
{
node*p;
p=cwat();〃创建链表printchain(p);〃查找节点并打印信息
}
17.建立一个学生的结构体,学生信息包括:
学号、姓名、三门功课成绩(politic>maths>english),建立一个有30个成员的结构体数组,从键盘输入学号进行查询,当查找到该学号时,显示该生所有信息,否则显示“无此学生雹
structstudent
{
intsno;
charname[20];
floatscore[3];
};
voidmain()
{
studentstu[30];
intsno;
〃输入30个成员的数据
input(stu);
〃按学号查找学生并显示信息
printf("输入要查找的学生的学号:
\n");
scanf(<<%d,,,&sno);
search(stu,sno);
}
voidinput(studentstu[30])〃输入30个成员的数据
inti,j;
printf(”输入30个学生的信息:
学号、姓名、三门课程成绩\n”);
for(i=0;i<30;i++)
{
scanf("%d%s",&stu[i].sno,&stu[i].name);
for(j=0;j<3;j++)
{
scanf(4t%f\&stu[i].score[j]);
}
}
}
voidsearch(studentstu[30],intno)//按学号查找学生并显示信息
{
inti,j;
boolflag=l;
for(i=0;i<30;i++)
{
if(stu[i].sno==no)
{
flag=0;
printf(''%d\t%s\t",stu[i].sno,stu[i].name);
for(j=0;j<3;j++)
{
printf("%f,,stu[