C典型题目.docx
《C典型题目.docx》由会员分享,可在线阅读,更多相关《C典型题目.docx(43页珍藏版)》请在冰点文库上搜索。
C典型题目
C典型题目
1.输入一个5行5列的二维数组,编程实现:
(1)求出其中的最大值和最小值及其对应的行列位置;
(2)求出上三角各元素之和。
voidfindmaxmin(floatarrary[5][5]);//求最大值和最小值及其对应的行列位置
floatupright(floatarrary[5][5]);//求上三角上各元素之和(上三角的元素a[i][j],i+j<5)
voidmain()
{
floatarrary[5][5];
printf("pleaseinputarrary:
\n");
for(inti=0;i<5;i++)//输入一个5行5列的二维数组
{
for(intj=0;j<5;j++)
{
Scanf(“%f”&arrary[i][j]);
}
}
findmaxmin(arrary);//求最大值和最小值及其对应的行列位置
printf("上三角各元素之和为:
%f\n",upright(arrary));//求上三角上各元素之和
}
voidfindmaxmin(floatarrary[5][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=%f\tmaxrow=%d\tmaxcolum=%d\n",max,maxrow,maxcolum);
printf(“min=%f\tminrow=%d\tmincolum=%d\n",min,minrow,mincolum);
}
floatupright(floatarrary[5][5])//求上三角上各元素之和
{
floatsum=0;
inti,j;
for(i=0;i<5;i++)
{
for(j=i;j<5;j++)
{
sum=sum+arrary[i][j];
}
returnsum;
}
}
2.编写程序实现求ex的幂级数。
x和n的值从键盘输入。
doubleex(intn,doublex);
longfac(intn);
doublefxi(inti);
voidmain()
{
intn;
doublex;
print("pleaseinputn,x\n");
scanf(“%d%f”,&n,&x);
printf(“%f”,ex(n,x));
}
doublefxi(intm)//求x的n次方
{
doublefx=1;
for(inti=0;i<=m;i++)
{
fx=fx*i;
}
returnfx;
}
longfac(intn)//求n!
{
longf;
if(n<0)
{
printf("n<0,dataerror!
\n");
f=-1;
}
elseif(n==0||n==1)
{
f=1;
}
else
{
f=fac(n-1)*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-1;i++)
{
for(j=0;j<50-j-1;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+1].num=studtemp.num;
stu[i+1].score=studtemp.score;
}
}
}
}
voidoutput(studentstu[50])
{
inti;
for(i=0;i<50;i++)
{
printf(“%s%d%f\n”,stu[i].name,stu[i].num,stu[i].score);
}
}
4.从键盘输入4个字符串,编程求出它们中最小的一个。
voidmain()
{
charstring[20];
charstr[4][20];
inti;
for(i=0;i<4;i++)
{
gets(str[i]);
}
strcpy(string,str[0]);
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(“inputastring:
\n”);
gets(str);
for(i=0;str[i]!
=’\0’;i++)
{
len++;
}
for(len=len-1;len>=0;len--)
{
printf(“%c”,str[len]);
}
}
6.求下列式子之和,假定n=10
S=1+(1+2)+(1+2+3)+……+(1+2+3+……+n)
longsum(intn)//求1+2+...+n之和
{
longsumtemp=0;
for(inti=1;i<=n;i++)
{
sumtemp=sumtemp+i;
}
returnsumtemp;
}
voidmain()
{
intn;
longS=0;
scanf(“%d”,&n);
for(inti=1;i<=n;i++)
{
S=S+sum(i);
}
printf(“%ld\n”,S);
}
7.编程实现:
求某字符串中前n个字符中的最大字符。
要求:
字符串和n均由键盘键入。
charmax(stringstr,intn)//求出字符串str中前n个字符中的最大字符
{
charch;
ch=str[0];
for(inti=1;i{
if(str[i]>ch)
{
ch=str[i];
}
}
returnch;
}
voidmain()
{
charstr[100];
intn;
printf("pleaseinputastring:
"\n);
gets(str);
printf("pleaseinputanumbern:
\n");
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:
\n");
gets(str);
len=strlen(str);
printf("pleaseinputasubstring:
\n");
scanf(“%s”,substr);
printf("count(%c%c)=%d\n",substr[0],substr[1],Counter(str,substr,len));
}
intCounter(charsorcstr[],chardeststr[2],intn)
{
intcount=0;//记录deststr子字符串出现的次数
inti;
for(i=0;i{
if(sorcstr[i]==deststr[0]&&sorcstr[i+1]==deststr[1])
{
count=count+1;
}
}
returncount;
}
9.勾股数就是满足
的自然数,打印出50以内的所有勾股数。
voidmain()
{
intx,y,z;
for(x=1;x<=50;x++)
{
for(y=x+1;y<=50;y++)
{
for(z=2;z<=50;z++)
{
if(x*x+y*y==z*z)
{
printf("(%d,%d,%d)\n”,x,y,z);
}
}
}
}
}
10.利用卡尔丹公式计算三次方程
的一个实根。
卡尔丹公式:
voidmain()
{
floatp,q,x1,x2,x;
printf(”请输入p,q值\n”);
scanf(“%f%f”,&p,&q);
x1=(-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=x1+x2;
printf(“x=%f”,x);
}
11.编写程序实现从键盘输入字符串,当遇到“!
”时结束输入,并将输入的字符按倒序输出。
voidmain()
{
charstring[100];
inti=0;
printf(“inputastring:
\n”);
while
(1)
{
scanf(“%c”,&string[i]);
if(srting[i]==’!
’)
{
break;
}
else
{i++;}
}
len=strlen(string);
for(;len>=0;len--)
{
printf(“%c”,string[len]);
}
}
12.编写程序计算下面函数的值。
voidmain()
{
intx,n;
floatp(int,int);
printf("inputn&x:
");
scanf(“%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
(1);
elseif(n==1)
return(x);
else
return(((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n);
}
13.某公司选领导,现有3个侯选人,有50位选民。
请设计一个程序,计算选票,选出胜利者,并打印出他们的选票数。
structPerson//声明结构体类型Person
{
charname[20];
intcount;
};
voidmain()
{
Personleader[3]={"Li",0,"Zhang",0,"Fun",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)==0)
{
leader[j].count++;//如果与某一候选人的姓名相同,就给他加一票
}
}
}
cout<for(i=0;i<3;i++)//输出3个候选人的姓名与最后得票数
{
cout<"<}
return0;
}
14.有两个5*5的矩阵,编程求出它们的和与积。
voidmain()
{
floatArraryA[5][5],ArraryB[5][5];
floatMul[5][5]={0},Sum[5][5];
inti,j,k;
//输入数组A的数据
printf("pleaseinputArraryA:
\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
scanf(“%f”,&ArraryA[i][j]);
}
}
//输入数组B的数据
printf("pleaseinputArraryB:
\n");
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++)
{
printf(“%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:
\n");
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:
\n",i);
for(j=0;j<5;j++)
{
scanf(“%f”,&p->score[j]);
}
}
}
voidaverscor(studentstu[])//计算平均成绩
{
student*p=stu;
floattemp;
inti,j;
for(i=0;i<30;i++,p++)
{
temp=0;
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=1;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*p1,*p2;
intn=0;
p1=p2=(structnode*)malloc(sizeof(structnode));//开辟一个新单元,并使p1,p2指向它
printf("请输入一个数据:
\n");
scanf("%d",p1->data);
head=NULL;
while((*p1).data!
=0)
{
n=n+1;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(structnode*)malloc(sizeof(structnode));
printf("请输入一个数据:
\n");
scanf("%d",p1->data);
}
p2->next=NULL;
returnhead;
}
voidprintchain(node*p)////查找节点并打印信息
{
node*p1;
if(p==NULL)//是空表
{
printf("listnull!
\n");
}
p1=p;
while(p1!
=NULL)//p1指向的不是所要找的结点且后面还有结点
{
printf("%d\t",p1->data);
p1=p1->next;
}//p1后移一个结点
}
voidmain()
{
node*p;
p=creat();//创建链表
printchain(p);//查找节点并打印信息
}
17.建立一个学生的结构体,学生信息包括:
学号、姓名、三门功课成绩(politic、maths、english),建立一个有30个成员的结构体数组,从键盘输入学号进行查询,当查找到该学号时,显示该生所有信息,否则显示“无此学生”。
structstudent
{
intsno;
charname[20];
floatscore[3];
};
voidmain()
{
studentstu[30];
intsno;
//输入30个成员的数据
input(stu);
//按学号查找学生并显