1.最有用的C程序
#include<stdio.h>
int main()
{
printf("hello world.\n");
}
2.输入三个数找最大者
#include<stdio.h>
int main()
{
int a,b,c;
printf("请输入三个数:");
scanf("%d%d%d",&a,&b,&c);
if(a<b)a=b;
if(a<c)a=c;
printf("最大数为:%d\n",a);
return 0;
}
3.互换两个变量的值
#include<stdio.h>
int main()
{
int a,b,c;
printf("请输入两个数a,b:");
scanf("%d%d",&a,&b);
c=a;a=b;b=c;
printf("a=%d,b=%d\n",a,b);
return 0;
}
4.输入三个数从大到小输出
#include<stdio.h>
int main()
{
int a,b,c,d;
printf("请输入三个数:");
scanf("%d%d%d",&a,&b,&c);
if(a<b){d=a;a=b;b=d;}
if(a<c){d=a;a=c;c=d;}
if(b<c){d=b;b=c;c=d;}
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
5.输入三角形三边长求求面积
#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,d,area;
printf("请输入三边长:");
scanf("%f%f%f",&a,&b,&c);
d=(a+b+c)/2;
//面积公式。sqrt是求算术平方根
area=sqrt(d*(d-a)*(d-b)*(d-c));
printf("面积为:%f\n",area);
return 0;
}
6.输入半径、圆柱高,求圆周长、圆面积、球表面积、球体积、圆柱体积
#include<stdio.h>
#define PI 3.1415926
int main()
{
float r,h,zc,ym,qm,qt,zt;
printf("请输入半径和圆柱高:");
scanf("%f%f",&r,&h);
//圆周长
zc=r*PI*2;
//圆面积
ym=r*r*PI;
//球面积
qm=4*PI*r*r;
//球体积
qt=4.0/3.0*PI*r*r*r;
//柱体积
zt=PI*r*r*h;
printf("周长:%f, 圆面积:%f, 球面积:%f\n球体积:%f, 柱体积:%f.\n",zc,ym,qm,qt,zt);
return 0;
}
7.输入大写字母将其转换为小写字母
#include<stdio.h>
int main()
{
char c;
c=getchar();
c=c+32;
putchar(c);
putchar('\n');
return 0;
}
8.判断闰年
能被4整除,不能被100整除或者能被400整除的是闰年
#include<stdio.h>
int main()
{
int a;
printf("请输入需要判断的年份:");
scanf("%d",&a);
if(a%4==0)
if(a%100!=0)printf("%d是闰年\n",a);
else
if(a%400==0)printf("%a是闰年\n",a);
else printf("%d不是闰年。\n",a);
else printf("%d不是闰年.\n",a);
return 0;
}
9.求方程解
方程有四种情况:不是方程,有两个相同的实根,有两个不等的实根,有两个共轭复根
#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,disc,x1,x2,real,imag;
printf("请输入三个数:");
scanf("%f%f%f",&a,&b,&c);
if(fabs(a)<=1e-6)printf("这不是方程\n");
else
{
disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)
printf("此方程有两个相同的根:%f\n",-b/(2.0*a));
else
if(disc>1e-6)
{
x1=(-b+sqrt(disc))/(2.0*a);
x2=(-b-sqrt(disc))/(2.0*a);
printf("此方程有两个不等的实根%f和%f\n",x1,x2);
}
else
{
real=-b/(2.0*a);
imag=sqrt(-disc)/(2.0*a);
printf("此方程有两个共轭复根:%f+%fi和%f-%fi\n",real,imag,real,imag);
}
}
return 0;
}
10.输入一个不多于5位的数,求位数、每位数、倒序
#include<stdio.h>
int main()
{
int a,gs,gw,sw,bw,qw,ww;
printf("请输入一个不超过五位的数:");
scanf("%d",&a);
//判断是几位数
if(a>9999)gs=5;
else if(a>999)gs=4;
else if(a>99)gs=3;
else if(a>9)gs=2;
else gs=1;
printf("这个数是%d位数。\n",gs);
//求出每位数
gw=a%10;
sw=(a%100-gw)/10;
bw=(a%1000-sw*10-gw)/100;
qw=a/1000-ww*10;
ww=a/10000;
printf("万位:%d,千位:%d,百位:%d,十位:%d,个位:%d\n",ww,qw,bw,sw,gw);
//判断几位数,输出倒序
switch(gs)
{
case 1:printf("倒序是%d\n",gw);break;
case 2:printf("倒序是%d%d\n",gw,sw);break;
case 3:printf("倒序是%d%d%d\n",gw,sw,bw);break;
case 4:printf("倒序是%d%d%d%d\n",gw,sw,bw,qw);break;
case 5:printf("倒序是%d%d%d%d%d\n",gw,sw,bw,qw,ww);break;
}
return 0;
}
11.求PI
#include<stdio.h>
#include<math.h>
int main()
{
int sign=1;
double pi=0.0,fm=1.0,mx=1.0;
while(fabs(mx)>=1e-6)
{
//将每项的值加起来
pi=pi+mx;
//每项的分子与符号
sign=-sign;
//每项分母
fm=fm+2;
//每项的值
mx=sign/fm;
}
pi=4*pi;
printf("pi=%10.8f\n",pi);
return 0;
}
12.斐波那契数列
前40个数
#include<stdio.h>
int main()
{
int f1=1,f2=1,i;
for(i=1;i<=20;i++)
{
//每次循环输出两项数
printf("%12d%12d",f1,f2);
//计算下次循环需要输出的两个数
f1=f1+f2;
f2=f1+f2;
//每输出4个数输出一次回车
if(i%2==0)printf("\n");
}
return 0;
}
13.求100~200的素数
#include<stdio.h>
int main()
{
int i,k;
for(i=100;i<=200;i++)
{
//用i与2~i取余,余数为0跳出循环
for(k=2;k<i;k++)if(i%k==0)break;
//判断k与i,素数只能被1与它本身整除
if(k>=i)printf("%4d",i);
}
printf("\n");
return 0;
}
14.输入一串字符将每个字母输出为他后面第4个字母
#include<stdio.h>
int main()
{
char c;
c=getchar();
//判断输入结束没
while(c!='\n')
{
//判断是否是字母
if((c>='a'&&c<='z')||(c<='Z'&&c>='A'))c=c+4;
//将超过字母ASCII码的修改
if((c>'Z'&&c<'a')||c>'z')c=c-26;
putchar(c);
c=getchar();
}
putchar('\n');
return 0;
}
15.输出指定数列
#include<stdio.h>
int main()
{
int a,b,x,y;
printf("请输入数列行和列:");
scanf("%d%d",&a,&b);
for(x=1;x<=a;x++)
{
for(y=1;y<=b;y++)printf("%4d",x*y);
printf("\n");
}
return 0;
}
16.输入两个数,求最大公约数和最小公倍数
#include<stdio.h>
int main()
{
int a,b,c,d,e;
printf("请输入两个数:");
scanf("%d%d",&a,&b);
//确定那个数大
if(a>b){c=a;a=b;b=c;}
e=a*b;
//判断余数是否为0
while(a!=0)
{
//取出每次的余数
d=b%a;
b=a;
a=d;
}
printf("最大公约数为:%d\n",b);
printf("最小公倍数为:%d\n",e/b);
return 0;
}
17.统计输入字符串中,英文字母、空格、数字和其他字符个数
#include<stdio.h>
int main()
{
char c;
int yw=0,sz=0,kg=0,qt=0;
while((c=getchar())!='\n')
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))yw++;
else if(c>='0'&&c<='9')sz++;
else if(c==' ')kg++;
else qt++;
}
printf("英文数:%d,数字数:%d,空格数:%d,其他:%d\n",yw,sz,kg,qt);
return 0;
}
18.求一个多项式
S=2+22+222+......+22222 此时a=2,n=5。求任意a,n时S值
#include<stdio.h>
int main()
{
int a,n,i,S=0,mx=0;
printf("请输入a,n:");
scanf("%d%d",&a,&n);
for(i=1;i<=n;i++)
{
//计算每项的值
mx=mx+a;
//累加
S=S+mx;
a=a*10;
}
printf("S=%d\n",S);
return 0;
}
19.求1~20中每个数的阶乘的和
#include<stdio.h>
int main()
{
int i;
double mx=1,he=0;
for(i=1;i<=20;i++)
{
//mx每次循环乘i+1
mx=mx*i;
//he每次在mx乘i后累加
he=he+mx;
}
//因为int占4字节,double占8字节,int存不下这么大的数
printf("%22.15e\n",he);
return 0;
}
20.水仙花数
#include<stdio.h>
int main()
{
int i,gw,sw,bw;
for(i=100;i<1000;i++)
{
gw=i%10;
sw=(i%100-gw)/10;
bw=i/100;
//水仙花数就是各个位的立方相加等于本身
if(i==gw*gw*gw+sw*sw*sw+bw*bw*bw)printf("%4d",i);
}
printf("\n");
return 0;
}
21.完数
#include<stdio.h>
int main()
{
int a,b,c;
for(a=2;a<1000;a++)
{
c=0;
//求因子和
for(b=1;b<a;b++)
if(a%b==0)c=c+b;
//判断因子和与a是否相等
if(c==a)
{
printf("%d是完数,",a);
//输出完数的所有因子
for(c=1;c<a;c++)
if(a%c==0)printf("%d ",c);
printf("\n");
}
}
return 0;
}
22.一个球从100米落下每次回弹高度少一半,求第十次落地共弹多少米,第十次反弹多高
#include<stdio.h>
int main()
{
int i;
//第一次落地
double g=100,h=g/2;
//循环9次
for(i=1;i<10;i++)
{
g=g+2*h;
h=h/2;
}
printf("总距离:%f,第十次弹起高度:%f\n",g,h);
return 0;
}
23.猴子吃桃
#include<stdio.h>
int main()
{
int day,tao,sheng;
//第9天剩一个桃子
for(day=9,sheng=1;day>=1;day--)
{
//第九天吃之前的桃子数量
tao=(sheng+1)*2;
sheng=tao;
}
printf("一共摘了%d个桃子\n",tao);
}
24.迭代法
#include<stdio.h>
#include<math.h>
int main()
{
float a,x1,x2;
printf("请输入一个数:");
scanf("%f",&a);
//假设一个值满足循环条件
x1=a/2;
//求第一次迭代值
x2=(x1+a/x1)/2;
//求x的两次迭代差在0.00001之内
do
{
//x1为上一次迭代的值
x1=x2;
//进行下一次迭代
x2=(x1+a/x1)/2;
}while(fabs(x2-x1)>1e-5);
printf("%f的平方根是%f\n",a,x2);
return 0;
}
25.输出菱形
#include<stdio.h>
int main()
{
int a,b,c;
for(a=0;a<4;a++)
{
for(b=0;b<6-2*a;b++)printf(" ");
for(c=0;c<1+2*a;c++)printf("* ");
printf("\n");
}
for(a=0;a<4;a++)
{
for(b=0;b<2+2*a;b++)printf(" ");
for(c=0;c<5-2*a;c++)printf("* ");
printf("\n");
}
}
26.比赛名单
甲队ABC,乙队XYZ,A不与X比,C不与XZ比
#include<stdio.h>
int main()
{
char x,y,z;
for(x='x';x<='z';x++)
for(y='x';y<='z';y++)
if(x!=y)
for(z='x';z<='z';z++)
//将所有可能的名单列出
if(x!=z&&y!=z)
//排除A与X比赛,C与XZ比赛
if(x!='x'&&z!='x'&&z!='z')
printf("a--%c\nb--%c\nc--%c\n",x,y,z);
return 0;
}
27.对数组依次赋值
#include<stdio.h>
int main()
{
int i,j[10];
for(i=0;i<10;i++)
{
//像数组每个元素赋值
j[i]=i;
//输出数组每个元素的值
printf("%d ",j[i]);
}
printf("\n");
return 0;
}
28.用数组解决斐波那契问题
#include<stdio.h>
int main()
{
int i,j[40]={1,1};
//为数组每个元素赋值
for(i=2;i<40;i++)j[i]=j[i-1]+j[i-2];
//每行输出5个数
for(i=0;i<40;i++)
{
if(i%5==0&&i!=0)printf("\n");
printf("%12d",j[i]);
}
printf("\n");
return 0;
}
29.冒泡排序
#include<stdio.h>
int main()
{
int i,j,a,s[10];
printf("请输入十个数:");
for(i=0;i<10;i++)scanf("%d",&s[i]);
//进行九次比较
for(i=0;i<9;i++)
//从数组最后一个元素开始依次比较
for(j=9;j>i;j--)
//如果后一位大于前一位将他两换位
if(s[j]>s[j-1])
{
a=s[j];
s[j]=s[j-1];
s[j-1]=a;
}
for(i=0;i<10;i++)printf("%3d",s[i]);
printf("\n");
return 0;
}
30.将一个二维数组与另一个数组的行和列元素值互换
#include<stdio.h>
int main()
{
int i,j,s[3][4],s1[4][3];
printf("请输入3X4数组各个数:");
for(j=0;j<3;j++)
for(i=0;i<4;i++)scanf("%d",&s[j][i]);
//遍历3X4数组
for(j=0;j<3;j++)
{
for(i=0;i<4;i++)
{
printf("%4d",s[j][i]);
//将3X4数组各个元素行列互换到4X3数组中
s1[i][j]=s[j][i];
}
printf("\n");
}
printf("\n");
//打印4X3数组
for(j=0;j<4;j++)
{
for(i=0;i<3;i++)printf("%4d",s1[j][i]);
printf("\n");
}
return 0;
}
31.求二维数组内最大数
#include<stdio.h>
int main()
{
int i,j,s[3][4],max,z;
printf("请输入3X4数组:");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&s[i][j]);
//讲数组第一个数赋给max
max=s[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
//将数组每个元素与max进行比较
if(s[i][j]>max)max=s[i][j];
printf("max=%d\n",max);
return 0;
}
33.字符数组
#include<stdio.h>
int main()
{
char c,cs[10];
int i=0;
printf("请输入字符(不用空格隔开):");
c=getchar();
//将字符存入字符数组
while(c!='\n')
{
cs[i]=c;
i++;
c=getchar();
}
//输出字符数组各个元素
for(i=0;i<10;i++)printf("%c",cs[i]);
printf("\n");
//sizeof计算字符数组长度
printf("%d\n",sizeof(cs));
return 0;
}
34.字符函数
#include<stdio.h>
#include<string.h>
int main()
{
char c1[20],c2[10];
//获取字符串
printf("输入c2:");
gets(c2);
//输出字符串
printf("输出c2:");
puts(c2);
printf("输入c1:");
//将c2接到c1后
gets(c1);
printf("输出c1:");
puts(c1);
strcat(c1,c2);
printf("连接后输出c1:");
puts(c1);
//复制字符串
printf("复制后c1:");
strcpy(c1,c2);
puts(c1);
printf("复制指定字符串后c1:");
strcpy(c1,"zhiding");
puts(c1);
//将c2中前两个字符复制到c1
printf("将c2中前两个字符复制到c1前两个:");
strncpy(c1,c2,2);
puts(c1);
//字符串比较
printf("较大字符串:");
puts(strcmp(c1,c2)>0?c1:c2);
//测字符串长度
printf("c1长度:%d\n",strlen(c1));
printf("c2长度:%d\n",strlen(c2));
//将c2小写转大写
printf("大写c2:");
strupr(c2);
puts(c2);
//将c2大写转小写
printf("小写c2:");
strlwr(c2);
puts(c2);
return 0;
}
35.输入一行字符统计有多少的单词
#include<stdio.h>
#include<string.h>
int main()
{
char c[100];
int dc=0,kg=0,i;
printf("请输入句子:");
gets(c);
//遍历输入所有字符
for(i=0;i<sizeof(c);i++)
//如果是空格,空格数为0
if(c[i]==' ')kg=0;
//如果空格为0,那他后面必定会有一个单词
else if(kg==0)
{
kg=1;
dc++;
}
printf("一共有%d个单词\n",dc);
return 0;
}
36.输入若干字符串,求最大的字符串
#include<stdio.h>
#include<string.h>
int main()
{
char c[3][20],max[20];
int i,j;
//接收3个字符串
for(i=0;i<3;i++)
{
printf("请输入第%d个字符串",i+1);
gets(c[i]);
}
strcpy(max,c[0]);
//比较大小
for(i=0;i<3;i++)
if(strcmp(max,c[i])<0)strcpy(max,c[i]);
printf("max=%s\n",max);
return 0;
}
37.筛选法求100内素数
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,n,a[100];
for(i=0;i<100;i++)a[i]=i+1;
a[0]=0;
//100以内的数除数不可能大于100的开方
for(i=1;i<sqrt(100);i++)
//遍历数组
for(j=i+1;j<100;j++)
{
if(a[i]!=0&&a[j]!=0)
//如果能被除尽,不是素数
if(a[j]%a[i]==0)
a[j]=0;
}
for(i=1,n=0;i<100;i++)
{
if(a[i]!=0){printf("%5d",a[i]);n++;}
if(n==10){printf("\n");n=0;}
}
printf("\n");
return 0;
}
38.求矩阵对角线和
#include<stdio.h>
int main()
{
int i,j,s[3][3],sum=0,sum1=0;
printf("请输入十个数:");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&s[i][j]);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%3d",s[i][j]);
//主对角线和
if(i==j)sum=sum+s[i][j];
//副对角线
if(i+j==2)sum1=sum1+s[i][j];
}
printf("\n");
}
printf("主对角线和:%d\n",sum);
printf("副对角线和:%d\n",sum1);
}
39.插入一个数到数组,数组顺序不变
#include<stdio.h>
int main()
{
int a[11],x,i,j,z;
printf("请输入十个数:");
for(i=0;i<10;i++)scanf("%d",&a[i]);
//将输入的数从小到大排列
for(i=0;i<9;i++)
if(a[i]>a[i+1])
{
x=a[i];
a[i]=a[i+1];
a[i+1]=x;
}
for(i=0;i<10;i++)printf("%4d",a[i]);
printf("\n");
printf("请输入要插入的数:");
scanf("%d",&x);
//判断x应该插入到那个元素
for(i=0;i<10;i++)
if(x<a[i])break;
//将x插入元素后面的元素后移一位
for(j=10;j>i;j--)
a[j]=a[j-1];
a[i]=x;
for(i=0;i<11;i++)printf("%4d",a[i]);
printf("\n");
return 0;
}
40.杨辉三角
输出前十行
#include<stdio.h>
int main()
{
int i,j,a[10][10];
//先将每行第一个和最后一个元素复制
for(i=0;i<10;i++)
{
a[i][0]=1;
a[i][i]=1;
}
//从第三行开始
for(i=2;i<10;i++)
for(j=1;j<=i-1;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
//输出
for(i=0;i<10;i++)
{
for(j=0;j<=i;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
41.魔方阵
#include<stdio.h>
int main()
{
int a[15][15],i,j,k,p,n;
p=1;
while(p==1)
{
printf("请输入1~15中任意奇数:");
scanf("%d",&n);
//判断是否为奇数
if((n!=0)&&(n<16)&&(n%2!=0))p=0;
}
//是数组元素全为0
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)a[i][j]=0;
//确定中间列
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
//确定下一个数应该存放的位置
i=i-1;
j=j+1;
if((i<1)&&(j>n))
{
i=i+2;
j=j-1;
}
else
{
if(i<1)i=n;
if(j>n)j=1;
}
//判断此位置是否已经有数值
if(a[i][j]==0)a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
//输出数组
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)printf("%5d",a[i][j]);
printf("\n");
}
return 0;
}
42. 找鞍点,本行最大,本列最小为鞍点(可能没有)
#include<stdio.h>
int main()
{
int a[4][5],i,j,k,maxi,maxj,ad;
//接收数组
printf("请输入数组(4X5):");
for(i=0;i<4;i++)
for(j=0;j<5;j++)scanf("%d",&a[i][j]);
//遍历数组
for(i=0;i<4;i++)
{
//先随便设置一个元素为鞍点
maxi=a[i][0];
maxj=0;
//判断此元素是否是本行最大数,不是就将最大元素赋值,并取出列
for(j=0;j<5;j++)
if(a[i][j]>maxi)
{
maxi=a[i][j];
maxj=j;
}
//假设此元素为鞍点
ad=1;
//判断此元素是否为本列最小数,不是就没有鞍点
for(k=0;k<4;k++)
if(maxi>a[k][maxj])
{
ad=0;
continue;
}
if(ad)
{
printf("鞍点a[%d][%d]=%d\n",i,maxj,maxi);break;
}
}
if(!ad)printf("此数组无鞍点\n");
return 0;
}
43.折半法
#include<stdio.h>
#define N 15
int main()
{
int i,j,z,a[N],n,flag=1,sign,top,bott,local,mid;
char c;
printf("请输入%d个数:",N);
for(i=0;i<N;i++)scanf("%d",&a[i]);
//将数组从大到小排序
for(i=0;i<N-1;i++)
for(j=i;j<N;j++)
if(a[i]<a[j])
{z=a[i];a[i]=a[j];a[j]=z;}
for(i=0;i<N;i++)printf("%4d",a[i]);
printf("\n");
//开始判断
while(flag)
{
printf("请输入要找到数:");
scanf("%d",&n);
//设置查找范围,sign假设有此数
sign=1;top=0;bott=N-1;
//超过数组最大最小数
if((n>a[0])||(n<a[N-1]))local=-1;
//开始查找
while(sign&&(top<=bott))
{
mid=(top+bott)/2;
if(n==a[mid])
{
local=mid;
printf("找到%d了,他是第%d位数\n",n,local+1);
sign=0;
}
//如果大于中间数,将查找范围改为前半部分,反之改为后半部分
else if(n>a[mid])bott=mid-1;
else top=mid+1;
}
//判断有没有此数
if(sign||local==-1)printf("没有%d\n",n);
printf("是否要继续查找(y/n):");
scanf(" %c",&c);
//判断是否需要继续查找
if((c=='n')||(c=='N'))flag=0;
}
return 0;
}
44.输入若干字符串统计其内容
#include<stdio.h>
int main()
{
int i,j,d,x,s,k,q;
char a[3][80];
d=x=s=k=q=0;
for(i=0;i<3;i++)
{
printf("请输第%d个字符串:",i+1);
gets(a[i]);
for(j=0;j<80&&a[i][j]!='\0';j++)
{
if((a[i][j]>='A')&&(a[i][j]<='Z'))d++;
else if((a[i][j]>='a')&&(a[i][j]<='z'))x++;
else if(a[i][j]==' ')k++;
else if((a[i][j]>='0')&&(a[i][j]<='9'))s++;
else q++;
}
}
printf("大写%d,小写%d,数字%d,空格%d,其他%d\n",d,x,s,k,q);
return 0;
}
45.基础函数
#include<stdio.h>
int main()
{
//函数声明
int add(int x,int y);
int a,b,d;
printf("请输入两个数:");
scanf("%d%d",&a,&b);
//调用函数,将返回值赋给d
d=add(a,b);
printf("和为%d\n",d);
return 0;
}
//函数定义
int add(int x,int y)
{
int z;
z=x+y;
return z;
}
46.函数嵌套调用
#include<stdio.h>
int main()
{
int a,b,c,d,max;
int max1(int a,int b,int c,int d);
printf("请输入4个数:");
scanf("%d%d%d%d",&a,&b,&c,&d);
max=max1(a,b,c,d);
printf("max=%d\n",max);
return 0;
}
int max1(int a,int b,int c,int d)
{
int m(int x,int y);
int max;
max=m(a,b);
max=(max,c);
max=(max,d);
return max;
}
int m(int x,int y)
{
return x>y?x:y;
}
47.函数递归调用
每个学生比上一个大2岁
#include<stdio.h>
int main()
{
int age(int n);
int n;
printf("需要知道第几个学生的年纪:");
scanf("%d",&n);
printf("第%d个学生的年纪是:%d\n",n,age(n));
return 0;
}
int age(int n)
{
int c;
if(n==1)c=10;
else c=age(n-1)+2;
return c;
}
48.递归求阶乘
#include<stdio.h>
int main()
{
int fac(int n);
int n;
printf("请输入阶乘数:");
scanf("%d",&n);
printf("%d阶乘为%d\n",n,fac(n));
return 0;
}
int fac(int n)
{
int sum;
if(n==1)sum=1;
else sum=fac(n-1)*n;
return sum;
}
//如果超过int类型存储范围,用double型,%e输出
49.汉诺塔问题
#include<stdio.h>
int main()
{
void hanoi(int n,char o,char tw,char th);
int m;
printf("输入盘子数量");
scanf("%d",&m);
hanoi(m,'A','B','C');
return 0;
}
void hanoi(int n,char o,char tw,char th)
{
void move(char x,char y);
//只有一个盘子将其直接放到C上
if(n==1)move(o,th);
else
{
//不止一个盘子时,将其他盘子视为整体放到B上
hanoi(n-1,o,th,tw);
//再将A上盘子放到C上
move(o,th);
//将B上剩余盘子放到C上
hanoi(n-1,tw,o,th);
}
}
void move(char x,char y)
{ printf("%c->%c\n",x,y);}
50.数组元素作为参数
#include<stdio.h>
int main()
{
int max(int x,int y);
int a[10],i,m,n;
printf("请输入十个数:");
for(i=0;i<10;i++)scanf("%d",&a[i]);
for(i=0,m=a[0];i<10;i++)
{
if(max(m,a[i])>m)
{
m=max(m,a[i]);
n=i;
}
}
printf("最大数是%d,他是第%d个数\n",m,n+1);
}
int max(int x,int y)
{
return (x>y?x:y);
}
51.函数名作为函数参数
#include<stdio.h>
int main()
{
float ave(float a[10]);
float c[];
int i;
printf("请输入十个学生的成绩:");
for(i=0;i<10;i++)scanf("%f",&c[i]);
printf("平均成绩为:%5.2f\n",ave(c));
return 0;
}
float ave(float a[])
{
float sum=0,aver;
int i;
for(i=0;i<10;i++)sum=sum+a[i];
aver=sum/i;
return aver;
}
52.函数实现选择法排序
#include<stdio.h>
int main()
{
void px(int a[],int i);
int a[10],i;
printf("请输入十个数:");
for(i=0;i<10;i++)scanf("%d",&a[i]);
for(i=0;i<10;i++)printf("%5d",a[i]);
printf("\n");
px(a,i);
for(i=0;i<10;i++)printf("%5d",a[i]);
printf("\n");
return 0;
}
void px(int a[],int i)
{
int x,y,z;
for(x=0;x<i-1;x++)
for(y=x;y<i;y++)
if(a[x]>a[y])
{z=a[x];a[x]=a[y];a[y]=z;}
}
53.多维数组做函数参数
#include<stdio.h>
int main()
{
int max(int a[][3],int i);
int a[2][3],i,j;
printf("请输入6个数:");
for(i=0;i<2;i++)
for(j=0;j<3;j++)scanf("%d",&a[i][j]);
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)printf("%5d",a[i][j]);
printf("\n");
}
printf("max=%d\n",max(a,i));
return 0;
}
int max(int a[][3],int i)
{
int x,y,max;
for(x=0;x<i;x++)
for(y=0,max=a[0][0];y<3;y++)
if(max<a[x][y])max=a[x][y];
return max;
}
54.外部函数
file1
#include<stdio.h>
int main()
{
//声明外部函数
extern void en(char c[]);
extern void de(char c[],char d);
extern void pr(char c[]);
char a[80],d;
printf("请输入字符串:");
en(a);
pr(a);
printf("请输入要删除字符:");
scanf("%c",&d);
de(a,d);
pr(a);
return 0;
}
file2
#include<stdio.h>
void en(char c[])
{
gets(c);
}
file3
#include<stdio.h>
void de(char c[],char d)
{
int i,j;
for(i=j=0;c[i]!='\0';i++)
if(c[i]!=d)c[j++]=c[i];
c[j]='\0';
}
file4
#include<stdio.h>
void pr(char c[])
{
puts(c);
}
55.静态局部变量
#include<stdio.h>
int main()
{
int fac(int n);
int i,n;
printf("请输入一个数:");
scanf("%d",&n);
for(i=1;i<=n;i++)printf("1~%d的阶乘分别为!%d=%d\n",n,i,fac(i));
return 0;
}
int fac(int n)
{
//静态局部变量只在声明它的函数内部有效
static int i=1;
i=i*n;
return i;
}
56.用函数分别求出最大公约数和最小公倍数
#include<stdio.h>
int main()
{
int max(int x,int y);
int min(int a,int b);
int a,b;
printf("请输入两个数:");
scanf("%d%d",&a,&b);
printf("最大公约数为%d\n",max(a,b));
printf("最小公倍数为%d\n",min(max(a,b),a*b));
return 0;
}
int max(int x,int y)
{
int i,j;
if(x>y){i=x;x=y;y=i;}
i=x*y;
while((j=y%x)!=0)
{
y=x;x=j;
}
return x;
}
int min(int a,int b)
{
return(b/a);
}
57. 指针基础
#include<stdio.h>
int main()
{
void turn(int *p1,int *p2);
int a,b,c,*p1,*p2;
a=1;b=2;p1=&a;p2=&b;
printf("a=%d b=%d p1=%d p2=%d\n",a,b,*p1,*p2);
c=*p1;*p1=*p2;*p2=c;
printf("a=%d b=%d p1=%d p2=%d\n",a,b,*p1,*p2);
a=1;b=2;p1=&a;p2=&b;
turn(p1,p2);
printf("a=%d b=%d p1=%d p2=%d\n",a,b,*p1,*p2);
}
//将指针传入函数,通过改变指针指向的值改变变量值
void turn(int *p1,int *p2)
{
int t;
t=*p1;*p1=*p2;*p2=t;
}
58.指针引用数组
#include<stdio.h>
int main()
{
int a[10],i,*p;
for(i=0;i<10;i++)a[i]=i+1;
for(i=0;i<10;i++)printf("%4d",a[i]);
printf("\n");
p=a;
for(i=0;i<10;i++,p++)printf("%4d",*p);
printf("\n");
}
59.指向数组指针
#include<stdio.h>
int main()
{
int (*p)[4],a[3][4];
int i,j,z=1;
for(i=0,z=1;i<3;i++)
for(j=0;j<4;j++)a[i][j]=z++;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%4d",a[i][j]);
printf("\n");
}
printf("\n");
p=a;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%4d",*(*(p+i)+j));
printf("\n");
}
}
60.指向字符串的指针
#include<stdio.h>
int main()
{
char *s="abcd";
printf("%s\n",s);
s="zxc";
printf("%s\n",s);
printf("%s\n",s+1);
}
61.指向函数指针
#include<stdio.h>
int main()
{
int max(int a,int b);
int min(int a,int b);
int (*p)(int,int);
int x=1,y=2,z=10;
p=max;
printf("%d\n",p(x,y));
p=min;
printf("%d\n",p(x,y));
printf("%d\n",max(p(x,y),z));
}
int max(int a,int b)
{
int z=a+b;
return z;
}
int min(int a,int b)
{
return a<b?a:b;
}
62.返回指针值函数
#include<stdio.h>
int main()
{
int *max(int *a,int *b);
int x=1,y=3,*p1,*p2,*p;
p1=&x;p2=&y;
p=max(p1,p2);
printf("%d\n",p);
}
int *max(int *a,int *b)
{
return *a>*b?*a:*b;
}
63.指针数组
#include<stdio.h>
int main()
{
char *a[]={"abcd","efg"};
int i,j=2;
for(i=0;i<2;i++)printf("%s\n",*(a+i));
for(i=0;i<2;i++)printf("%s\n",*(a+i)+j);
}
64.多重指针
#include<stdio.h>
int main()
{
char *a[]={"abcd","efg"};
int i,j=2;
char **p;
p=a;
for(i=0;i<2;i++)printf("%s\n",*p+i);
}
65.指针数组作为main函数参数
#include<stdio.h>
int main(int argc,char *argv[])
{
int i;
for(i=1;i<argc;i++)
printf("%s%c",argv[i],(i<argc-1)?' ':'\n');
}
//此程序需要用命令行执行
66.动态内存分配
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p1,i;
p1=(int*)malloc(5*sizeof(int));
for(i=0;i<5;i++)scanf("%d",p1+i);
for(i=0;i<5;i++)printf("%4d",*p1+i);
printf("\n");
}
67.结构体变量
#include<stdio.h>
int main()
{
struct st
{
int id;
int score;
char name[10];
char sex;
int age;
};
struct st st1,st2;
scanf("%d%d%s %c%d",&st1.id,&st1.score,&st1.name,&st1.sex,&st1.age);
scanf("%d%d%s %c%d",&st2.id,&st2.score,&st2.name,&st2.sex,&st2.age);
if(st1.score>st2.score)printf("%d %d %s %c %d\n",st1.id,st1.score,st1.name,st1.sex,st1.age);
else printf("%d %d %s %c %d\n",st2.id,st2.score,st2.name,st2.sex,st2.age);
}
68.共用体
#include<stdio.h>
int main()
{
union Date
{
int i;
char c;
float f;
};
union Date a;
a.i=97;
printf("%d %c %f\n",a.i,a.c,a.f);
a.c='A';
printf("%d %c %f\n",a.i,a.c,a.f);
a.f=97.0;
printf("%d %c %f\n",a.i,a.c,a.f);
}
69.声明新型变量
#include<stdio.h>
int main()
{
typedef int I;
I a=1;
printf("%d\n",a);
}
70.顺序读写文件
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
char ch,fn[10];
printf("输入文件名:");
scanf("%s",fn);
getchar(); //接受回车
if((fp=fopen(fn,"w"))==NULL)
{
printf("打开失败\n");
exit(0);
}
printf("输入字符(#结束):");
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
putchar(10);
}