文档库

最新最全的文档下载
当前位置:文档库 > 安徽大学C语言程序上机操作答案

安徽大学C语言程序上机操作答案

C语言实验参考答案
实验一
5、输入并运行自已编写的程序(教材第一章P14 三 编程题)。
实验二
1、编写一个程序,从键盘接收3个实数(分别为10.0、20.0、5.0),输出这3个数的和s、乘积t和平均值a。
#include
main()
{float x,y,z,s,t,a;
printf(“x,y,z=”);
scanf(“%f,%f,%f”,&x,&y,&z);
s=x+y+z;
t=x*y*z;
a=s/3;
printf(“s=%f,t=%f,a=%f\n”,s,t,a);
}
2、编程。要求用户输入两个整数a、b(分别为20、10), 读取用户从键盘输入的值,然后:
1)用整数输出这两个数的和、差;
2)用长整型输出这两个数的积,用float输出商;
3)用整数输出这两个数的余数,用float输出平均值。
#include
main()
{int a,b,he,cha,yu;
long ji;
float shang,aver;
printf(“a,b=”);
scanf(“%d,%d”,&a,&b);
he=a+b;
cha=a-b;
ji=(long)a*b;
shang=1.0*a/b;
yu=a%b;
aver=(a+b)/2.0;
printf(“a+b=%d,a-b=%d,a*b=%ld\n”,he,cha,ji);
printf(“a/b=%f,a%%b=%d,aver=%f\n”,shang,yu,aver);
}
3. 再次运行程序第2题中的程序,使整数a、b的值分别为10、20,分析程序运行结果,并给出说明。
程序同上。
实验三
1、编写一个程序,从键盘接收一个一位的整型数,经转换,用字符函数putchar输出。例如,输入整数5,程序运行后输出字符5。
#include
main()
{int a;
char c;
printf(“a=”);
scanf(“%d”,&a);
c=a+48;
putchar(c);
}
2、编程。输入半径,计算球体表面积( )和球体积 ( )。
#include
#define PI 3.1415926
main()
{float r,s,v;
printf(“r=”);
scanf(“%f”,&r);
s=4*PI*r*r;
v=4/3.0*PI*r*r*r;
printf(“s=%f,v=%f\n”,s,v);
}
3、编写一个程序,要求通过键盘给6个变量赋值,然后将变量的值在屏幕上打印输出。这六个变量的值分别为:10,-10,40000,a,3.14,hello。
#include
main()
{int a,b;
long c;
char d,ch[6];
float e;
scanf(“%d%d%ld%c%f%s”,&a,&b,&c,&d,&e,ch);
printf(“%d,%d,%ld,%c,%f,%s\n”,a,b,c,d,e,ch);
}
实验四
1. 编程实现:键盘输入三个整数,分别存放到变量a,b,c中,输出其中的最小值(要求不改变a、b、c的值)。
#include
main()
{int a,b,c,min;
printf("请输入三个整数a,b,c=");
scanf ("%d,%d,%d",&a,&b,&c);
min=a>b?(b>c?c:b):(a>c?c:a);
printf("min=%d\n",min);
}
2. 编程实现:键盘输入一个字符,如是大写字母,则输出相应小写字母;如是小写字母,则输出相应大写字母;其它字符原样输出。
#include
main()
{char c;
printf("请输入一个字符:");
scanf ("%c",&c);
if(c>='a'&&c<='z')c=c-32;
else if(c>='A'&&c<='Z')c=c+32;
printf("%c\n",c);
}
3、计算以下分段函数值

