100道经典计算机编程题.docx
《100道经典计算机编程题.docx》由会员分享,可在线阅读,更多相关《100道经典计算机编程题.docx(161页珍藏版)》请在冰点文库上搜索。
100道经典计算机编程题
11.3.编程题
请编写一个函数intfun(int*s,intt,int*k),用来求出数组的最小元素在数组中的下标并存放在k所指的存储单元中。
例如,输入如下整数:
234345753134436458100321135760
则输出结果为6,100。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
intfun(int*s,intt,int*k)
{
}
main()
{
inta[10]={234,345,753,134,436,458,100,321,135,760},k;
clrscr();
fun(a,10,&k);
printf("%d,%d\n",k,a[k]);
}
答案:
intfun(int*s,intt,int*k)
{
inti;
*k=0;/*k所指的数是数组的下标值*/
for(i=0;iif(s[*k]>s[i])
*k=i;/*找到数组的最小元素,把该元素的下标赋给k所指的数*/
returns[*k];/*返回数组的最小
}
【解析】本题中直接使用指针变量k,但在使用时要注意对k的指针运算,此外,一开始应让*k的值为数组中的某一下标值,即*k=0。
12.3.编程题
下列程序定义了N×N的二维数组,并在主函数中自动赋值。
请编写函数fun(inta[][N]),该函数的功能是:
使数组右上半三角元素中的值全部置成0。
例如a数组中的值为
a=456
179
326,
则返回主程序后a数组中的值应为
000
100
320
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
#defineN5
intfun(inta[][N])
{
}
main()
{
inta[N][N],i,j;
clrscr();
printf("*****Thearray*****\n");
for(i=0;i{for(j=0;j{a[i][j]=rand()%10;
printf("%4d",a[i][j]);
}
printf("\n");
}
fun(a);
printf("THERESULT\n");
for(i=0;i{for(j=0;jprintf("%4d",a[i][j]);
printf("\n");
}
}
答案:
intfun(inta[][N])
{
inti,j;
for(i=0;ifor(j=i;ja[i][j]=0;/*将数组右上半三角元素中的值全部置成0*/
}
【解析】本题旨在考查控制数组中右上半三角元素的算法,找的过程其实就是找出将被挑出的那部分元素在原数组中的分布规律的过程。
通过观察得出,要被处理的那部分元素的下标值的范围是每行中从列数等于该行行数开始,直到列数等于阶数-1为止。
7.3.编程题
程序定义了N×N的二维数组,并在主函数中自动赋值。
请编写函数fun(inta[][N],intn),该函数的功能是使数组左下半三角元素中的值加上n。
例如:
若n的值为3,a数组中的值为
a=254
169
537
则返回主程序后a数组中的值应为
554
499
8610
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
#defineN5
fun(inta[][N],intn)
{
}
main()
{
inta[N][N],n,i,j;
clrscr();
printf("*****Thearray*****\n");
for(i=0;i{
for(j=0;j{
a[i][j]=rand()%10;
printf("%4d",a[i][j]);
}
printf("\n");
}
do
n=rand()%10;/*产生一个小于5的随机数n*/
while(n>=5);
printf("n=%4d\n",n);
fun(a,n);
printf("*****THERESULT*****\n");
for(i=0;i{
for(j=0;jprintf("%4d",a[i][j]);
printf("\n");
}
}
答案:
fun(inta[][N],intn)
{
inti,j;
for(i=0;ifor(j=0;j<=i;j++)
a[i][j]=a[i][j]+n;/*使数组左下半三角元素中的值加上n*/
}
【解析】首先从数组中找出要被加上n的那部分元素,找的过程其实就是找出将被挑出的那部分元素在原数组中的分布规律的过程。
通过观察得出,要被处理的那部分元素的下标值的范围是每行中从第一个元素开始,直到列数等于该行行数时为止。
找到这个规律后,依次从数组中取得合乎要求的元素,然后再加上n。
13.3.编程题
下列程序定义了N×N的二维数组,并在主函数中赋值。
请编写函数fun(),函数的功能是:
求出数组周边元素的平方和并作为函数值返回给主函数中的s。
例如:
若a数组中的值为
a=01279
1112155
2216111
979102
54141
则返回主程序后s的值应为310。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
#defineN5
intfun(intw[][N])
{
}
main()
{
inta[N][N]={0,1,2,7,9,1,11,21,5,5,2,21,6,11,1,9,7,9,10,2,5,4,1,4,1};
inti,j;
ints;
clrscr();
printf("*****Thearray*****\n");
for(i=0;i{for(j=0;j{printf("%4d",a[i][j]);}
printf("\n");
}
s=fun(a);
printf("*****THERESULT*****\n");
printf("Thesumis:
%d\n",s);
}
答案:
intfun(intw[][N])
{
inti,j,k=0;
ints=0;
for(i=0;ifor(j=0;jif(i==0||i==N-1||j==0||j==N-1)/*只要下标中有一个为0或N-1,则它一定是周边元素*/
s=s+w[i][j]*w[i][j];/*将周边元素求平方和*/
returns;/*返回周边元素的平方和*/
}
【解析】该题采用逐一判断的方式,周边元素的下标一定有一个是0或N-1,且只要下标中有一个为0或N-1,则它一定是周边元素。
14.3.编程题
N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。
请编写函数fun(),它的功能是:
找出学生的最低分,由函数值返回。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#defineN8
structslist
{doubles;
structslist*next;
};
typedefstructslistSTREC;
doublefun(STREC*h)
{
}
STREC*creat(double*s)
{
STREC*h,*p,*q;
inti=0;
h=p=(STREC*)malloc(sizeof(STREC));
p->s=0;
while(i{q=(STREC*)malloc(sizeof(STREC));
p->s=s[i];i++;p->next=q;p=q;
}
p->next=NULL;
returnh;/*返回链表的首地址*/
}
outlist(STREC*h)
{
STREC*p;
p=h;
printf("head");
do
{printf("->%2.0f",p->s);p=p->next;}/*输出各分数*/
while(p!
=NULL);
printf("\n\n");
}
main()
{
doubles[N]={56,89,76,95,91,68,75,85},min;
STREC*h;
h=creat(s);
outlist(h);
min=fun(h);
printf("min=%6.1f\n",min);
}
答案:
doublefun(STREC*h)
{
doublemin=h->s;
while(h!
=NULL)/*通过循环找到最低分数*/
{if(min>h->s)
min=h->s;
h=h->next;
}
returnmin;
}
【解析】在本题中,h为一个指向结构体的指针变量,若要引用它所指向的结构体中的某一成员时,要用指向运算符"->"。
由于是链表,所以要使h逐一往后移动,使用的是h=h->next。
15.3.编程题
请编写一个函数fun(),它的功能是:
比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较短的字符串。
若两个字符串长度相等,则返回第1个字符串。
例如,输入nanjingnanchang(为回车键),函数将返回nanjing。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
char*fun(char*s,char*t)
{
}
main()
{
chara[20],b[10],*p,*q;
inti;
printf("Input1thstring:
");
gets(a);
printf("Input2thstring:
");
gets(b);
printf("%s",fun(a,b));
}
答案:
char*fun(char*s,char*t)
{
inti,j;
for(i=0;s[i]!
='\0';i++);/*求字符串的长度*/
for(j=0;t[j]!
='\0';j++);
if(i<=j)/*比较两个字符串的长度*/
returns;/*函数返回较短的字符串,若
else
returnt;
}
【解析】本题中,第1个for循环的作用是求出s的字符个数i,第2个for循环的作用是求出t的字符个数j,因为任何循环都要控制一条语句,所以在每一个for循环条件后面必须要有一个分号。
16.3.编程题
请编写函数fun(),它的功能是:
求出1到1000之内能被5或13整除、但不能同时被5和13整除的所有整数并将它们放在a所指的数组中,通过n返回这些数的个数。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
voidfun(int*a,int*n)
{
}
main()
{
intaa[1000],n,k;
clrscr();
fun(aa,&n);
for(k=0;kif((k+1)%10==0)
{
printf("%5d",aa[k]);
printf("\n");/*一行写10个数*/
}
else
printf("%5d",aa[k]);
}
答案:
voidfun(int*a,int*n)
{
inti,j=0;
for(i=1;i<=1000;i++)/*求1到1000之内能被5或13整除、但不能同时被5和13整除的所有整数,并放入数组a中*/
if((i%5==0||i%13==0)&&i%65!
=0)
或if((i%5==0||i%13==0)&&!
(i%5==0&&i%13==0))
a[j++]=i;
*n=j;/*传回满足条件的数的个数*/
}
【解析】注意本题题目是找出能被5或13整除但不能同时被5和13整除的所有整数。
能同时被5和13整除的整数一定能被65整除,且不能被65整除的数不一定就是能被5或13整除的数。
所以可得出程序中的if()。
按运算优先级可知(i%5==0||i%13==0),注意,两边必须要有小括号。
17.3.编程题
请编写一个函数fun(),它的功能是:
将ss所指字符串中所有下标为偶数位置的字母转换为小写(若该位置上不是字母,则不转换)。
例如,若输入ABC4efG,则应输出aBc4efg。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
voidfun(char*ss)
{
}
main()
{
chartt[81];
clrscr();
printf("\nPleaseenteranstringwithin80characters:
\n");
gets(tt);
printf("\n\nAfterchanging,thestring\n\%s",tt);
fun(tt);
printf("\nbecomes\n\%s\n",tt);
}
答案:
voidfun(char*ss)
{
inti;
for(i=0;ss[i]!
='\0';i++)/*将ss所指字符串中所有下标为偶数位置的字母转换为小写*/
if(i%2==0&&ss[i]>='A'&&ss[i]<='Z')
ss[i]=ss[i]+32;
}
【解析】从C语言的学习中我们知道,只要将小写字母减去32则转成大写字母,将大写字母加上32则转成小写字母。
该程序是用if语句实现该功能转化的。
18.3.编程题
请编写一个函数fun(),它的功能是:
求出一个4×M整型二维数组中最小元素的值,并将此值返回调用函数。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#defineM4
#include
fun(inta[][M])
{
}
main()
{
intarr[4][M]={11,3,9,35,42,-4,24,32,6,48,-32,7,23,34,12,-7};
printf("min=%d\n",fun(arr));
}
答案:
fun(inta[][M])
{
inti,j,min=a[0][0];
for(i=0;i<4;i++)
for(j=0;jif(min>a[i][j])
min=a[i][j];/*求出二维数组的最小值*/
returnmin;
}
【解析】此类求最大值或最小值的C语言问题,我们可以采用逐个比较的方式。
要求数组中的所有元素走动一遍,并从中找出最大、最小值,要注意一开始应使min存放数组中的第一个元素的值。
可按逐行查找也可按逐列查找的方式,本题采用的是逐行查找的方式。
即行下标在外层循环,列下标在内层循环,因为在循环的嵌套中越在内层循环,循环变化就越快。
19.3.编程题
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是:
把分数最低的学生数据放在h所指的数组中。
注意:
分数低的学生可能不只一个,函数返回分数最低学生的人数。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#defineN16
typedefstruct
{charnum[10];
ints;
}STREC;
intfun(STREC*a,STREC*b)
{
}
main()
{
STRECs[N]={{"GA005",82},{"GA003",75},{"GA002",85},{"GA004",78},
{"GA001",95},{"GA007",62},{"GA008",60},{"GA006",85},
{"GA015",83},{"GA013",94},{"GA012",78},{"GA014",97},
{"GA011",60},{"GA017",65},{"GA018",60},{"GA016",74}};
STRECh[N];
inti,n;
FILE*out;
n=fun(s,h);
printf("The%dlowestscore:
\n",n);
for(i=0;iprintf("%s%4d\n",h[i].num,h[i].s);/*输出最低分学生的学号和成绩*/
printf("\n");
out=fopen("out19.dat","w");
fprintf(out,"%d\n",n);
for(i=0;ifprintf(out,"%4d\n",h[i].s);
fclose(out);
}
答案:
intfun(STREC*a,STREC*b)
{
inti,j=0,min=a[0].s;
for(i=0;iif(min>a[i].s)
min=a[i].s;/*找出最小值*/
for(i=0;iif(min==a[i].s)
b[j++]=a[i];/*找出成绩与min相等的学生的记录,存入结构体b中*/
returnj;/*返回最低成绩的学生人数*/
}
【解析】该程序使用循环嵌套,第1个for语句的作用是找出最小值。
第2个循环的作用是找出与min相等的成绩,也即最低成绩的学生记录,并存入b中。
20.3.编程题
请编写函数fun(),该函数的功能是:
移动一维数组中的内容,若数组中有n个整数,要求把下标从p到n-1(p≤n-1)的数组元素平移到数组的前面。
例如,一维数组中的原始内容为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,p的值为6。
移动后,一维数组中的内容应为7,8,9,10,10,11,12,13,14,15,1,2,3,4,5,6。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#defineN80
voidfun(int*w,intp,intn)
{
}
main()
{
inta[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
inti,p,n=15;
printf("Theoriginaldata:
\n");
for(i=0;iprintf("%3d",a[i]);
printf("\n\nEnterp:
");
scanf("%d",&p);
fun(a,p,n);
printf("\nThedataaftermoving:
\n");
for(i=0;iprintf("%3d",a[i]);
printf("\n\n");
}
答案:
voidfun(int*w,intp,intn)
{
inti,j,t;
for(i=p;i<=n-1;i++)/*循环右移n-p次*/
{t=w[n-1];
for(j=n-2;j>=0;j--)/*实现循环右移*/
w[j+1]=w[j];
w[0]=t;
}
}
【解析】本题采用"循环右移"的算法。
和我们在前面分析的稍有不同的是,一个是整型数组,一个是字符型数组。
21.3.编程题
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是:
按分数的高低排列学生的记录,低分在前。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#defineN16
typedefstruct
{
charnum[10];
ints;
}STREC;
intfun(STRECa[])
{
}
main()
{
STRECs[N]={{"GA005",88},{"GA003",64},{"GA002",77},{"GA004",89},
{"GA001",54},