编程序
1. 编写程序,输入一个正整数n,求下列算式的值。要求定义和调用函数fact(k)计算k的阶乘,函数返回值的类型是double。
#include <stdio.h>
double fact(int k)
{ double t=1;
int i;
for(i=1;i<=k;i++)
t*=i;
return t;
}
void main()
{ int i,n;
double s=0;
scanf(“%d”,&n);
for(i=1;i<=n;i++)
s+=1/fact(i);
printf(“%f\n”,s);
}
2. 输入一个x,输出下面分段函数f(x)的值。要求将分段函数的计算定义成函数。
#include <stdio.h>
int f(double x) // 函数定义
{ int y=0;
if(x>0)
y=1;
else if(x==0)
y=0;
else
y=-1;
return y;
}
void main()
{ double x;
int y;
scanf(“%lf”,&x);
y=f(x); // 函数调用
printf("f(%g)=%d\n",x,y);
}
3. 输入一个正整数,输出该数的各个数字之和。要求编写函数,计算整数的各个数字之和。
#include <stdio.h>
int sum(int a)
{ int s=0;
while(a!=0){
s+=a%10;
a=a/10;
}
return s;
}
void main()
{ int x;
scanf(“%d”,&x);
printf("%d\n",sum(x));
}
4. 输入两个正整数a和n,求a+aa+aaa+……+aa…a(最后一项为n个a)之和。例如输入2和3,输出246(即2+22+222)。要求定义并调用函数f(a,n),它的功能是返回aa…a(n个a)。例如f(2,3)返回222。
#include <stdio.h>
int f(int a,int n)
{ int s=0;
for(;n>0;n--)
s=s*10+a; // s+=pow(10,n-1)*a;
return s;
}
void main()
{ int a,n,sum=0,i;
printf(“input a n:\n”);
scanf(“%d%d”,&a,&n);
for(i=1;i<=n;i++)
sum+=f(a,i);
printf(“%d\n”,sum);
}
5. 输入三个数,输出它们的最小值。要求定义一个函数,返回两个数的最小值。
#include <stdio.h>
double min(double x,double y)
{ if(x<y)
return x;
else
return y;
}
void main()
{ double x,y,z,t;
scanf(“%lf%lf%lf”,&x,&y,&z);
t=min(x,y);
t=min(t,z);
printf("min:%f\n",t);
}
6. 在主函数中输入字符c和m,调用函数prn,连续将字符c输出m次。定义函数prn,完成连续将某个字符c输出m次后换行。
#include <stdio.h>
void prn(char,int); // 函数声明
void main()
{ char c;
int m;
printf(“Input c m:\n”);
scanf(“%c%d”,&c,&m);
prn(c,m);
}
void prn(char c,int m)
{ int i;
for(i=1;i<=m;i++)
putchar(c);
printf(“\n”);
}
7. 输入一个整数n,计算3.2n的值。要求定义函数计算xn 值。
#include <stdio.h>
double fact(double x,int n);
void main()
{ double x,y;
int n;
printf(“Input x n:\n”);
scanf(“%lf%d”,&x,&n);
y=fact(x,n);
printf(“%f\n”,y);
}
double fact(double x,int n)
{ int i;
double t=1;
for(i=1;i<=n;i++)
t=t*x;
return t;
}
8. 输入平面上p1(x1,x2)、p2(x2,y2)两点坐标,计算两点间的距离输出。要求定义一个函数计算平面上两点间的距离。
#include <stdio.h>
#include <math.h>
double f(double,double,double,double);
void main()
{ double x1,x2,y1,y2,d;
printf(“Input (x1,y1),(x2,y2):\n”);
scanf(“(%lf,%lf),(%lf,%lf)”,&x1,&y1,&x2,&y2);
d=f(x1,y1,x2,y2);
printf(“%f\n”,d);
}
double f(double x1,double y1,double x2,double y2)
{ double d;
d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return d;
}
9. 输出一张摄氏温度——华氏温度转换表。摄氏温度取[-100℃ ~150℃ ],温度间隔5℃ ,要求定义函数ctof(c),将摄氏温度转换为华氏温度,转换公式:F=32+C*9/5
#include <stdio.h>
void main()
{ float c,f, ctof(float); int i;
for(i=0,c=-100;c<=150;c+=5)
{ f=ctof(c);
printf("%6.0f %-6.0f",c,f);
i++;
if(i%5==0) printf("\n");
}
}
float ctof(float c)
{ float f;
f=32+c*9/5;
return f;
}
10. 求11~999之间所有“回文数”之和。要求编制函数 JSValue(m)用于判断m是否为回文数。回文数是指各位数字左右对称,例如11、121、676、909等等。
#include <stdio.h>
int JSValue(int m)
{ int a=0,b;
b=m;
while(b!=0){
a=a*10+b%10;
b=b/10;
}
if(a==m) return 1;
else return 0;
}
void main()
{ int s=0,i;
for(i=11;i<=999;i++)
if(JSValue(i)==1) s+=i;
printf(“%d\n”,s);
}
11. 输入100个学生的数学课程成绩,计算平均分,并统计成绩在平均分数正负10%区间的学生的人数。
#include <stdio.h>
void main()
{ int a[100],i,k=0;
float sum=0,aver;
for(i=0;i<100;i++)
{ scanf(“%d”,&a[i]);
sum+=a[i];
}
aver=sum/100;
for(i=0;i<100;i++)
if(0.9*aver<=a[i]&&a[i]<=1.1*aver) // 当前成绩在平均分数正负10%区间
k++;
printf(“%f,%d\n”,aver,k);
}
12. 输入两个正整数m和n(m<n),求从m到n之间(包括m和n)所有素数的和。要求定义并调用函数isprime(x)来判断x是否是素数。
#include <stdio.h>
int isprime(int x)
{ int i;
for(i=2;i<x;i++)
if(x%i==0) return 0;
return 1;
}
void main()
{ int m,n,s=0,k;
scanf(“%d%d”,&m,&n);
for(k=m;k<=n;k++)
if(isprime(k)==1) s+=k;
printf(“%d\n”,s);
}
13. 输入一个字符串(少于80个字符),再输入一个字符,统计并输出该字符在字符串中出现的次数(例如:输入morning回车,再输入n,输出2)。
#include <stdio.h>
main()
{ char s[80],c;
int i,k=0;
printf("输入字符串:\n");
gets(s);
printf("输入字符:\n");
c=getchar();
for(i=0;s[i]!='\0';i++)
if(s[i]==c) k++;
printf("%s中包含%d个%c\n",s,k,c);
}
14. 输入10组数,每组数3个数,输出每组数的最大值。要求定义并调用函数max(x,y,z)求x、y、z的最大值。
#include <stdio.h>
double max(double x,double y,double z)
{ double m;
m=x;
if(m<y) m=y;
if(m<z) m=z;
return m;
}
void main()
{ double x,y,z,i;
for(i=1;i<=10;i++){
scanf(“%lf%lf%lf”,&x,&y,&z);
printf(“%f\n”,max(x,y,z));
}
}
15. 输入一个字符串,统计其中数字字符出现的次数。
#include <stdio.h>
void main()
{ char s[80];
int i,n=0;
gets(s);
for(i=0;s[i]!='\0';i++)
if(s[i]>='0'&&s[i]<='9')
n++;
printf("%s中包含%d个字符\n",s,n);
}
16. 将一个大小为10的数组b的值按逆序重新存放(数组的值由键盘任意输入,不使用辅助数组)。
#include <stdio.h>
void main()
{ double a[10],t;
int i,j;
for(i=0;i<10;i++)
scanf("%lf",&a[i]);
for(i=0,j=9;i<j;i++,j--)
{ t=a[i];a[i]=a[j];a[j]=t;}
for(i=0;i<10;i++)
printf("%8.2f",a[i]);
}
17. 计算5×5数组周边元素的和。
#include <stdio.h>
void main()
{ double a[5][5],sum=0;
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%lf",&a[i][j]);
for(i=0;i<5;i+=4)
for(j=0;j<5;j++)
sum+=a[i][j]; // 第1、最后两行元素和
for(i=1;i<4;i++)
for(j=0;j<5;j+=4)
sum+=a[i][j]; // 最左、右两列(不包括角上)元素和
printf("%8.2f\n",sum);
}
18. 输入一5行、5列的数组,将数组的每1行均除以该行上的主对角元素(第1行同除以a[0][0],第2行同除以a[1][1],...),然后以行列对齐格式输出数组内容。
#include <stdio.h>
void main()
{ float a[5][5],t;
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%f",&a[i][j]);
for(i=0;i<5;i++)
{ t=a[i][i]; // { for(j=0;j<5;j++)
for(j=0;j<5;j++) // if(i!=j) a[i][j]=a[i][j]/a[i][j];
a[i][j]=a[i][j]/t; // a[i][i]=1; }
}
for(i=0;i<5;i++)
{ for(j=0;j<5;j++)
printf("%8.2f",a[i][j]);
printf("\n");
}
}
19. 输入一个字符串(字符个数少于80),判断是否为回文?若是输出YES,否则输出NO。
解一:
#include <stdio.h>
void main()
{ char s[80];
int i,j;
gets(s);
for(j=0;s[j]!='\0';j++); // 求字符串长度
for(i=0,j--;i<j;i++,j--)
if(s[i]!=s[j])
{ printf("NO\n"); break; }
if(i>=j)
printf("YES\n");
}
解二:
#include <stdio.h>
void main()
{ char s[80];
int i,j,flag=1;
gets(s);
for(j=0;s[j]!='\0';j++);
for(i=0,j--;i<j;i++,j--)
if(s[i]!=s[j]) flag=0;
if(flag==1) printf("YES\n");
else printf("NO\n");
}
20. 编写函数fun,返回一个数组(10个数)中除最大值和最小值以外的平均值。
#include <stdio.h>
double fun(double a[ ],int n)
{ double sum=0,max,min;
int i;
max=min=a[0];
for(i=0;i<n;i++)
{ if(max<a[i]) max=a[i];
else if(min>a[i]) min=a[i];
sum+=a[i]; }
return (sum-max-min)/(n-2);
}
void main()
{ double b[10],v;
int i;
for(i=0;i<10;i++)
scanf("%lf",&b[i]);
v=fun(b,10);
printf("average:%.2f\n",v);
}
21. 在主函数中输入一个正整数x,编写函数f1,它的功能是:求出能整除x且不是偶数的各正整数,并放在数组a中,这些除数的个数返回给主函数。在主函数中输出各除数。
#include <stdio.h>
int f1(int a[ ],int x)
{ int j,n=0;
for(j=1;j<=x/2;j+=2)
if(x%j==0)
{ a[n]=j;
n++;
}
return n;
}
void main()
{ int a[20],i,n,x;
scanf("%d",&x);
n=f1(a,x);
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
}
22. 在主函数中输入6行、6列的数组和变量m的值,编写函数f2,该函数的功能是:将数组左下半三角元素中的值乘以m。在主函数中以行列对齐格式输出该数组。
#include <stdio.h>
void f2(int a[ ][6],int m)
{ int i,j;
for(i=0;i<6;i++)
for(j=0;j<=i;j++)
a[i][j]*=m;
}
void main()
{ int a[6][6],i,j,m;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
scanf("%d",&a[i][j]);
printf("Input m:"); scanf("%d",&m);
f2(a,m); // 调用函数
for(i=0;i<6;i++) {
for(j=0;j<6;j++) printf("%5d",a[i][j]);
printf("\n");
}
}
23. 编写一个函数f3,它的功能是:实现两个字符串的连接。
#include <stdio.h>
void main()
{ char s1[100],s2[40];
void f3(char s1[ ],char s2[ ]);
gets(s1);
gets(s2);
f3(s1,s2);
puts(s1);
}
void f3(char s1[ ],char s2[ ])
{ int i,j;
for(i=0;s1[i]!='\0';i++); // 找s1 中字符串结束位置
for(j=0;s2[j]!='\0';j++,i++)
s1[i]=s2[j]; // 将s2 中字符串连接到s1后
s1[i]='\0'; // 连接后加结束标志
return ;
}
24. 在数组x的10个数中求平均值v,找出与v相差最小的数组元素。
#include <stdio.h>
#include <math.h>
void main()
{ double x[10],v,d;
int i;
for(i=0,v=0;i<10;i++)
{ scanf("%lf",&x[i]);
v+=x[i]; }
v=v/10;
d=x[0];
for(i=1;i<10;i++)
if(fabs(d-v)>fabs(x[i]-v))
d=x[i];
printf("平均值:%-8.2f,与平均值最近元素:%-8.2f\n",v,d);
}
25. 输入n(n≤20)个数放在一维数组中,找出其中最小的数,将它与数组最前面的数交换后输出这些数。
#include <stdio.h>
void main()
{ int i,k,temp,n,a[20];
printf("Input n:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(k=0,i=1;i<n;i++)
if(a[i]<a[k]) k=i;
temp=a[0];a[0]=a[k];a[k]=temp;
for(i=0;i<n;i++) printf("%d ",a[i]);
}
26. 有n(n≤20)个数,已按从小到大顺序排列好,要求输入一个数,把它插到数列中,使数列仍有序,并输出新的数列。
#include <stdio.h>
void main()
{ int i,n,a[21],x;
printf("Input n≤20 :"); scanf("%d",&n);
printf("Input %d numbers:\n",n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
printf("Input x:"); scanf("%d",&x);
for(i=n-1;i>=0;i--)
if(a[i]>x) a[i+1]=a[i];
else break;
a[i+1]=x;
for(i=0;i<n+1;i++) printf("%-6d",a[i]);
}
27. 输入一个5行、6列的数组,找出该数组中绝对值最大的元素、输出该元素及其两个下标值。
#include <stdio.h>
#include <math.h>
void main()
{ int a[5][6],i,j,max,maxi,maxj;
for(i=0;i<5;i++)
for(j=0;j<6;j++) scanf("%d",&a[i][j]);
max=abs(a[0][0]);maxi=maxj=0;
for(i=0;i<5;i++)
for(j=0;j<6;j++)
if(abs(a[i][j])>max)
{ max=abs(a[i][j]); maxi=i; maxj=j; }
printf("max: %d\n",a[maxi][maxj]);
printf("row: %d col: %d\n",maxi,maxj);
}
28. 从键盘输入任意一个整数,统计该整数中出现的不同数字的个数。
#include <stdio.h>
void main()
{ int x,a[10]={0},i,n=0;
printf("Input x:\n");
scanf("%d",&x);
while(x!=0)
{ a[x%10]=1;
x=x/10;
}
for(i=0;i<10;i++)
n+=a[i];
printf("%d\n",n);
}
29. 三角形面积公式为:
其中 s=(a+b+c)/2
a、b、c分别是三角形的三条边。请分别定义计算s和area的宏,写程序,在程序中用带实参的宏名来求面积。
#include <stdio.h>
#include <math.h>
#define s(a,b,c) (a+b+c)/2
#define area(a,b,c,s) sqrt(s*(s-a)*(s-b)*(s-c))
main()
{ double x,y,z,d,t;
scanf(“%lf%lf%lf”,&x,&y,&z);
if(x+y>z&&x+z>y&&y+z>x) {
d=s(x,y,z);
t=area(x,y,z,d);
printf(“area=%f\n”,t);
}
else printf(“error!\n”);
}
30. 编程,输入一个正整数,将其转换成二进制数。
#include <stdio.h>
main()
{ int x,a[32],i,j;
printf("Enter x:");
scanf("%d",&x);
for(i=0;x!=0;i++) {
a[i]=x%2;
x/=2;
}
for(j=i-1;j>=0;j--)
printf("%d",a[j]);
printf("\n");
}
31. 输入一行字符,统计并输出其中英文字母、数字字符、空格和其他字符的个数。
#include <stdio.h>
void main()
{ char str[80];
int zm,sz,kg,qt,i;
zm=sz=kg=qt=0;
gets(str);
for(i=0;str[i]!='\0';i++)
if(str[i]>='A'&&str[i]<='Z'|| str[i]>='a'&&str[i]<='z')zm++;
else if(str[i]>='0'&&str[i]<='9') sz++;
else if(str[i]==' ') kg++;
else qt++;
printf(" 字母=%d,数字=%d,空格=%d,其它=%d\n",zm,sz,kg,qt);
}
32. 编制函数del_char,函数原型为 void del_char(char *a,char ch),函数的功能是删除a指向的字符串中的值为ch的字符。例如从字符串"AscADef" 中删除 'A' 后,字符串为"scDef"。
#include <stdio.h>
void del_char(char *a,char ch)
{ char *p;
p=a;
while(*a!=’\0’){
if(*a!=ch)
{ *p=*a; p++; }
a++;
}
*p=’\0’;
}
void main()
{ char s[80],ch;
printf(“请输入字符串:”);
gets(s);
printf(“输入要删除字符:”);
ch=getchar();
del_char(s,ch);
puts(s);
}
33. 编制函数,其功能是在float类型1维数组中查找最大值、最小值并将它们返回到主函数输出。
#include <stdio.h>
void max_min(int *a,int n,int *max,int *min)
{ int *p;
*max=*min=*a;
for(p=a;p<a+n;p++){
if(*p>*max) *max=*p;
if(*p<*min) *min=*p;
}
}
void main()
{ int a[10],i,max,min;
for(i=0;i<10;i++)
scanf(“%d”,a+i);
max_min(a,10,&max,&min);
printf(“max=%d,min=%d\n”,max,min);
}
34. 输入10个数,按绝对值从小到大排序后输出。要求定义一个函数sort,完成绝对值从小到大排序。
#include<stdio.h>
#include<math.h>
void sort(int *a,int n)
{ int i,j,k,t;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(fabs(*(a+j))<fabs(*(a+k))) k=j;
t=*(a+i);*(a+i)=*(a+k);*(a+k)=t;
}
}
void main()
{ int a[10],i;
for(i=0;i<10;i++)
scanf("%d",a+i);
sort(a,10);
for(i=0;i<10;i++)
printf("%d ",*(a+i));
}
35. 输入n和x,n和x分别表示对数组前n个元素赋初值为x。要求定义一个函数value,完成对一维整型数组的n个元素进行赋值,具体赋值x。
#include<stdio.h>
void value(double *a,int n,double x)
{ int i;
for(i=0;i<n;i++)
*(a+i)=x;
}
void main()
{ double a[10],x;
int i,n;
printf (“Input n x:\n");
scanf("%d%lf",&n,&x);
value(a,n,x);
for(i=0;i<n;i++)
printf("%8.2f",*(a+i));
}
36. 定义一个函数,计算两个数的和与乘积。
#include<stdio.h>
void f(double x,double y,double *p,double *q)
{ *p=x+y;
*q=x*y;
}
void main()
{ double a,b,add,mult;
printf ("Input a b:\n");
scanf("%lf%lf",&a,&b);
f(a,b,&add,&mult);
printf("add=%-8.2f mult=%-8.2f\n",add,mult);
}
37. 定义一个函数,将一维数组中最大值及最小值交换位置。
#include<stdio.h>
void f(int *a,int n)
{ int i,*p,*q,t;
for(i=0,p=q=a;i<n;i++)
{ if(*p<*(a+i)) p=a+i;
if(*q>*(a+i)) q=a+i;
}
t=*p;*p=*q;*q=t;
}
void main()
{ int a[10],i;
for(i=0;i<10;i++)
scanf("%d",a+i);
f(a,10);
for(i=0;i<10;i++)
printf("%d ",*(a+i));
}
38. 编写求字符串长度函数strlen,将字符串中小写字母转换成大写字母函数。
#include<stdio.h>
int strlen(char *s)
{ int i;
for(i=0;*(s+i)!='\0';i++);
return i;
}
void cov(char *s)
{ for(;*s!='\0';s++)
if(*s>='a'&&*s<='z') *s-=32;
}
void main()
{ char a[100];
gets(a);
printf("strlen:%d\n",strlen(a));
cov(a);
puts(a);
}
39. 编写函数void fun(int *a, int *n) ,它的功能是:求出1到100之内能被3或者7整除,但不能同时被3和7整除的所有整数,并将他们放在a所指的数组中,通过n返回这些数的个数。
#include<stdio.h>
void fun(int *a, int *n)
{ int i,j;
for(i=1,j=0;i<=100;i++)
if((i%3==0||i%7==0)&&i%21!=0)
{ a[j]=i; j++; }
*n=j;
}
void main()
{ int a[100],i,n;
fun(a,&n);
for(i=0;i<n;i++)
printf("%d ",*(a+i));
}
40. 编程,检查一个5×5二维数组a是否对称(即:对所有i和j都有a[i][j]=a[j][i])。 若是输出YES,否则输出NO
#include<stdio.h>
void main()
{ double a[5][5];
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%lf",*(a+i)+j);
for(i=0;i<5;i++)
for(j=0;j<i;j++)
if(*(*(a+i)+j)!=*(*(a+j)+i))
{ printf("NO\n");
return;
}
printf("YES\n");
}
41. 定义函数int strdel(char *s),删除空格字符并返回空格个数。
#include <stdio.h>
#include <string.h>
int strdel(char *s)
{ int n=0;
for(;*s!='\0';)
if(*s==' ') {
strcpy(s,s+1);
n++;
}
else s++;
return n;
}
void main()
{ char str[80]; int n;
gets(str);
n=strdel(str);
printf("空格数:%d,删除空格后:%s\n",n,str);
}
42. 编写函数void fun(char *s,int b[ ]),统计在s所指向字符串中26个英文字母(不区分大小写)各自出现的次数,并依次放在b所指的数组中,在主函数中输出各字母出现的次数。
#include <stdio.h>
void fun(char *s,int b[ ])
{ char *p;
for(p=s;*p!='\0';p++)
if(*p>='a'&&*p<='z') b[*p-'a']++;
else if(*p>='A'&&*p<='Z') b[*p-'A']++;
}
void main()
{ char str[80]; int a[26]={0},i;
gets(str);fun(str,a);
for(i=0;i<26;i++)
printf("%2c",'A'+i);
printf("\n");
for(i=0;i<26;i++) printf("%2d",a[i]);
printf("\n");
}
43. 函数int fact(char *s,char *t)的功能是:将形参s所指字符串中所有ASCII码值小于97的字符存入形参t所指字符数组中,形成一个新串,并统计出符合条件的字符个数作为函数值返回。
#include <stdio.h>
int fact(char *s,char *t)
{ int n=0;
for(;*s!='\0';s++)
if(*s<97) { *t=*s; t++; n++; }
*t='\0';
return n;
}
void main()
{ char s[80],t[80];
gets(s);
printf("<97:%d\n",fact(s,t));
puts(t);
}
44. 编写程序,输入当天日期,要求输出明天日期(利用结构类型)。
#include <stdio.h>
void main()
{ int m[]={0,31,28,31,30,31,60,31,31,30,31,30,31};
int leap;
struct date { int year,month,day;}d;
printf(“year-month-day:”);
scanf(“%d-%d-%d”,&d.year,&d.month,&d.day);
if(d.year%4==0&&d.year%100!=0||d.year%400==0)
m[2]=29; // 闰年2月份有29天
d.day++;
if(d.day>m[d.month])
{ d.day=1; d.month++;
if(d.month>12)
{ d.year++; d.month=1; }
}
printf(“明天:%d-%d-%d\n”,d.year,d.month,d.day);
}
45. 将1000以内的奇数写入文件design1.dat中。
#include <stdio.h>
main()
{ int a;
FILE *fp;
fp=fopen(“design1.dat”,”w”);
for(a=1;a<=1000;a++)
if(a%2==1) fprintf(fp,“%4d”,a);
fclose(fp);
}
46. 求上题所建文件design1.dat中的数据和,在屏幕上输出结果。
#include <stdio.h>
main()
{ int a,sum=0;
FILE *fp;
fp=fopen(“design1.dat”,”r”);
while(!feof(fp))
{ fscanf(fp,“%d”,&a);
sum+=a;
}
fclose(fp);
printf(“sum=%d\n”,sum);
}
1. 编写程序,输入一个正整数n,求下列算式的值。要求定义和调用函数fact(k)计算k的阶乘,函数返回值的类型是double。
#include <stdio.h>
double fact(int k)
{ double t=1;
int i;
for(i=1;i<=k;i++)
t*=i;
return t;
}
void main()
{ int i,n;
double s=0;
scanf(“%d”,&n);
for(i=1;i<=n;i++)
s+=1/fact(i);
printf(“%f\n”,s);
}
2. 输入一个x,输出下面分段函数f(x)的值。要求将分段函数的计算定义成函数。
#include <stdio.h>
int f(double x) // 函数定义
{ int y=0;
if(x>0)
y=1;
else if(x==0)
y=0;
else
y=-1;
return y;
}
void main()
{ double x;
int y;
scanf(“%lf”,&x);
y=f(x); // 函数调用
printf("f(%g)=%d\n",x,y);
}
3. 输入一个正整数,输出该数的各个数字之和。要求编写函数,计算整数的各个数字之和。
#include <stdio.h>
int sum(int a)
{ int s=0;
while(a!=0){
s+=a%10;
a=a/10;
}
return s;
}
void main()
{ int x;
scanf(“%d”,&x);
printf("%d\n",sum(x));
}
4. 输入两个正整数a和n,求a+aa+aaa+……+aa…a(最后一项为n个a)之和。例如输入2和3,输出246(即2+22+222)。要求定义并调用函数f(a,n),它的功能是返回aa…a(n个a)。例如f(2,3)返回222。
#include <stdio.h>
int f(int a,int n)
{ int s=0;
for(;n>0;n--)
s=s*10+a; // s+=pow(10,n-1)*a;
return s;
}
void main()
{ int a,n,sum=0,i;
printf(“input a n:\n”);
scanf(“%d%d”,&a,&n);
for(i=1;i<=n;i++)
sum+=f(a,i);
printf(“%d\n”,sum);
}
5. 输入三个数,输出它们的最小值。要求定义一个函数,返回两个数的最小值。
#include <stdio.h>
double min(double x,double y)
{ if(x<y)
return x;
else
return y;
}
void main()
{ double x,y,z,t;
scanf(“%lf%lf%lf”,&x,&y,&z);
t=min(x,y);
t=min(t,z);
printf("min:%f\n",t);
}
6. 在主函数中输入字符c和m,调用函数prn,连续将字符c输出m次。定义函数prn,完成连续将某个字符c输出m次后换行。
#include <stdio.h>
void prn(char,int); // 函数声明
void main()
{ char c;
int m;
printf(“Input c m:\n”);
scanf(“%c%d”,&c,&m);
prn(c,m);
}
void prn(char c,int m)
{ int i;
for(i=1;i<=m;i++)
putchar(c);
printf(“\n”);
}
7. 输入一个整数n,计算3.2n的值。要求定义函数计算xn 值。
#include <stdio.h>
double fact(double x,int n);
void main()
{ double x,y;
int n;
printf(“Input x n:\n”);
scanf(“%lf%d”,&x,&n);
y=fact(x,n);
printf(“%f\n”,y);
}
double fact(double x,int n)
{ int i;
double t=1;
for(i=1;i<=n;i++)
t=t*x;
return t;
}
8. 输入平面上p1(x1,x2)、p2(x2,y2)两点坐标,计算两点间的距离输出。要求定义一个函数计算平面上两点间的距离。
#include <stdio.h>
#include <math.h>
double f(double,double,double,double);
void main()
{ double x1,x2,y1,y2,d;
printf(“Input (x1,y1),(x2,y2):\n”);
scanf(“(%lf,%lf),(%lf,%lf)”,&x1,&y1,&x2,&y2);
d=f(x1,y1,x2,y2);
printf(“%f\n”,d);
}
double f(double x1,double y1,double x2,double y2)
{ double d;
d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return d;
}
9. 输出一张摄氏温度——华氏温度转换表。摄氏温度取[-100℃ ~150℃ ],温度间隔5℃ ,要求定义函数ctof(c),将摄氏温度转换为华氏温度,转换公式:F=32+C*9/5
#include <stdio.h>
void main()
{ float c,f, ctof(float); int i;
for(i=0,c=-100;c<=150;c+=5)
{ f=ctof(c);
printf("%6.0f %-6.0f",c,f);
i++;
if(i%5==0) printf("\n");
}
}
float ctof(float c)
{ float f;
f=32+c*9/5;
return f;
}
10. 求11~999之间所有“回文数”之和。要求编制函数 JSValue(m)用于判断m是否为回文数。回文数是指各位数字左右对称,例如11、121、676、909等等。
#include <stdio.h>
int JSValue(int m)
{ int a=0,b;
b=m;
while(b!=0){
a=a*10+b%10;
b=b/10;
}
if(a==m) return 1;
else return 0;
}
void main()
{ int s=0,i;
for(i=11;i<=999;i++)
if(JSValue(i)==1) s+=i;
printf(“%d\n”,s);
}
11. 输入100个学生的数学课程成绩,计算平均分,并统计成绩在平均分数正负10%区间的学生的人数。
#include <stdio.h>
void main()
{ int a[100],i,k=0;
float sum=0,aver;
for(i=0;i<100;i++)
{ scanf(“%d”,&a[i]);
sum+=a[i];
}
aver=sum/100;
for(i=0;i<100;i++)
if(0.9*aver<=a[i]&&a[i]<=1.1*aver) // 当前成绩在平均分数正负10%区间
k++;
printf(“%f,%d\n”,aver,k);
}
12. 输入两个正整数m和n(m<n),求从m到n之间(包括m和n)所有素数的和。要求定义并调用函数isprime(x)来判断x是否是素数。
#include <stdio.h>
int isprime(int x)
{ int i;
for(i=2;i<x;i++)
if(x%i==0) return 0;
return 1;
}
void main()
{ int m,n,s=0,k;
scanf(“%d%d”,&m,&n);
for(k=m;k<=n;k++)
if(isprime(k)==1) s+=k;
printf(“%d\n”,s);
}
13. 输入一个字符串(少于80个字符),再输入一个字符,统计并输出该字符在字符串中出现的次数(例如:输入morning回车,再输入n,输出2)。
#include <stdio.h>
main()
{ char s[80],c;
int i,k=0;
printf("输入字符串:\n");
gets(s);
printf("输入字符:\n");
c=getchar();
for(i=0;s[i]!='\0';i++)
if(s[i]==c) k++;
printf("%s中包含%d个%c\n",s,k,c);
}
14. 输入10组数,每组数3个数,输出每组数的最大值。要求定义并调用函数max(x,y,z)求x、y、z的最大值。
#include <stdio.h>
double max(double x,double y,double z)
{ double m;
m=x;
if(m<y) m=y;
if(m<z) m=z;
return m;
}
void main()
{ double x,y,z,i;
for(i=1;i<=10;i++){
scanf(“%lf%lf%lf”,&x,&y,&z);
printf(“%f\n”,max(x,y,z));
}
}
15. 输入一个字符串,统计其中数字字符出现的次数。
#include <stdio.h>
void main()
{ char s[80];
int i,n=0;
gets(s);
for(i=0;s[i]!='\0';i++)
if(s[i]>='0'&&s[i]<='9')
n++;
printf("%s中包含%d个字符\n",s,n);
}
16. 将一个大小为10的数组b的值按逆序重新存放(数组的值由键盘任意输入,不使用辅助数组)。
#include <stdio.h>
void main()
{ double a[10],t;
int i,j;
for(i=0;i<10;i++)
scanf("%lf",&a[i]);
for(i=0,j=9;i<j;i++,j--)
{ t=a[i];a[i]=a[j];a[j]=t;}
for(i=0;i<10;i++)
printf("%8.2f",a[i]);
}
17. 计算5×5数组周边元素的和。
#include <stdio.h>
void main()
{ double a[5][5],sum=0;
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%lf",&a[i][j]);
for(i=0;i<5;i+=4)
for(j=0;j<5;j++)
sum+=a[i][j]; // 第1、最后两行元素和
for(i=1;i<4;i++)
for(j=0;j<5;j+=4)
sum+=a[i][j]; // 最左、右两列(不包括角上)元素和
printf("%8.2f\n",sum);
}
18. 输入一5行、5列的数组,将数组的每1行均除以该行上的主对角元素(第1行同除以a[0][0],第2行同除以a[1][1],...),然后以行列对齐格式输出数组内容。
#include <stdio.h>
void main()
{ float a[5][5],t;
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%f",&a[i][j]);
for(i=0;i<5;i++)
{ t=a[i][i]; // { for(j=0;j<5;j++)
for(j=0;j<5;j++) // if(i!=j) a[i][j]=a[i][j]/a[i][j];
a[i][j]=a[i][j]/t; // a[i][i]=1; }
}
for(i=0;i<5;i++)
{ for(j=0;j<5;j++)
printf("%8.2f",a[i][j]);
printf("\n");
}
}
19. 输入一个字符串(字符个数少于80),判断是否为回文?若是输出YES,否则输出NO。
解一:
#include <stdio.h>
void main()
{ char s[80];
int i,j;
gets(s);
for(j=0;s[j]!='\0';j++); // 求字符串长度
for(i=0,j--;i<j;i++,j--)
if(s[i]!=s[j])
{ printf("NO\n"); break; }
if(i>=j)
printf("YES\n");
}
解二:
#include <stdio.h>
void main()
{ char s[80];
int i,j,flag=1;
gets(s);
for(j=0;s[j]!='\0';j++);
for(i=0,j--;i<j;i++,j--)
if(s[i]!=s[j]) flag=0;
if(flag==1) printf("YES\n");
else printf("NO\n");
}
20. 编写函数fun,返回一个数组(10个数)中除最大值和最小值以外的平均值。
#include <stdio.h>
double fun(double a[ ],int n)
{ double sum=0,max,min;
int i;
max=min=a[0];
for(i=0;i<n;i++)
{ if(max<a[i]) max=a[i];
else if(min>a[i]) min=a[i];
sum+=a[i]; }
return (sum-max-min)/(n-2);
}
void main()
{ double b[10],v;
int i;
for(i=0;i<10;i++)
scanf("%lf",&b[i]);
v=fun(b,10);
printf("average:%.2f\n",v);
}
21. 在主函数中输入一个正整数x,编写函数f1,它的功能是:求出能整除x且不是偶数的各正整数,并放在数组a中,这些除数的个数返回给主函数。在主函数中输出各除数。
#include <stdio.h>
int f1(int a[ ],int x)
{ int j,n=0;
for(j=1;j<=x/2;j+=2)
if(x%j==0)
{ a[n]=j;
n++;
}
return n;
}
void main()
{ int a[20],i,n,x;
scanf("%d",&x);
n=f1(a,x);
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
}
22. 在主函数中输入6行、6列的数组和变量m的值,编写函数f2,该函数的功能是:将数组左下半三角元素中的值乘以m。在主函数中以行列对齐格式输出该数组。
#include <stdio.h>
void f2(int a[ ][6],int m)
{ int i,j;
for(i=0;i<6;i++)
for(j=0;j<=i;j++)
a[i][j]*=m;
}
void main()
{ int a[6][6],i,j,m;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
scanf("%d",&a[i][j]);
printf("Input m:"); scanf("%d",&m);
f2(a,m); // 调用函数
for(i=0;i<6;i++) {
for(j=0;j<6;j++) printf("%5d",a[i][j]);
printf("\n");
}
}
23. 编写一个函数f3,它的功能是:实现两个字符串的连接。
#include <stdio.h>
void main()
{ char s1[100],s2[40];
void f3(char s1[ ],char s2[ ]);
gets(s1);
gets(s2);
f3(s1,s2);
puts(s1);
}
void f3(char s1[ ],char s2[ ])
{ int i,j;
for(i=0;s1[i]!='\0';i++); // 找s1 中字符串结束位置
for(j=0;s2[j]!='\0';j++,i++)
s1[i]=s2[j]; // 将s2 中字符串连接到s1后
s1[i]='\0'; // 连接后加结束标志
return ;
}
24. 在数组x的10个数中求平均值v,找出与v相差最小的数组元素。
#include <stdio.h>
#include <math.h>
void main()
{ double x[10],v,d;
int i;
for(i=0,v=0;i<10;i++)
{ scanf("%lf",&x[i]);
v+=x[i]; }
v=v/10;
d=x[0];
for(i=1;i<10;i++)
if(fabs(d-v)>fabs(x[i]-v))
d=x[i];
printf("平均值:%-8.2f,与平均值最近元素:%-8.2f\n",v,d);
}
25. 输入n(n≤20)个数放在一维数组中,找出其中最小的数,将它与数组最前面的数交换后输出这些数。
#include <stdio.h>
void main()
{ int i,k,temp,n,a[20];
printf("Input n:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(k=0,i=1;i<n;i++)
if(a[i]<a[k]) k=i;
temp=a[0];a[0]=a[k];a[k]=temp;
for(i=0;i<n;i++) printf("%d ",a[i]);
}
26. 有n(n≤20)个数,已按从小到大顺序排列好,要求输入一个数,把它插到数列中,使数列仍有序,并输出新的数列。
#include <stdio.h>
void main()
{ int i,n,a[21],x;
printf("Input n≤20 :"); scanf("%d",&n);
printf("Input %d numbers:\n",n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
printf("Input x:"); scanf("%d",&x);
for(i=n-1;i>=0;i--)
if(a[i]>x) a[i+1]=a[i];
else break;
a[i+1]=x;
for(i=0;i<n+1;i++) printf("%-6d",a[i]);
}
27. 输入一个5行、6列的数组,找出该数组中绝对值最大的元素、输出该元素及其两个下标值。
#include <stdio.h>
#include <math.h>
void main()
{ int a[5][6],i,j,max,maxi,maxj;
for(i=0;i<5;i++)
for(j=0;j<6;j++) scanf("%d",&a[i][j]);
max=abs(a[0][0]);maxi=maxj=0;
for(i=0;i<5;i++)
for(j=0;j<6;j++)
if(abs(a[i][j])>max)
{ max=abs(a[i][j]); maxi=i; maxj=j; }
printf("max: %d\n",a[maxi][maxj]);
printf("row: %d col: %d\n",maxi,maxj);
}
28. 从键盘输入任意一个整数,统计该整数中出现的不同数字的个数。
#include <stdio.h>
void main()
{ int x,a[10]={0},i,n=0;
printf("Input x:\n");
scanf("%d",&x);
while(x!=0)
{ a[x%10]=1;
x=x/10;
}
for(i=0;i<10;i++)
n+=a[i];
printf("%d\n",n);
}
29. 三角形面积公式为:
其中 s=(a+b+c)/2
a、b、c分别是三角形的三条边。请分别定义计算s和area的宏,写程序,在程序中用带实参的宏名来求面积。
#include <stdio.h>
#include <math.h>
#define s(a,b,c) (a+b+c)/2
#define area(a,b,c,s) sqrt(s*(s-a)*(s-b)*(s-c))
main()
{ double x,y,z,d,t;
scanf(“%lf%lf%lf”,&x,&y,&z);
if(x+y>z&&x+z>y&&y+z>x) {
d=s(x,y,z);
t=area(x,y,z,d);
printf(“area=%f\n”,t);
}
else printf(“error!\n”);
}
30. 编程,输入一个正整数,将其转换成二进制数。
#include <stdio.h>
main()
{ int x,a[32],i,j;
printf("Enter x:");
scanf("%d",&x);
for(i=0;x!=0;i++) {
a[i]=x%2;
x/=2;
}
for(j=i-1;j>=0;j--)
printf("%d",a[j]);
printf("\n");
}
31. 输入一行字符,统计并输出其中英文字母、数字字符、空格和其他字符的个数。
#include <stdio.h>
void main()
{ char str[80];
int zm,sz,kg,qt,i;
zm=sz=kg=qt=0;
gets(str);
for(i=0;str[i]!='\0';i++)
if(str[i]>='A'&&str[i]<='Z'|| str[i]>='a'&&str[i]<='z')zm++;
else if(str[i]>='0'&&str[i]<='9') sz++;
else if(str[i]==' ') kg++;
else qt++;
printf(" 字母=%d,数字=%d,空格=%d,其它=%d\n",zm,sz,kg,qt);
}
32. 编制函数del_char,函数原型为 void del_char(char *a,char ch),函数的功能是删除a指向的字符串中的值为ch的字符。例如从字符串"AscADef" 中删除 'A' 后,字符串为"scDef"。
#include <stdio.h>
void del_char(char *a,char ch)
{ char *p;
p=a;
while(*a!=’\0’){
if(*a!=ch)
{ *p=*a; p++; }
a++;
}
*p=’\0’;
}
void main()
{ char s[80],ch;
printf(“请输入字符串:”);
gets(s);
printf(“输入要删除字符:”);
ch=getchar();
del_char(s,ch);
puts(s);
}
33. 编制函数,其功能是在float类型1维数组中查找最大值、最小值并将它们返回到主函数输出。
#include <stdio.h>
void max_min(int *a,int n,int *max,int *min)
{ int *p;
*max=*min=*a;
for(p=a;p<a+n;p++){
if(*p>*max) *max=*p;
if(*p<*min) *min=*p;
}
}
void main()
{ int a[10],i,max,min;
for(i=0;i<10;i++)
scanf(“%d”,a+i);
max_min(a,10,&max,&min);
printf(“max=%d,min=%d\n”,max,min);
}
34. 输入10个数,按绝对值从小到大排序后输出。要求定义一个函数sort,完成绝对值从小到大排序。
#include<stdio.h>
#include<math.h>
void sort(int *a,int n)
{ int i,j,k,t;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(fabs(*(a+j))<fabs(*(a+k))) k=j;
t=*(a+i);*(a+i)=*(a+k);*(a+k)=t;
}
}
void main()
{ int a[10],i;
for(i=0;i<10;i++)
scanf("%d",a+i);
sort(a,10);
for(i=0;i<10;i++)
printf("%d ",*(a+i));
}
35. 输入n和x,n和x分别表示对数组前n个元素赋初值为x。要求定义一个函数value,完成对一维整型数组的n个元素进行赋值,具体赋值x。
#include<stdio.h>
void value(double *a,int n,double x)
{ int i;
for(i=0;i<n;i++)
*(a+i)=x;
}
void main()
{ double a[10],x;
int i,n;
printf (“Input n x:\n");
scanf("%d%lf",&n,&x);
value(a,n,x);
for(i=0;i<n;i++)
printf("%8.2f",*(a+i));
}
36. 定义一个函数,计算两个数的和与乘积。
#include<stdio.h>
void f(double x,double y,double *p,double *q)
{ *p=x+y;
*q=x*y;
}
void main()
{ double a,b,add,mult;
printf ("Input a b:\n");
scanf("%lf%lf",&a,&b);
f(a,b,&add,&mult);
printf("add=%-8.2f mult=%-8.2f\n",add,mult);
}
37. 定义一个函数,将一维数组中最大值及最小值交换位置。
#include<stdio.h>
void f(int *a,int n)
{ int i,*p,*q,t;
for(i=0,p=q=a;i<n;i++)
{ if(*p<*(a+i)) p=a+i;
if(*q>*(a+i)) q=a+i;
}
t=*p;*p=*q;*q=t;
}
void main()
{ int a[10],i;
for(i=0;i<10;i++)
scanf("%d",a+i);
f(a,10);
for(i=0;i<10;i++)
printf("%d ",*(a+i));
}
38. 编写求字符串长度函数strlen,将字符串中小写字母转换成大写字母函数。
#include<stdio.h>
int strlen(char *s)
{ int i;
for(i=0;*(s+i)!='\0';i++);
return i;
}
void cov(char *s)
{ for(;*s!='\0';s++)
if(*s>='a'&&*s<='z') *s-=32;
}
void main()
{ char a[100];
gets(a);
printf("strlen:%d\n",strlen(a));
cov(a);
puts(a);
}
39. 编写函数void fun(int *a, int *n) ,它的功能是:求出1到100之内能被3或者7整除,但不能同时被3和7整除的所有整数,并将他们放在a所指的数组中,通过n返回这些数的个数。
#include<stdio.h>
void fun(int *a, int *n)
{ int i,j;
for(i=1,j=0;i<=100;i++)
if((i%3==0||i%7==0)&&i%21!=0)
{ a[j]=i; j++; }
*n=j;
}
void main()
{ int a[100],i,n;
fun(a,&n);
for(i=0;i<n;i++)
printf("%d ",*(a+i));
}
40. 编程,检查一个5×5二维数组a是否对称(即:对所有i和j都有a[i][j]=a[j][i])。 若是输出YES,否则输出NO
#include<stdio.h>
void main()
{ double a[5][5];
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%lf",*(a+i)+j);
for(i=0;i<5;i++)
for(j=0;j<i;j++)
if(*(*(a+i)+j)!=*(*(a+j)+i))
{ printf("NO\n");
return;
}
printf("YES\n");
}
41. 定义函数int strdel(char *s),删除空格字符并返回空格个数。
#include <stdio.h>
#include <string.h>
int strdel(char *s)
{ int n=0;
for(;*s!='\0';)
if(*s==' ') {
strcpy(s,s+1);
n++;
}
else s++;
return n;
}
void main()
{ char str[80]; int n;
gets(str);
n=strdel(str);
printf("空格数:%d,删除空格后:%s\n",n,str);
}
42. 编写函数void fun(char *s,int b[ ]),统计在s所指向字符串中26个英文字母(不区分大小写)各自出现的次数,并依次放在b所指的数组中,在主函数中输出各字母出现的次数。
#include <stdio.h>
void fun(char *s,int b[ ])
{ char *p;
for(p=s;*p!='\0';p++)
if(*p>='a'&&*p<='z') b[*p-'a']++;
else if(*p>='A'&&*p<='Z') b[*p-'A']++;
}
void main()
{ char str[80]; int a[26]={0},i;
gets(str);fun(str,a);
for(i=0;i<26;i++)
printf("%2c",'A'+i);
printf("\n");
for(i=0;i<26;i++) printf("%2d",a[i]);
printf("\n");
}
43. 函数int fact(char *s,char *t)的功能是:将形参s所指字符串中所有ASCII码值小于97的字符存入形参t所指字符数组中,形成一个新串,并统计出符合条件的字符个数作为函数值返回。
#include <stdio.h>
int fact(char *s,char *t)
{ int n=0;
for(;*s!='\0';s++)
if(*s<97) { *t=*s; t++; n++; }
*t='\0';
return n;
}
void main()
{ char s[80],t[80];
gets(s);
printf("<97:%d\n",fact(s,t));
puts(t);
}
44. 编写程序,输入当天日期,要求输出明天日期(利用结构类型)。
#include <stdio.h>
void main()
{ int m[]={0,31,28,31,30,31,60,31,31,30,31,30,31};
int leap;
struct date { int year,month,day;}d;
printf(“year-month-day:”);
scanf(“%d-%d-%d”,&d.year,&d.month,&d.day);
if(d.year%4==0&&d.year%100!=0||d.year%400==0)
m[2]=29; // 闰年2月份有29天
d.day++;
if(d.day>m[d.month])
{ d.day=1; d.month++;
if(d.month>12)
{ d.year++; d.month=1; }
}
printf(“明天:%d-%d-%d\n”,d.year,d.month,d.day);
}
45. 将1000以内的奇数写入文件design1.dat中。
#include <stdio.h>
main()
{ int a;
FILE *fp;
fp=fopen(“design1.dat”,”w”);
for(a=1;a<=1000;a++)
if(a%2==1) fprintf(fp,“%4d”,a);
fclose(fp);
}
46. 求上题所建文件design1.dat中的数据和,在屏幕上输出结果。
#include <stdio.h>
main()
{ int a,sum=0;
FILE *fp;
fp=fopen(“design1.dat”,”r”);
while(!feof(fp))
{ fscanf(fp,“%d”,&a);
sum+=a;
}
fclose(fp);
printf(“sum=%d\n”,sum);
}