C语言程序设计实验与习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.程序填空
(1)以下程序的功能是计算1~50之间能被7整除的整数之和。
#include<>
void main()
{int i,sum= 0;
for(i=1;50;i++)
if(i%7==0) sum+=i;
printf("sum=%d\n",sum);
}
(2) 下面程序接收来自键盘的输入,直到输入<Ctrl>+Z(值为-1)键为止。
这些字符被原样输出,但若有连续一个以上的空格时只输出一个空格。
请填空。
#include <>
void main()
{char cx;
char front=’’;
while ((cx=getchar())!=’\n’)
{if (cx!=’’)
putchar(cx);
if (cx= =’’)
if (front!=’’)
putchar(cx);
front=cx;
}
}
3.程序改错
(1)下列程序的功能是求1+3+5+…99的和。
#include <>
void main( )
{ int s,i; ★10.6f10.6f10.6f10.6f代表个数*/
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
if(i*i*i+j*j*j+k*k*k==1099) /*在所有组合中找出满足指定条件的*/
{
printf("%4d",100*i+10*j+k);
n++;
if(n%5==0) printf("\n"); /*表示每行输出5个数*/
}
}
#include<>
#include<>
main()
{
int i,j,k;
for(i=1;i<=4;i++) /*上三角形有4行,每循环1次输出1行*/
{
for(k=1;k<8-((2*i-1)/2);k++) /*该循环输出每行的空格.8用于调节偏离位置,可换成别的数(>=8)*/
printf(" ");
for(j=1;j<=2*i-1;j++) /*该循环输出每行的’*’字符*/
printf("*");
putchar(’\n’);/*换行*/
for(i=3;i>=1;i--) /*下面为倒三角形,有3行*/ {
for(k=1;k<8-((2*i-1)/2);k++)
printf(" ");
for(j=1;j<=2*i-1;j++)
printf("*");
putchar(’\n’);
}
}
main( )
{ int n=1,score,t;
scanf("%d",&score);
while (score>=0&&n<=5)
{ n++;
t=0;
while(score!=0)
{
t=t+(score%10)*(score%10);
score=score/10;
}
if(t==108)
printf("%d",score);
scanf("%d",&score);
}
}
#include ""
main()
{
float x0,x1,x2,fx0,fx1,fx2; /*x1,x2分别表示每次区间的左右端点,x0代表区间的中间点,fx0,fx1,fx2代表相应点的函数值*/
do
{printf("please input x1&x2:");
scanf("%f,%f",&x1,&x2);
fx1=x1*((2*x1-4)*x1+3)-6;
fx2=x2*((2*x2-4)*x2+3)-6;
}while(fx1*fx2>0); /*该循环指定有根的区间*/
do
{
x0=(x1+x2)/2;
fx0=x0*((2*x0-4)*x0+3)-6;
if((fx0*fx1)<0) /*丢掉右区间*/
{
x2=x0;
fx2=fx0;
}
else /*丢掉左区间*/
{
x1=x0;
fx1=fx0;
}
}while(fabs(fx0)>1e-5); /*该循环实现二分法求根*/
printf("root x=%f",x0);
}
2)程序填空
(1)
#include <>
void main()
{
int m,n,num1,num2,temp;
printf("Input two positive integer:\n");
scanf("%d,%d",&num1,__&num2_______);
if(num1<num2)
{temp=num1; num1=num2; num2=__temp_______;}
m=num1;
n=num2;
while(n!=0)
{ temp=__m%n__________;
m=n;
n=temp;
}
printf("The grestest common divisor is %d\n",m);
printf("The lowest common multiple is %d\n",num1*num2/__m____); }
(2)下面程序是计算表达式1+(1+2)+(1+2+3)+…
+(1+2+3+…+10)和。
#include<>
void main()
{int sum,i,j,t;
sum=①;
for(i=1;i<=10;i++)
{t=0;
for(j=1;j<=②;j++)
t=t+j;
sum=③;
}
printf("1+(1+2)+(1+2+3)+...+(1+2+3+ (10)
=%d\n",sum);
}
①0 ②i ③sum+t
3.程序改错
(1)下面的程序是求1~100之间的素数,并将所有素数按每行10个输出。
#include <>
#define <>★10.3f⑴
①a[10]=x;
②break;
③a[k]=x;
附:算法简析
main()
{
int x,i,j,k;/*感觉似乎j定义了没什么作用*/
int a[11]={8,18,28,38,48,58,68,78,88,98};
printf("请输入需要插入的一个整数:");
scanf("%d",&x);
a[10]=x;/*把x放到数据串最末位置*/
for(i=0;i<10;i++)
if(x<a[i]) {k=i;break;}/*寻找x的插入点,当发现插入点时退出*/
for(i=10;i>k;i--)/*将插入点以及其后的每个数据后移一个单位(给x腾位)*/
/*实例演示——腾位
8 18 28 38 48 58 68 78 88 98 (x)
8 18 28 38 38 48 58 68 78 88 98
↑
插入点
*/
a[i]=a[i-1];
a[k]=x;/*将x放到插入点位置*/
for (i=0;i<11;i++)
printf("%3d",a[i]);
printf("\n");
}
⑵①i%7==0||i%11==0
②n++
③i%5==0
3.
⑴a.将continue;改为break;
b.将i=k-1;改为j=k-1;
c.将j=k+1;改为i=k+1;
d.将for(i=0;i<10;i++)改为for(i=0;i<9;i++);
附:算法简析
#include <>
void main()
{int x, i,j,k;
int a[10]={ 8,18,28,38,48,58,68,78,88,98};
printf("请输入需要删除的一个整数:");
scanf("%d",&x);
i=0;
j=9;
while(i<=j)
{k=(i+j)/2 ;
if(a[k]==x) break;
if(a[k]>x)j=k-1;
if(a[k]<x)i=k+1;
}/*二分法查找x在数组中的位置,该位置即删除点,注意始末坐标不要弄颠倒*/
if(i>j) printf("需要删除的数不在数组中\n");
else{ for( ;k<9;k++)a[k]=a[k+1];/*挤位,后面的数据向删除点靠拢*/
/*实例演示——挤位(若删除38)
删除点
↓
8,18,28,38,48,58,68,78,88,98
8,18,28,48,58,68,78,88,98,98
*/
for (i=0;i<9;i++)
/*删除一个数,只剩9个,数组最末尾储存的是重复的数据(倒数第二个),故不输出*/
printf("%5d",a[i]);
}
}
⑵a.将for(i=0,j=0;i<=10;i++)改为for(i=1,j=0;i<=10;i++)
b.将if(i%3=0)改为if(i%3==0)
c.将for(;j>=0;j++)改为for(;j>=0;j--) 4.
⑴
#include<>
#include<>
int isprime(int x)
{
int k=sqrt(x);
for(;k>1;k--)
if(x%k==0) return 0;
return x;
}
void sort(int a[],int x)
{
int i,k,t;
for(i=0;i<x-1;i++)
for(k=i+1;k<x;k++)
if(a[i]>a[k])
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
void main()
{
int num[50],prime[50],i,n=0,j;
printf("PLease input 50 integers:\n");
for(i=0;i<50;i++)
{
scanf("%d",&num[i]);
if((j=isprime(num[i]))!=0)
prime[n++]=j;
}
sort(prime,n);
printf("The sorted prime numbers are : \n"); for(i=0;i<n;i++)
printf("%-5d",prime[i]);
}
⑵
#include<>
#include<>
main()
{
char input[10],paswor[10]="password",ch,flag=0;
int count=1,i=0;
while(count<=3)
{
printf("请输入密码:");
while((ch=getch())!=13)
{
input[i++]=ch;
putchar(’*’);
}
input[i]=’\0’;
if(strcmp(input,paswor)==0)
{
printf("\n\n你好!我的主人!");
flag=1;
break;
}
else
printf("\n\n离我远点!");
count++;
getch();
}
if(flag==0)
printf("密码输入三次错误,你不是我的主人!\n\n离我远点!\n\n 否则,我很生气,后果很严重!!!");
getch();
}
⑶
main()
{
int num[10],i,max,min,maxj,minj;
printf("Please input the data:\n");
scanf("%d",&num[0]);
max=min=num[0];
for(i=1;i<10;i++)
{ scanf("%d",&num[i]);
if(max<num[i]){max=num[i];maxj=i;}
if(min>num[i]){min=num[i];minj=i;}
}
printf("The maximum element’s underside is %d,max=%d",maxj,num[maxj]); printf("\nThe minimum element’s underside is %d,min=%d",minj,num[minj]); }
⑷
#include<>
#include<>
void input(int a[],int *n)
{
int i;
printf("How many datas do you want to input ");
scanf("%d",n);
printf("\nPlease input %d datas:\n",*n);
for(i=0;i<*n;i++)
scanf("%d",&a[i]);
}
void sort(int a[],int n)
{
int i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
void menu(int a[],int n)
{
int i;
gotoxy(1,24);
printf("Datas: ");
for(i=0;i<n;i++)
printf("%-3d",a[i]);
gotoxy(1,1);
printf("MENU\n");
printf("************************\n");
printf("**\n");
printf("* a data*\n");
printf("**\n");
printf("* a data*\n");
printf("**\n");
printf("* a data*\n");
printf("**\n");
printf("**\n");
printf("**\n");
printf("************************\n");
printf("PLease input a command==>");
}
void find(int a[],int n)
{
int x;
int low=0,high=n-1,mid;
printf("\nPLease input a data to be searched: ");
scanf("%d",&x);
while(low<=high)
{
mid=(low+high)/2;
if(x==a[mid]) break;
else if(x>a[mid]) low=mid+1;
else high=mid-1;
}
if(low>high) printf("\nThis data can’t be found in the database!"); else
{
printf("\nThis data is in the position %d",mid);
gotoxy(7+3*(mid+1)-2,23);putchar(25);
}
}
void insert(int a[],int n)
{
int x,k,i;
printf("\nPLease input a data to be inserted:");
scanf("%d",&x);
a[n]=x;
for(i=0;i<n;i++)
if(x<a[i]) {k=i;break;}
for(i=n;i>k;i--)
a[i]=a[i-1];
a[k]=x;
gotoxy(1,24);
delline();
printf("Datas: ");
for(i=0;i<=n;i++)
printf("%-3d",a[i]);
}
void Delete(int a[],int n)
{
int x,low,high,mid,i;
printf("\nPLease input a data to be deleted:");
scanf("%d",&x);
low=0;
high=n-1;
while(low<=high)
{mid=(low+high)/2 ;
if(a[mid]==x) break;
if(a[mid]>x)high=mid-1;
if(a[mid]<x)low=mid+1;
}
if(low>high) printf("The data to be deleted is not in the database!\n");
else
{
for( ;mid<n-1;mid++)a[mid]=a[mid+1];
gotoxy(1,24);
delline();
printf("Datas: ");
for(i=0;i<=n-2;i++)
printf("%-3d",a[i]);
}
}
main()
{
int a[50],n=0;
char com;
input(a,&n);
sort(a,n);
clrscr();
menu(a,n);
com=getch();
switch(com)
{
case ’1’:find(a,n);break;
case ’2’:insert(a,n);break;
case ’3’:Delete(a,n);break;
default: break;
}
getch();
}
/*DT made it in 2009/05/16*/
程序填空:
(1)#include <>
#define N 4
void main()
{ int a[N][N],s1=0,s2=1,max,i,j;
for(i=0; i<N; i++)
for(j=0; j<N; j++)
scanf("%d", &a[i][j]);
max= a[0][0];
for(i=0;i<N;i++)
for(j=0; j< N ;j++)
{
if(i==j) s1=s1+a[i][j];
if(i+j==N-1) s2*=a[i][j];
if(a[i][j]> max )max=a[i][j];
}
printf("s1=%d,s2=%d,max=%d\n",s1,s2,max); }
(2)#include<>
#define M 4
#define N 3
void main( )
{int a[M][N]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int sum= 0,i,j;
for(i=0;i<N;i++)
sum+=a[0][i]+ a[M-1][i];
for(j=1;j<M-1;j++)
sum+=a[j][0]+ a[j][N-1] ;
printf("%d\n",sum);
}
改错:
(1)#in#include<>
#define M 3
#define N 4
void main( )
{int a[M][N]={{1,2,3,4},{5,6,7,8 },{9,10,11,12}}; int b[N][M];
int i,j;
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
printf("%3d",a[i][j]);
printf("\n");}
for(i=0;i<N;i++)
for(j=0;j<M;j++)
b[i][j]=a[j][i];
printf("\n");
for(i=0;i<N;i++)
{for(j=0;j<M;j++)
printf("%3d",b[i][j]);
printf("\n");}
}
(2)#include<>
void main()
{int d[][4] ={{0,0,0,0}},i,j;
printf("\nPlease input 16 num: ");
for(i=0;i<4;i++)
for(j=0;j<4;j++)
scanf("%d",&d[i][j]);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(d[i][j]<d[j][i])
d[i][j]=d[j][i];
for(i=0;i<4;i++)
{printf("\n\n\n\n\n");/*为了保持每行的间隔与每列的相同*/
for(j=0;j<4;j++)
if(j>=i)
printf("\t%d",d[i][j]);/*为了使位数不同的数输出依然保持三角型*/ else
printf("\t");
}
}
设计性实验:
(1)#include<>
#define M 3
#define N 6
{
int i,j,max,min,m=0,n=0,p=0,q=0;
int a[M][N];
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
max=min=a[0][0];
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{ if(a[i][j]>max)
{
max=a[i][j];
m=i;
n=j;
}
else if(a[i][j]<min)
{ min=a[i][j];
p=i;
q=j;
}
}
printf("max(%d,%d)=%d,min(%d,%d)=%d",m,n,max,p,q,min);
}
(3)#include<>
void main()
{
int n,i,j;
int a[N][N];
printf("please input the n:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
a[i][0]=1;
a[i][i]=1;
}
for(i=2;i<n;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<n;i++)
{for(j=0;j<=i;j++)
printf("%-4d",a[i][j]);
printf("\n");
}
}
2.程序填空
(1)以下程序的功能是求数组a中元素的和。
#include <>
void main( )
{ int a[10];
int *p,sum=0;
for(p=a; p<a+10; p++)
scanf("%d",①);//p
for(p=a;p<a+10;p++)
sum=sum+②;//*p
printf("sum=③\n",sum);//%d
}
(2)以下程序功能是在数组中查找与x值相同的元素所在的位置。
#include<>
void main( )
{ int i,x,a[11];
printf(“please input ten number:”);
for(i=1;i<11;i++)
scanf("%d",a+i);
printf("please input x: ");
scanf("%d",&x);
a[0]=①;//x
i=10;
while(x != *(a+i) )
②;// i--
if(③)//x==*(a+i)
printf("found position is :%d",i);
else
printf("not found!");
}
3.程序改错
(1)以下程序的功能是求一元二次方程的实数根。
#include <>
#include <>
double *quadratic(double *factor)
{ static double result[2];
double delta;
delta=factor[1]*factor[1]-4*factor[0]*factor[2];
if(delta<0) return 0;
delta=sqrt(delta);
result[0]=(-factor[1]+delta)/(2*factor[0]);
result[1]=(-factor[1]-delta)/(2*factor[0]);
return result;
}
void main()
{double fun[3],r; ★// double fun[3],*r;
printf("Please enter three factors:");
scanf("%f%f%f",&fun[0],&fun[1],&fun[2]); ★
//%lf%lf%lf
r=quadratic(fun[3]); ★// r=quadratic(fun);
if(r)
printf("The solution is: X1=%lf\tX2=%lf\n",r[0],r[1]);
else
printf("No solution!\n");
}
(2)以下程序的功能是统计数组a中所有偶数的个数。
#include""
void main( )
{int a[10],*p,sum=0;
printf("请输入10个整数:");
for(p=a;p<a+10;p++)
scanf("%d",*p); ★// scanf("%d",p);
for( ;p>=a;p--)★// for(p-- ;p>=a;p--) if(p%2= =0) sum++;★// if(*p%2==0) sum++;
printf("共有%d个偶数",sum);
}
2.程序填空
(1)以下程序的功能是利用指针找出3个整数中的最小数。
#include<>
void main( )
{ int *p1,*p2,*p3,min,x,y,z;
p1=&x;
p2=&y;
p3=&z;
printf(″please input three integer: ″);
scanf(″%d%d%d″,p1,p2,p3);
①;//min=*p1
if(*p1>*p2)
②;//min=*p2
if(min>*p3)
③;//min=*p3
printf(″min=%d\n″,min);
}
(2)以下程序利用指向函数的指针实现函数调用,完成可选择的加减乘除运算。
#include<>
/*定义函数add*/
int add(int x,int y)
{printf("%d+%d=",x,y);return x+y;}
/*定义函数sub*/
int sub(int x,int y)
{printf("%d-%d=",x,y);return x-y;}
/*定义函数mult*/
int mult(int x,int y)
{printf("%d*%d=",x,y);return x*y;}
/*定义函数dev*/
int dev(int x,int y)
{printf("%d/%d=",x,y);return x/y;}
void main()
{int (*funp)(int,int);
char op;
int x,y;
printf("Please intput the expression a +(-*/)b:\n");
scanf("%d",&x);
scanf("%c",&op);
scanf("%d",&y);
①(op)//switch
{case '+':funp=②;break;//add
case '-':funp=sub;break;
case '*':funp=mult;break;
case '/':funp=dev;break;
default:printf("Operator is illegal;\n");
}
printf("%d\n",③(x,y));//funp
}
3.程序改错
(1)以下程序的功能是:输入3个整数,按由小到大的顺序输出。
#include <>
void main()
{int i1,i2,i3;
int *p1,*p2,*p3;
void swap(int ,int ); ★// void swap(int *,int *) printf("Please enter three integer:\n");
scanf("%d%d%d",i1,i2,i3); ★// scanf("%d%d%d",&i1,&i2,&i3);
p1=i1;p2=i2;p3=i3; ★// p1=&i1;p2=&i2;p3=&i3;
if(i1>i2) swap(p1,p2);
if(i1>i3) swap(p1,p3);
if(i2>i3) swap(p2,p3);
printf("pai xu hou de shu:%d,%d,%d\n",i1,i2,i3);
}
void swap(int *p,int *q)
{int t;
t=*p;
*p=*q;
*q=t;
}
(2)下列程序的功能是利用自定义函数计算一无符号整数各位数字的乘积。
#include <>
unsigned *f(unsigned num)
{unsigned s=1,*p;
p=s; ★//p=&s;
do
{s=s*(num%10);
num/=10;
}while(num);
return p;
}
void main()
{unsigned x,p;
printf("input x=:\n");
scanf("%d",&x);
p=f(x);
printf("%d",p); ★// printf("%d",*p);
}
4.设计性实验
(1)编程一函数,其功能是求一个长正整数各位数字之和。
要求使用指针函数实现结果的返回。
在主函数中进行测试。
例如在主函数中输入348762,输出结果应为为30即3+4+8+7+6+2的和。
//方法一:利用指向函数的指针
int sum(long n)//利用递归求和
{ unsigned long x;
if(n<10)
x=n;
else
x=sum(n/10)+n%10;
return(x);
}
void main()
{
long x;
int (*f)(long);//
f=sum;
scanf("%ld",&x);
printf("%d",f(x));
}
//方法二:利用指针函数仿照第3)题改错(2)#include <>
unsigned *f(long num)
{unsigned s=0,*p;
p=&s;
do
{s=s+(num%10);
num/=10;
}while(num);
return p;
}
void main()
{ unsigned *p;
long x;
printf("input x=:\n");
scanf("%ld",&x);
p=f(x);
printf("%d",*p);
}
(2)编程一函数求两个整数的最大公约数,要求使用指针函数实现结果的返回。
在主函数中调用此函数进行测试。
两个整数由键盘输入。
//方法一:利用指向函数的指针
int mcf(int a,int b)
{ int temp;
while(b)
{temp=a%b;
a=b;
b=temp;
}
return a;
}
void main()
{
int x,y;
int (*f)(int,int);
f=mcf;
scanf("%d%d",&x,&y);
printf("%d",f(x,y));
}
//方法二:利用指针函数仿照第3)题改错(2)
int *mcf(int a,int b)
{ int temp;
while(b)
{temp=a%b;
a=b;
b=temp;
}
return &a;
}
void main()
{
int x,y,*p;
scanf("%d%d",&x,&y);
p=mcf(x,y);
printf("%d",*p); }。