#include
main()
{double x,y;
printf("请输入一个实数:");
scanf ("%lf",&x);
if(x<0&&x!=-3)y=x*x+x-6;
else if(x>=0&&x<10&&x!=2&&x!=3)y=x*x-5*x+6;
else y=x*x-x-

1;
printf("x=%f,f(x)=%f\n",x,y);
}
4. 编写程序,键盘接收一个字符串(只含大、小写英文字母),将该字符串加密后输出。加密规则为:若为小写字母则不变,若为大写字母则将其转换为小写后再后移一个字母,例如“A”应转换为“b”,“B”应转换为“c”,“Y”应转换为“z”,而“Z”应转换为“a”。
#include
main()
{char c[20];
int i;
printf("请输入一个字符串(只含英文字母):");
gets (c);
for(i=0;c[i]!=’\0’;i++)
if(c[i]>= ‘A’&&c[i]<= ‘Y’)c[i]=c[i]+33;
else if(c[i]==’Z’)c[i]=‘a’;
puts(c);
putchar(‘\n’);
}
5. 编写程序,用scanf输入任意两个数给变量a、b,若a大于等于b,则直接输出a、b,否则将a、b的值交换(即a的原值放入b中,b的原值放入a中)后再输出。
#include
main()
{float a,b,t;
printf("请输入两个数:");
scanf ("%f,%f",&a,&b);
if(aprintf ("a=%f,b=%f",a,b);
}
6. 编写程序:由系统生成一个10以内的随机整数,用户从键盘上输入一个10以内的整数,如果两者相等输出“OK”,否则输出“ERROR”。
#include
#include
#include
main()
{int a,b;
srand( (unsigned)time(NULL));
b=rand()%10+1;
printf("请输入一个10以内的整数:");
scanf("%d",&a);
printf("a=%d,随机数b=%d\n",a,b);
if(a==b) printf("OK!\n");
else printf("ERROR!\n");
}
7. 编写程序要求输入整数a和b,若a2+ b2大于100,则输出a2+ b2百位以上的数字,否则输出两数之和。(此题为选做)
#include
main()
{int a,b,t;
printf("请输入两个整数a,b=");
scanf ("%d,%d",&a,&b);
t= a*a+b*b;
if(t<=100)
printf("a+b =%d",a+b);
else
{t=t/100;
printf ("a*a+b*b百位以上的数字是%d\n",t);
}
}
实验五
1. 编程,计算函数y的值,已知函数y与自变量x的关系为:





#include
main()
{float x,y;
printf(“请输入一个非负数x=”);
scanf(“%f”,&x);
if(x>=0&&x<100)y=3*x+10;
else if(x>=100)y=x*x*x-20;
if(x>=0)printf(“y=%f\n”,y);
else printf(“输入错误!\n”);
}
2. 编写一个简单的计算器程序,输入格式为:data1 op data2。其中data1和data2是参加运算的两个数,op为运算符,它的取值只能是+、-、*、/。
#include
main()
{char op;
float d1,d2;
printf("请输入算式(如3+5):");
scanf("%f%c%f",&d1,&op,&d2);
switch(op)
{case '+': printf("%g+%g=%g\n",d1,d2,d1+d2);break;
case '-': printf("%g-%g=%g\n",d1,d2,d1-d2);break;
case '*': printf("%g×%g=%g\n",d1,d2,d1*d2);break;
case '/': printf("%g÷%g=%g\n",d1,d2,d1/d2);break;
}
}
2. 编程实现:输入一个整数,判断它能否被3,5,7整除,并输出以下信息之一:
①能同时被3,5,7整除
②能被其中两数(要指出是哪两个数)整除
③能被其中一个数(要指出是哪一个数)整除

④不能被3,5,7任一个数整除
#include
main()
{int n;
printf("请输入一个整数n=");
scanf("%d",&n);
if(n%3==0&&n%5==0&&n%7==0)
printf("%d能被3,5,7整除\n",n);
else if(n%3==0&&n%5==0)printf("%d能被3,5整除\n",n);
else if(n%3==0&&n%7==0)printf("%d能被3,7整除\n",n);
else if(n%5==0&&n%7==0)printf("%d能被5,7整除\n",n);
else if(n%3==0)printf("%d能被3整除\n",n);
else if(n%5==0)printf("%d能被5整除\n",n);
else if(n%7==0)printf("%d能被7整除\n",n);
else printf("%d不能被3,5,7任一个整除\n",n);
}
4. 已知从2008年12月开始,银行整存整取存款不同期限的年利率分别为:三个月 1.71%,半年 1.98%,一年 2.25%,两年 2.79%,三年 3.33%,五年 3.60%。编写程序,要求输入存钱的本金和期限,求出到期时能从银行得到的利息与本金的合计数。
#include
main()
{char c;
float x,y;
printf("请输入存款本金x=");
scanf("%f",&x);
do
{getchar(); /*接受回车符*/
clrscr(); /*清屏*/
printf("\n存款期限:\n");
printf("a------三个月(年利率1.71%%)\n");
printf("b------半年(年利率1.98%%)\n");
printf("c------一年(年利率2.52%%)\n");
printf("d------两年(年利率2.79%%)\n");
printf("e------三年(年利率3.33%%)\n");
printf("f------五年(年利率3.60%%)\n");
printf("请输入存款期限(a,b,c,d,e,f):");
scanf("%c",&c);
}
while(!(c>='a'&&c<='f'));
printf("%g元存期",x);
x=x/100;
switch(c)
{case 'a':y=x*(100+1.71/4); printf("三个月");break;
case 'b': y=x*(100+1.98/2); printf("半年");break;
case 'c': y=x*(100+2.25); printf("一年");break;
case 'd': y=x*(100+2.79*2); printf("两年"); break;
case 'e': y=x*(100+3.33*3); printf("三年");break;
case 'f': y=x*(100+3.6*5); printf("五年");break;
}
printf("到期的本息合计为%f元\n",y);
}
5. 设函数

(1)用条件表达式求函数值y。
(2)用if 语句编程,输入x,输出y,并给出你所使用的测试用例。
解(1)用条件表达式求函数值y。
#include
main()
{float x;
int y;
printf("请输入x=");
scanf ("%f",&x);
y=(x>=0)?(x>0?1:0):-1;
printf("y=%d\n",y);
}
解(2)用if 语句编程,输入x,输出y。
#include
main()
{float x;
int y;
printf("请输入x=");
scanf ("%f",&x);
if(x>=0)
if(x>0)y=1;
else y=0;
else y=-1;
printf("y=%d\n",y);
}
6. 编写程序:键盘上输入一个不多于5位的正整数,要求:①求它是几位数②逆序打印出各位数字。如原数为123,应输出321。(此题为选做)
#include
#include
main()
{long n,m,p,w1=0,w2=0,w3=0,w4=0,w5=0,t=0;
printf("请输入一个非负整数(n<100000)n=");
scanf("%ld",&n);
if((n/10000)!=0)m=5;
else if(n/1000!=0)m=4;
else if(n/100!=0)m=3;
else if(n/10!=0)m=2;
else m=1;
switch(m)
{case 5:p=n/10000;w1=p;n-=p*10000;t+=w1*pow(10,m-5);
case 4:p=n/1000;w2=p;n-=p*1000;t+

=w2*pow(10,m-4);
case 3:p=n/100;w3=p;n-=p*100;t+=w3*pow(10,m-3);
case 2:p=n/10;w4=p;n-=p*10;t+=w4*pow(10,m-2);
case 1:p=n;w5=p;t+=w5*pow(10,m-1);
}
printf("输入的是%ld位数,逆序数为%ld\n",m,t);
}
实验六
1、编程:输出200以内所有能被7整除的数。
#include
main()
{int i;
for(i=0;i<=200;i+=7)
printf(“%4d”,i);
}
2、从键盘输入n个数(n<10),找出其中最小值,请编写相应程序。
#include
main()
{int n,i,a,min;
printf(“n=”);
scanf(“%d”,&n);
for(i=1;i<=n;i++)
{scanf(“%d”,&a);
if(i==1)min=a;
if(min>a)min=a;
}
printf(“min=%d”,min);
}
3、键盘输入正整数m和n(m#include
main()
{int m,n,i,x1=0,x2=0;
printf(“input m,n(mscanf(“%d,%d”,&m,&n);
for(i=m;i<=n;i++)
if(i%2==1)x1+=i;
else x2+=i;
printf(“x1(奇数之和)=%d,x2(偶数之和)=%d\n”,x1,x2);
}
4.编程,计算函数y的值。要求键盘接收自变量x的值,若x 的值不为零,则计算函数y的值并输出,再从键盘接收下一个x的值,……,直到x的值为零,则显示“Thank You,Bye!”,尔后结束程序,已知函数y与自变量x的关系为:

#include
main()
{float x=1,y;
do
{if(x<0) printf("输入错误(x<0)!请重新输入\n");
printf("请输入x=");
scanf("%f",&x);
if(x>0&&x<100)y=3*x+10;
if(x>=100)y=x*x*x-20;
if(x>0)printf("y(%g)=%g\n",x,y);
}
while(x!=0);
printf("Thank You,Bye!\n");
}
5.编写程序:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
#include
main()
{int i;
float f1=1,f2=2,f,s=0;
for(i=1;i<=20;i++)
{f=f2/f1;s+=f;
f=f1;f1=f2;f2=f+f2;
}
printf("s(20)=%g\n",s);
}
6.我国现有人口13亿,设年增长率为1%,编写程序,计算多少年后增加到20亿。
#include
main()
{float p=13;
int n=0;
do
{p=p*1.01;
n++;
}
while(p<20.);
printf("%d年后人口增加到20亿!\n",n);
}
7.求解爱因斯坦数学题。有一条长阶梯,若每步跨2阶,则最后剩余1阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨6阶,则最后剩5阶;若每步跨7阶,最后才正好一阶不剩。请问,这条阶梯共有多少阶?
#include
main()
{ int n=7;
do
{if(n%2!=1){n++;continue;}
if(n%3!=2) {n++;continue;}
if(n%5!=4) {n++;continue;}
if(n%6!=5) {n++;continue;}
if(n%7!=0) {n++;continue;}
break;
}
while(1);
printf("这条阶梯共有%d阶!\n",n);
}
(说明:该题应有多解:119,329,……)
8.每个苹果0.8 元,第一天买2 个苹果,第二天开始,每天买前一天的2 倍,直至购买的苹果个数达到不超过100 的最大值。编写程序求每天平均花多少钱?(此题为选做)
#include

main()
{float s=0;
int n=1,p=0,d=0;
do
{ d++; /*第d天*/
n=n*2; /*买n 个苹果*/
p=p+n; /*共p 个苹果*/
}
while(p+n*2<=100);
s=p*0.8/d;
printf("每天平均花%g元钱!\n",s);
}
9.编写程序,求一个整数任意次方的最后三位数。即求xy的最后三位数,要求x,y 从键盘输入。(注意xy的结果是否会溢出)。(此题为选做)
#include
#include
main()
{double x,y,m;
int m3;
printf("请输入x,y=");
scanf("%lf,%lf",&x,&y);
m=pow(x,y);
m3=(int)m%1000;
printf("x的y次方为%g,其最后三位数是%0.3d\n",m,m3);
}
实验七
1. 编写程序,从键盘输入6 名学生的5 门成绩,分别统计出每个学生的平均成绩。
#include
main()
{int a,b,s;
float v;
for(a=1;a<=6;a++)
{v=0;
for(b=1;b<=5;b++)
{printf("请输入第%d名学生的第%d门成绩:",a,b);
scanf("%d",&s);
v=v+s;
}
printf("第%d名学生的平均成绩为:%d\n",a,v/5.0);
}
}
2、打印出所有的"水仙花数",所谓的"水仙花数"是指一个3位数,其各位数字的立方和等于该数本身。例如,153是一个"水仙花数",因为有153=1*1*1+5*5*5+3*3*3 。
解(1)
#include
main()
{int a,b,c,n;
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
{n=100*a+10*b+c;
if(n==a*a*a+b*b*b+c*c*c)
printf(“%d\n”,n);
}
}
解(2)
#include
main()
{int a,b,c,n;
for(n=100;n<=999;n++)
{a=n/100;
b=n%100/10;
c=n%10;
if(n==a*a*a+b*b*b+c*c*c)
printf(“%d\n”,n);
}
}
3、请分别用三种循环结构编程计算: 1!+2!+3!+...+n!,n的值由键盘输入。
解(1)
#include
main()
{int n,i;
long p=1,sum=0;
printf(“n=”);
scanf(“%d”,&n);
for(i=1;i<=n;i++)
{p*=i;
sum+=p;
}
printf(“1!+2!+…+%d!=%ld\n”,n,sum);
}
解(2)
#include
main()
{int n,i=1;
long p=1,sum=0;
printf(“n=”);
scanf(“%d”,&n);
while(i<=n)
{p*=i;
sum+=p;
i++;
}
printf(“1!+2!+…+%d!=%ld\n”,n,sum);
}
解(3)
#include
main()
{int n,i=1;
long p=1,sum=0;
printf(“n=”);
scanf(“%d”,&n);
do
{p*=i;
sum+=p;
i++;
}
while(i<=n);
printf(“1!+2!+…+%d!=%ld\n”,n,sum);
}
4. 用循环语句编写程序,其功能是计算:
s=1+12+123+1234+12345+123456+1234567
#include
main()
{long i,t=0,s=0;
for(i=1;i<=7;i++)
{t=10*t+i;
/*printf("t=%ld\n",t);*/
s=s+t;
}
printf("s=%ld\n",s);
}
5. 编写程序,输出下列形式的杨辉三角形的前10行。(此题为选做)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
……
#include
main()
{int i,j,a[10]={1,1};
printf("%4d\n%4d%4d\n",a[0],a[0],a[1]);
for(i=2;i<10;i++)
{a[i]=1;
for(j=i-1;j>=1;j--)a[j]+=a[j-1];
for(j=0;j<=i;j++)
printf("%4d",a[j]);
pr

intf("\n");
}
getch();
}
实验八
1、打印输出由1,2,3,4四个数字组成的4位数,并统计它的个数(允许该4位数中有相同的数字,例如:1111,1122,,1212等).。
#include
main()
{int n,a,b,c,d,num=0;
for(a=1;a<=4;a++)
for(b=1;b<=4;b++)
for(c=1;c<=4;c++)
for(d=1;d<=4;d++)
{n=1000*a+100*b+10*c+d;
printf(“%5d”,n);
num++;
}
printf(“\nnum=%d\n”,num);
}
2、从键盘输入10个正整数进行求和,如果错误地输入了负数,则求和结束。请分别用break和不用break编写相应程序。
解(1) 用break编写程序
#include
main()
{int i,n,sum=0;
for(i=1;i<=10;i++)
{scanf(“%d”,&n);
if(n>=0)sum+=n;
else break;
}
printf(“sum=%d”,sum);
}
解(2) 不用break编写程序
#include
main()
{int i=1,n=0,sum=0;
while(i<=10&&n>=0)
{scanf(“%d”,&n);
if(n>=0)
sum+=n;
i++;
}
printf(“sum=%d”,sum);
}
3. 勾股定理为:a2+b2=c2,编写程序,输出30以内满足上述关系的整数组合,例如3,4,5就是一个整数组合。
#include
main()
{int a,b,c,n;
for(a=1;a<=30;a++)
for(b=a;b<=30;b++)
for(c=a;c<=30;c++)
{if(c*c==a*a+b*b)
printf("%d,%d,%d\n",a,b,c);
}
}
4. 计算并输出500以内最大的10个素数之和。
#include
main()
{int a,b,s=0,n=0;
for(a=500;a>=2;a--)
{for(b=2;b<=a-1;b++)
if(a%b==0)break;
if(b==a){n++;s=s+a;printf("%d ",a);}
if(n==10) break;
}
printf("\ns=%d\n",s);
}
5. 请验证2000以内的哥德巴赫猜想,对于任何大于4的偶数均可以分解为两个素数之和。
#include
main()
{int n,m,a,b;
for(n=6;n<=2000;n+=2)
for(m=3;m{for(a=2;aif(m%a==0)break;
if(a==m)
{for(b=2;bif((n-m)%b==0)break;
if(b==n-m)
{ printf("%d=%3d+%3d\n",n,m,n-m);break;}
}
}
}
6. 编写程序:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5(此题为选做)
#include
main()
{int n,m,k=1;
printf("请输入一个正整数n=");
scanf("%d",&n);
printf("%d=",n);
for(m=2;m<=n;m++)
if(n%m==0)
{if(k==1) printf("%d",m);
else printf("*%d",m);
k++;
n=n/m;
m--;
continue;
}
}
printf("\n");
}
7. 编写程序,求一个正整数的位数(提示:关系表达式的值可以参与算术运算)。(此题为选做)
#include
main()
{long a,n=0,m=1;
printf("请输入一个正整数a=");
scanf("%ld",&a);
do
{if(a/m!=0){n++;m=m*10;}
else break;
}
while(1);
printf("正整数%ld的位数是:%ld\n",a,n);
}
实验九
1、求一个3×3的整数矩阵的副对角线上所有奇数的和sum2。
#include
main()
{int a[3][3],sum2=0,i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{scanf(“%d”,&a[i][j]);
if(i+j==2&&a[i][j]%2)
sum2+=a[i][j];
}
printf(“sum2=%d”,sum2);
}
2、输入一个正整数n(1

实现:
⑴ 输出这些数的平均值(保留2位小数)。
⑵ 把这些数逆序后再输出。
⑶ 输出它们中的最大值及其下标(设最大值唯一,下标从0开始)。
⑷ 将它们中的最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。
#include
main()
{int a[10],n,min,max,xb0,xb1,i,sum,t;
float aver;
printf("n=");
scanf("%d",&n);
for(i=0;iscanf("%d",&a[i]);
min=a[0];xb0=0;
max=a[0];xb1=0;
sum=a[0];
for(i=1;i{if(min>a[i]){min=a[i];xb0=i;};
if(maxsum+=a[i];
}
aver=1.0*sum/n;
printf("(1)平均值为:%3.2f\n",aver);
printf("(2)逆序输出:");
for(i=0;ifor(i=0;iprintf("%4d",a[i]);
printf("\n");
printf("(3)最大值为:%d,其下标为:%d\n",max,xb1);
t=a[0];a[0]=a[xb0];a[xb0]=t;
for(i=0;iif(a[i]==max)xb1=i;
t=a[n-1];a[n-1]=a[xb1];a[xb1]=t;
printf("(4)经交换后输出:");
for(i=0;iprintf("%4d",a[i]);
printf("\n");
}
3. 定义一个含有30个整型元素的数组a,按顺序分别赋予从2开始的偶数;然后按顺序每5个数求出一个平均值,放在另一个数组b中存储,输出数组b中6个元素的值。
#include
main()
{int a[30],i,j;
float b[6]={0,0,0,0,0,0};
for(i=0;i<30;i++)a[i]=(i+1)*2;
for(i=0;i<6;i++)
{for(j=0;j<5;j++)
b[i]+=a[i*5+j];
b[i]=b[i]/5.;
printf("b[%d]=%g\n",i+1,b[i]);
}
}
4. 通过循环按行顺序为一个5×5的二维数组a赋1到25的自然数,然后输出该数组的左下半角元素的值。
#include
main()
{int a[5][5],i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)a[i][j]=i*5+j+1;
for(i=0;i<5;i++)
{for(j=0;j<=i;j++) printf("%3d",a[i][j]);
printf("\n");
}
}
5. 从键盘输入两个字符串a和b,要求不使用库函数strcat,把串b的前5个字符连接到串a中;如果b中的长度小于5,则把b的所有元素都连接到a中。
#include
main()
{char a[20],b[20];
int i,j;
gets(a);
gets(b);
for(i=0;a[i]!='\0';i++);
for(j=0;b[j]!='\0'&&j<5;j++)
a[i+j]=b[j];
a[i+j]='\0';
puts(a);
}
6. 定义两个N行N列的二维数组a、b,编写程序,将a数组最后一行放到b数组的第0列中,把a数组中的第0行放到b数组的最后一列中,b所指二维数组中其他元素的数据不变。
#include
main()
{int i,j ,a[3][3]={1,2,3,4,5,6,7,8,9};
int b[3][3]={11,12,13,14,15,16,17,18,19};
printf("变换前数组a,b:\n");
for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%3d",a[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%3d",b[i][j]);
printf("\n");
}
for(i=0;i<3;i++)
{b[i][0]=a[2][i];
b[i][2]=a[0][i];
}
printf("变换后数组a,b:\n");
for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%3d",a[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%3d",b[i]

[j]);
printf("\n");
}
}
7. 一个整型数组有10个元素,编写程序删除所有值为n的元素。要求①主函数完成n的输入,数组元素的输入以及进行删除后数组元素的输出。②子函数完成删除功能。(此题为选做)
#include
main()
{int a[10],i,n,k=0,j;
printf("请输入10个整数:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("请输入1个要被删除的整数:\n");
scanf("%d",&n);
for(i=0;i<10;i++)
if(a[i]==n){for(j=i;j<9;j++)
a[j]=a[j+1];
i--;k++;continue;
}
printf("删除后数组的输出:\n");
for(i=0;i<10-k;i++)
printf("%d ",a[i]);
printf("\n ");
}
8. 试编程实现如下功能:先定义一个4行5列的数组(矩阵),调用库函数rand()随机产生20-50之间的整数给数组元素赋值,再将矩阵中第二列与第四列的元素互换。要求先输出原数组,再输出交换后的数组。(rand函数的使用请参阅教材259页)(此题为选做)
#include
#include
#include
main()
{int a[4][5],i,j,t;
srand( (unsigned)time(NULL));
printf("变换前数组a:\n");
for(i=0;i<4;i++)
{for(j=0;j<5;j++)
{a[i][j]= rand()%30+21;printf("%3d",a[i][j]);}
printf("\n");
}
printf("变换后数组a:\n");
for(i=0;i<4;i++){t=a[i][1];a[i][1]=a[i][3];a[i][3]=t;}
for(i=0;i<4;i++)
{for(j=0;j<5;j++)
printf("%3d",a[i][j]);
printf("\n");
}
}
9. 已知一组整型数据已按从小到大排列好,现任意输入一个整数,请按原来排序的规律将它插入到数组中(例如:原来的一组整数为1,3,5,8,9,若输入的整数是7,则最终的结果为: 1,3,5,7,8,9)。(此题为选做)
#include
main()
{int a[10]={1,3,5,7,9,11,13,15,17},i,j,n;
printf("请输入1个整数:");
scanf("%d",&n);
for(i=0;i<9;i++)
if(a[i]>n)
{for(j=9;j>i;j--)a[j]=a[j-1];
a[i]=n;
break;
}
if(n>=a[8])a[9]=n;
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n ");
}
10. 编写程序实现对字符串的加密,要求从键盘输入一个字符串,输出加密之后的字符串。
加密规则为:对于串中第奇数个字符,若是字母,则把该字母变为它后面的字母(若为Z则变为A),不是字母则不变;对于偶数个字符,若是字母,则把该字母变为它前面的字母(若为A则变为Z),不是字母则不变;大小写字母都遵循此规则。例如:
若原字符串是:AbbaZG Ha-MnnK Yzx
加密字符串为:BaczAF Gb-NmoJ Xaw
(此题为选做)
#include
main()
{char a[20];
int i;
printf("请输入一个字符串:");
gets(a);
for(i=0;a[i]!='\0';i++)
if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z')
if(i%2==1)
switch(a[i])
{case 'a':a[i]='z'; break;
case 'A':a[i]='Z'; break;
default:a[i]=a[i]-1;
}
else switch(a[i])
{case 'z':a[i]='a'; break;
case 'Z':a[i]='A'; break;
default:

a[i]=a[i]+1;
}
puts(a);
printf("\n ");
}
11. 编写程序:输入一个整数,输出该整数的平方螺旋矩阵。例如输入4,则输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
(此题为选做)
#include
main()
{int i,j,m,n=1,a[10][10];
printf("请输入一个小于10的整数:");
scanf("%d",&m);
for(i=0;i<=m/2;i++) /*共旋转m/2圈*/
{for(j=i;ja[i][j]=n++;
for(j=i+1;ja[j][m-i-1]=n++;
for(j=m-i-2;j>i;j--)
a[m-i-1][j]=n++;
for(j=m-i-1;j>i;j--)
a[j][i]=n++;
}
for(i=0;i{printf("\n\n");
for(j=0;jprintf("%5d",a[i][j]);
}
}
实验十
1. 编写字符串拷贝程序,并要求将字符串中的小写字母转换成大写字母。
#include
#include
main()
{char a[80],b[80];
int i,l;
printf("输入一个字符串:");
gets(a);
for(i=0;a[i]!=’\0’;i++)
{b[i]=a[i];
if(b[i]>=’a’&&b[i]<=’z’)b[i]=toupper(b[i]);
}
puts(b);
}
2、输入一个以回车结束的字符串(少于80个字符),将该字符串逆序后输出。
#include
#include
main()
{char c[80],ch;
int i,l;
gets(c);
l=strlen(c);
for(i=0;i{ch=c[i];
c[i]=c[l-i-1];
c[l-i-1]=ch;
}
puts(c);
}
3、输入一个以回车结束的字符串(少于80个字符),再输入一个字符,统计并输出该字符在字符串中出现的次数,然后再输出该字符串。
#include
main()
{char c[80],ch;
int i,num=0;
gets(c);
ch=getchar();
for(i=0;c[i]!=‘\0’;i++)
if(c[i]==ch)num++;
printf(“num(%c)=%d\n”,ch,num);
puts(c);
}
4. 编写程序:输入一行英文字符串,统计单词的个数(单词和单词以空格分隔)。(此题为选做)
#include
main()
{char c[50];
int j=0,k,n=0;
printf("输入一个字符串:");
gets(c);
while(c[j]==' ')
j++;
if(c[j]!='\0')
{n++;j++;}
for(k=j;k<50;k++)
{if(c[k]==' '&& c[k+1]!=' '&& c[k+1]!='\0')n++;
if(c[k]=='\0')
break;
}
printf("n=%d\n",n);
}
实验十一
1、用指针方法,编写一个函数,求矩阵主对角线元素之和Sum。
#include
main()
{int i,j,a[3][3],*p=*a,sum=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{scanf("%d",p);
if(i==j)sum+=*p;
p++;
}
printf("sum=%d\n",sum);
}
2、编一个程序,输入15个整数存入一维数组,按逆序存放后再输出(用指针完成)。
#include
main()
{ int i,a[15],*p=a,*q,temp;
for(i=0;i<15;i++)
scanf("%d",p+i);
q=&a[14];
for(i=0;i<7;i++)
{temp=*p;
*p=*q;
*q=temp;
p++;
q--;
}
p=a;
for(i=0;i<15;i++)
printf("%3d",*(p+i));
}
3、输入一个3×6的二维整型数组,输出其中最大值、最小值以及它们所在行和列的下标(用指针完成)。
#include
main()
{int i,j,a[3][6],*p=*a,min,max,xb0_h,xb0_l,xb1_h,xb1_l;
for(i=0;i<3;i++)
for(j

=0;j<6;j++)
{scanf("%d",p);
if(i==0&&j==0)
{max=*p;min=*p;
xb0_h=0;xb0_l=0;
xb1_h=0;xb1_l=0;
}
if(max<*p)
{max=*p;xb1_h=i;xb1_l=j;}
if(min>*p)
{min=*p;xb0_h=i;xb0_l=j;}
p++;
}
printf("最大值为:%d,行标:%d,列标:%d\n",max,xb1_h,xb1_l);
printf("最小值为:%d,行标:%d,列标:%d\n",min,xb0_h,xb0_l);
}
4. 用指针编写程序实现:输入一个字符串,计算该字符串的长度,并统计该串中含小写字母、大写字母和其他字符的个数。
#include
main()
{char a[100],*p=a;
int n=0,xiao=0,da=0,qita=0;
printf("请输入一个字符串:");
gets(p);
while(*p)
{n++;
if(*p>='a'&&*p<='z')xiao++;
else if(*p>='A'&&*p<='Z')da++;
else qita++;
p++;
}
printf("\n字符串长度=%d",n);
printf("\n小写字母个数=%d,大写字母个数=%d,其他字符个数=%d\n",xiao,da,qita);
}
5. 用指针编写程序完成,将字符串a赋给一个字符数组,然后从第一个字母开始间隔地输出该串。
#include
main()
{char a[100],*p=a;
int n=0;
printf("请输入一个字符串:");
gets(p);
while(*p)
{n++;
if(n%2==1)putchar(*p);
p++;
}
}
6. 编写一个指针型函数,从键盘接收一个1~7之间的整数,根据指定的数字,返回与该数字相对应的是星期几。例如数字6则返回Saturday。(此题为选做)
#include
char *f(int m,char (*p)[10])
{if(m==7)m=0;
p+=m;
return p;
}
main()
{int n;
char c[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"},(*q)[4];
q=c;
do
{printf("请输入一个1-7的整数:");
scanf("%d",&n);
}
while(n<1||n>7);
printf("%s\n",f(n,q));
}
7. 用指针编写程序实现,将一个字符串按逆序存放。要求①主函数中完成字符串的输入和输出。②子函数完成逆序存放。(此题为选做)
#include
#include
void g(char a[])
{int n,m;
char *p=a,t;
m=strlen(a);
for(n=0;n{t=*(p+n);*(p+n)=*(p+m-n-1);*(p+m-n-1)=t;}
}
main()
{char c[50],*q=c;
printf("请输入一个字符串:");
gets(q);
g(c);
printf("逆序后的字符串:");
puts(q);
}
实验十二
1. 编写程序:定义一个10个元素的职工结构体数组(职工号、姓名、性别、出生年份、职务),从键盘输入数据后,输出年龄最大的和最小的职工信息。
#include
main()
{int i,max=0,min=0,year1,year2;
struct zg
{char num[10];
char name[20];
char sex[3];
int year;
char zw[10];
}z[10];
for(i=0;i<10;i++)
{printf("输入第%d位职工的工号、姓名、性别、职务、出生年份\n",i+1);
scanf("%s%s%s%s%d",z[i].num,z[i].name,z[i].sex,z[i].zw,&z[i].year);
if(i==0){year1=z[0].year;year2=z[0].year;}
if(year1>z[i].year){year1=z[i].year;max=i;}
if(year2}
printf("年龄最大者:%s %s %s %d %s\n",z[max].num,z[max].name,z[max].sex,z[max].year,z[max].

zw);
printf("年龄最小者:%s %s %s %d %s\n",z[min].num,z[min].name,z[min].sex,z[min].year,z[min].zw);
}
2. 试利用指向结构体的指针编制一程序,实现输入三位学生的学号、姓名、数学期中和期末成绩,然后①求出每一位学生的平均成绩并输出成绩表②按成绩由高到底排序输出三位学生的相关信息。
#include
main()
{int i=0,j,n[3]={0,1,2},t;
struct student
{char num[10];
char name[20];
int grade1,grade2;
float aver;
}stu[3],*p;
for(p=stu;p{printf("请输入第%d位学生的学号、姓名、期中成绩、期末成绩:",i+1);
scanf("%s%s%d%d",p->num,p->name,&p->grade1,&p->grade2);
p->aver=(p->grade1+p->grade2)/2.;
i++;
}
printf("(1)成绩表:\n");
printf("姓名 期中成绩 期末成绩 平均成绩\n");
for(p=stu;pprintf("%4s%10d%10d%10.2f\n",p->name,p->grade1,p->grade2,p->aver);
for(i=0;i<3;i++)
for(j=i;j<3;j++)
if(stu[i].averprintf("(2)成绩排序:\n");
printf("学号 姓名 期中成绩 期末成绩 平均成绩\n");
for(i=0;i<3;i++)
printf("%4s%8s%10d%10d%10.2f\n",stu[n[i]].num,stu[n[i]].name,stu[n[i]].grade1,stu[n[i]].grade2,stu[n[i]].aver);
}
3. 有一个包括学生学号、姓名和三门课成绩的结构变量,要求在主函数中对该变量赋值,在另一个函数中将其值打印出来。
#include
struct student
{char num[10];
char name[20];
int grade1,grade2,grade3;
}stu;
main()
{void p();
printf("请输入学生的学号、姓名、成绩1、成绩2、成绩3:");
scanf("%s%s%d%d%d",stu.num,http://www.wendangku.net/doc/e162c43f376baf1ffc4fadb0.html,&stu.grade1,&stu.grade2,&stu.grade3);
p();
}
void p()
{printf("学号 姓名 成绩1 成绩2 成绩3\n");
printf("%4s%7s%7d%7d%7d\n",stu.num,http://www.wendangku.net/doc/e162c43f376baf1ffc4fadb0.html,stu.grade1,stu.grade2,stu.grade3);
}
实验十三
1. 定义一个函数,求200~5000之间满足“用4除余1,用5除余3,用7除余4”的数,且一行打印6个。
#include
void f(int n);
main()
{int n;
for(n=200;n<=5000;n++)
f(n);
}
void f(int n)
{static int p=0,m=0;
if(n%4==1 && n%5==3 && n%7==4)
{p++;
printf("%6d",n);
m=1;
}
else m=0;
if(p%6==0&&m==1)printf("\n");
}
2. 编写函数isprime( ),用来判断一个整形数a是否为素数,若是素数,函数返回1,否则返回0。
#include
int isprime(int a);
main()
{int a,n=0;
printf(“a=”);
scanf(“%d”,&a);
if(a>0)n=isprime(a);
if(n==1)printf(“%d是素数”,a);
else printf(“%d不是素数”,a);
}
int isprime(int a)
{int m;
for(m=2;mif(a%m==0)return 0;
return 1;
}
3. 在主函数main()中已有变量定义和函数调用语句:“int a=1,b= -5,c; c=fun (a ,,b)”; fun函数的作用是计算两个数之差的绝对值,并将差值返回调用函数。请你:
(1) 编写fun函数。
fun(int x , int y) { }
(2) 写出这个主函数main()

#include
int fun(int x,int y);
main()
{int a=1,b=-5,c;
c=fun(a,b);
printf(“c=%d\n”,c);
}
int fun(int x,int y)
{if(x>y)return x-y;
else return y-x;
}
4. 编写函数,其功能是删除字符串s中的所有数字字符。
解一:用外部数组编程
#include
char s[20];
void del();
main()
{printf(“请输入一个字符串:”);
gets(s);
del();
puts(s);
}
void del()
{int i,j;
for(i=0;s[i]!=’\0’;i++)
if(s[i]>=’0’&&s[i]<=’9’)
{for(j=i;s[j]!=’\0’;j++)s[j]=s[j+1];
i--;
}
}
解二:用指针作参数编程
#include
void del(char *p);
main()
{char s[20];
printf("请输入一个字符串:");
gets(s);
del(s);
puts(s);
}
void del(char *p)
{int i,j;
for(i=0;*(p+i)!='\0';i++)
if(*(p+i)>='0'&&*(p+i)<='9')
{for(j=i;*(p+j)!='\0';j++)*(p+j)=*(p+j+1);
i--;
}
}
解三:用数组作参数编程
#include
char *del(char s[]);
main()
{char s[20],*p;
printf("请输入一个字符串:");
gets(s);
p=del(s);
puts(p);
}
char *del(char s[])
{int i,j;
for(i=0;s[i]!='\0';i++)
if(s[i]>='0'&&s[i]<='9')
{for(j=i;s[j]!='\0';j++)s[j]=s[j+1];
i--;
}
return s;
}
5. 用函数调用重新实现实验7。即:编写函数求一个整数是否为水仙花数,并编写主程序调用该函数求出所有的水仙花数。(此题为选做)
#include
int sxh(int n);
main()
{int i,p=0;
for(i=100;i<=999;i++)
{p=sxh(i);
if(p==1)printf(“%d ”,i);
}
}
int sxh(int n)
{int a,b,c;
a=n/100;
b=(n-a*100)/10;
c=n%10;
if(a*a*a+b*b*b+c*c*c==n)return 1;
else return 0;
}
6. 以下函数p的功能是用递归方法计算x的n阶勒让德多项式的值。已有调用语句p(n,x);请编写p函数。递归公式如下:(此题为选做)

float p(int n, int x){ }
解:
#include
float p(int n,int x);
main()
{int n,x;
float y;
printf("请输入n,x=");
do
scanf("%d,%d",&n,&x);
while(n<0);
y=p(n,x);
printf("p(%d,%d)=%g\n",n,x,y);
}
float p(int n,int x)
{float y;
if(n==0)return 1;
if(n==1)return x;
y=(float)((2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x))/n;
return y;
}
实验十四
1、编程实现:输入n(n<10)个整数,按从大到小的顺序对其排序。
#include
main()
{int i,j,a[10],n,t;
printf(“n=”);
scanf(“%d”,&n);
for(i=0;iscanf(“%d”,&a[i]);
for(i=0;ifor(j=i;jif(a[i]for(i=0;iprintf(“%4d”,a[i]);
printf(“\n”);
}
2. 编写程序,键盘输入与您同寝室的n位同学的姓名(用汉语拼音表示),请将这n位同学的姓名按字母顺序排序后输出。(此题为选做)
#include
#include
main()
{int i,j;
char name[4][20],*p[4],*q;
printf("请输入4位同学的姓名");
for(i=0;i<4;i++)
{scanf("%s",name[i]);
p[i]=name[i];
}
for(i=0;i<4;i++)
for(j=i;j<4;j++)
if(strcmp(p[i],p[j])>0)
{q=p[i];p[i]=p[j];p[j]=q;}
printf("

按顺序输出4位同学的姓名:\n");
for(i=0;i<4;i++)
printf("%s ",p[i]);
}
实验十六
1、编程,要求实现:在主程序main( )中输入2个整数,通过调用函数将两者的值互换。(要求分别用值传递方式,地址传递方式以及全局外部变量传递方式编程)。
解(1) 用值传递方式编程
用值传递方式不能将两者的值互换。
解(2) 用地址传递方式编程
#include
void swap(int *x,int *y );
main()
{int x,y;
printf(“x,y=”);
scanf(“%d,%d”,&x,&y);
swap(&x,&y);
printf(“x=%d,y=%d\n”,x,y);
}
void swap(int *x,int *y )
{int temp;
temp=*x;
*x=*y;
*y=temp;
}
解(3) 用全局外部变量传递方式编程
#include
void swap();
int x,y;
main()
{printf(“x,y=”);
scanf(“%d,%d”,&x,&y);
swap();
printf(“x=%d,y=%d\n”,x,y);
}
void swap()
{int temp;
temp=x;x=y;y=temp;
}
2. 编写函数,求出M行N列二维数组每列元素中的最小值,通过形参传回主函数输出,并计算它们的和值。
#include
#define M 4
#define N 3
int f(int m[]);
main()
{int i,j,g[M][N],h[N],min,s=0;
printf("请输入%d个整数:",M*N);
for(i=0;ifor(j=0;jscanf("%d",&g[i][j]);
printf("%d行%d列数组为:\n",M,N);
for(i=0;i{for(j=0;jprintf("%4d",g[i][j]);
printf("\n");
}
for(j=0;j{for(i=0;ih[i]=g[i][j];
min=f(h);
s+=min;
printf("第%d列的最小值=%d\n",j,min);
}
printf("各列最小值之和=%d\n",s);
}
int f(int m[])
{int i,min;
min=m[0];
for(i=1;iif(min>m[i])min=m[i];
return min;
}
3. 已知80名学生的《计算机程序设计C》课程的成绩,求其平均成绩。要求主函数中输入成绩,将数组名作为函数参数传递,用被调函数求平均成绩。
#include
float v(int g[],int n);
main()
{int i,n=80,g[80];
float p;
for(i=0;iscanf(“%d”,&g[i]);
p=v(g,n);
printf(“平均成绩:%g\n”,p);
}
float v(int g[],int n)
{float i,p=0;
for(i=0;ip=p+g[i];
p=p/n;
return p;
}
实验十七
1. 用递归方法编写求斐波那契数列的函数,返回值为长整型。斐波那契数列的定义为:
f(n) =1 n = 1, 2
f(n) = f(n-1)+f(n-2) n > 2
并写出相应主函数。
#include
int fib(int n);
main()
{int n,i;
printf(“n=”);
scanf(“%d”,&n);
for(i=0;i<=n;i++)
printf(“%d,”,fib(i));
printf(“…\n”);
}
int fib(int n)
{ if(n==0) return 0;
if(n==1) return 1;
if(n>1) return fib(n-1)+fib(n-2);
}
2. 写出计算级数和1+2+3+…+n的递归函数和相应的主调函数,并计算出1+2+3+…+100的和。(此题为选做)
#include
int jsh(int n);
main()
{int n,s;
printf("n=");
scanf("%d",&n);
s=jsh(n);
printf("1+2+…+%d=%d\n",n,s);
}
int jsh(int n)
{int p;
p=n;
if(n==0) return 0;
if(n>0)p=p+jsh(n-1);
return p;
}
实验十八
1. 编程统

计一个文本文件(该文件您自已此前已建立)中字母、数字及其它字符各有多少个。
#include
main()
{char ch;
int zm=0,sz=0,qt=0;
FILE *fp;
fp=fopen(“file1.txt”,“r”);
if(fp==NULL)
{printf(“不能打开文件file1.txt\n”);exit(0);}
while(!feof(fp))
{ch=fgetc(fp);
if((ch>=‘a’&&ch<=‘z’)||( ch>=‘A’&&ch<=‘Z’))
zm++;
else if(ch>=‘0’&&ch<=‘9’)
sz++;
else qt++;
}
fclose(fp);
printf(“zm=%d\n”,zm);
printf(“sz=%d\n”,sz);
printf(“qt=%d\n”,qt);
}
可用以下程序,建立文件file1.txt,并写入20个字符到文件中。
#include "stdio.h"
main()
{int i;
char ch;
FILE *fp;
if((fp=fopen("file1.txt","w"))==NULL)
{printf("file open error!\n");
exit(0);
}
for(i=0;i<20;i++)
{ch=getchar();
fputc(ch,fp);
}
fclose(fp);
}
2. 文本文件int.txt中包含若干整数,请把文件中所有数据相加,并把累加和写入文件最后。
#include
main()
{int a,sum=0;
FILE *fp;
fp=fopen("file2.txt","r");
if(fp==NULL)
{printf("不能打开文件file2.txt\n");exit(0);}
while(!feof(fp))
{fscanf(fp,"%2d",&a);
sum+=a;
}
fclose(fp);
fp=fopen("file2.txt","a");
if(fp==NULL)
{printf("不能打开文件file2.txt\n");exit(0);}
fprintf(fp,"%d",sum);
fclose(fp);
}
可用以下程序,建立文件file2.txt,并写入10个整数到文件中。
#include "stdio.h"
main()
{int i,a;
FILE *fp;
if((fp=fopen("file2.txt","w"))==NULL)
{printf("file open error!\n");
exit(0);
}
for(i=0;i<10;i++)
{scanf("%d",&a);
fprintf(fp,"%2d",a);
}
fclose(fp);
}
3. 设文件number.dat中存放了一组整数,请编程统计并输出文件中正整数、零和负整数的个数。(此题为选做)
4. 编写一个程序,能将键盘上输入的内容以写字符的方式存入文件,直到输入一个‘*’为止,然后用读字符串的方式从文件中读出数据并显示在屏幕上。(此题为选做)

3