C语言经典100例精选

目录

1、题目求符合给定条件的整数集

2、题目:企业发放的奖金根据利润提成。

3、题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

4、题目:输入某年某月某日,判断这一天是这一年的第几天?

5、题目:输入三个整数x,y,z,请把这三个数由小到大输出。

8、打印九九口诀表

11、题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)

12:题目:判断101到200之间的素数。

变形:统计素数并求和

13、题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

变形:水仙花数

14、题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

16、题目:输入两个正整数a和b,求其最大公约数和最小公倍数。

17、题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

18、题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制

19、题目一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。

20、题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

21、题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

22、题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

23、题目:打印出如下图案(菱形)。

24、题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

25、题目:求1+2!+3!+...+20!的和。

26、题目:利用递归方法求5!。

27、题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

28、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

29、题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

30、题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

31、题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。 

32、题目:删除一个字符串中的指定字母,如:字符串 "aca",删除其中的 a 字母。

33、题目:判断一个数字是否为质数。

35、题目:字符串反转,如将字符串 "www.runoob.com" 反转为 "moc.boonur.www"。

38、题目:求一个3*3矩阵对角线元素之和 

39、题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

40、题目:将一个数组逆序输出

67、题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

68、题目:有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。

69、题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

71、题目:编写input()和output()函数输入,输出5个学生的数据记录

80、题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?

82、题目:八进制转换为十进制

83、题目:求0—7所能组成的奇数个数

89、 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

97、题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。  

98、题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。 输入的字符串以!结束。

99、题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。

100、题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中

 变形:把文件stud.txt的内容读取到结构体中输出到控制台

 补充:以二进制形式写入和读取操作


1、题目求符合给定条件的整数集

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:

输入在一行中给出A。

输出格式:

输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:

2

输出样例:

234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543

#include <stdio.h> 

void main(){ 
	int a ;
	scanf("%d",&a);
	int cnt = 0;  
	for(int i = a; i < a+4; i++){
		for(int j = a; j < a+4; j++){
			for(int k = a; k < a+4; k++){
				if(i!=j && i!=k &&j!=k){
					cnt++;
					printf("%d%d%d",i,j,k);
					//每六个数一换行,不然就隔开
					if(cnt % 6 == 0){
						printf("\n");
					}else{
						printf(" ");
					}
					
				}
				
			}
		}
	}
}

2、题目:企业发放的奖金根据利润提成。

  • 利润(I)低于或等于10万元时,奖金可提10%;
  • 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
  • 20万到40万之间时,高于20万元的部分,可提成5%;
  • 40万到60万之间时高于40万元的部分,可提成3%;
  • 60万到100万之间时,高于60万元的部分,可提成1.5%;
  • 高于100万元时,超过100万元的部分按1%提成。

从键盘输入当月利润I,求应发放奖金总数?

if语句

#include<stdio.h>
//利用数轴进行定位,10W 20W 40W 60W 100W
int main(){
    double i; //利润
    double bonus,bonus1,bonus2,bonus3,bonus4,bonus5;//奖金
    bonus1 = 100000*0.1;             //利润10万元时的奖金
    bonus2 = bonus1+100000*0.075;    //利润20万元时奖金
    bonus3 = bonus2+200000*0.05;      //利润40万元时奖金
    bonus4 = bonus3+200000*0.03;     //利润60万元时奖金
    bonus5 = bonus4+400000*0.015;    //利润100万元时奖金
    scanf("%lf",&i);
    if(i <= 100000){//利润(I)低于或等于10万元时,奖金可提10%;
        bonus=i*0.1;
    }else if(i <= 200000){//利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
        bonus=bonus1+(i-100000)*0.075;  
    }else if(i <= 400000){//20万到40万之间时,高于20万元的部分,可提成5%;
        bonus=bonus2+(i-200000)*0.05;
    }else if(i <= 600000){//40万到60万之间时高于40万元的部分,可提成3%;
        bonus=bonus3+(i-400000)*0.03;
    }else if(i <= 1000000){//60万到100万之间时,高于60万元的部分,可提成1.5%;
        bonus=bonus4+(i-600000)*0.015;
    }else{//高于100万元时,超过100万元的部分按1%提成。
        bonus=bonus5+(i-1000000)*0.01;
    }
    printf("奖金总数:%lf\n",bonus);

}

 switch语句

#include<stdio.h>
//利用数轴进行定位,10W 20W 40W 60W 100W
int main(){
    double i; //利润
    double bonus,bonus1,bonus2,bonus3,bonus4,bonus5;//奖金
    bonus1 = 100000*0.1;             //利润10万元时的奖金
    bonus2 = bonus1+100000*0.075;    //利润20万元时奖金
    bonus3 = bonus2+200000*0.05;      //利润40万元时奖金
    bonus4 = bonus3+200000*0.03;     //利润60万元时奖金
    bonus5 = bonus4+400000*0.015;    //利润100万元时奖金
    scanf("%lf",&i);
    int n = i / 100000;
    if(n > 10){
        n=10;
    }
    printf("%d\n",n);
    switch(n){
    case 0: bonus=i*0.1;break; //利润(I)低于或等于10万元时,奖金可提10%;
    case 1: bonus=bonus1+(i-100000)*0.075;break;//利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
    case 2:
    case 3: bonus=bonus2+(i-200000)*0.05;break;//20万到40万之间时,高于20万元的部分,可提成5%;
    case 4:
    case 5: bonus=bonus3+(i-400000)*0.03;break;//40万到60万之间时高于40万元的部分,可提成3%;
    case 6:
    case 7:
    case 8:
    case 9: bonus=bonus4+(i-600000)*0.015;break;//60万到100万之间时,高于60万元的部分,可提成1.5%;
    case 10: bonus=bonus5+(i-1000000)*0.01;break;//高于100万元时,超过100万元的部分按1%提成。
    }

    printf("奖金总数:%lf\n",bonus);

}

3、题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

#include<stdio.h>
#include<math.h>
//题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
int main() {
    for (int i = 1; i < 50; i++) {
        //对第一个数开平方
        int n = sqrt(i+100);
        printf("n=%d\n",n);
        //对第二个数开平方
        int m = sqrt(i+100+168);
        printf("m=%d\n",m);
        //判断是否满足条件
        if(n*n==(i+100) && m*m==(i+100+168)){
            printf("%d\n",i);
        }

    }
    return 0;
}

4、题目:输入某年某月某日,判断这一天是这一年的第几天?

#include<stdio.h>
#include<math.h>
//题目:输入某年某月某日,判断这一天是这一年的第几天?
//31 59 90 120 151 181 212 243 273 304 334
int main() {
    int year,month,day,sum;
    printf("请输入年:");
    scanf("%d",&year);
    printf("请输入月:");
    scanf("%d",&month);
    printf("请输入日:");
    scanf("%d",&day);
    //计算某月以前月份的总天数
    switch(month){
        case 1:sum=0;break;
        case 2:sum=31;break;
        case 3:sum=59;break;
        case 4:sum=90;break;
        case 5:sum=120;break;
        case 6:sum=151;break;
        case 7:sum=181;break;
        case 8:sum=212;break;
        case 9:sum=243;break;
        case 10:sum=273;break;
        case 11:sum=304;break;
        case 12:sum=334;break;
        default:printf("data error");break;
    }
    //加上天数
    sum+=day;
    //判断是不是闰年
    //1.普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)
    //2.世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
    int leap;
    if(year%400 ==0 || (year%4==0 && year%100!=0 )){
        leap=1;
    }else{
        leap=0;
    }
    //如果是闰年且月份大于2 天数加1
    if(leap && month>2){
        sum+=1;
    }

    printf("一年中第%d天\n",sum);
    return 0;
}

5、题目:输入三个整数x,y,z,请把这三个数由小到大输出。

#include<stdio.h>
//题目:输入三个整数x,y,z,请把这三个数由小到大输出。
void swap(int *a, int *b){
    int temp; //交换的临时变量
    temp=*a;
    *a=*b;
    *b=temp;
}

int main() {
    int x, y ,z;

    printf("请输入三个数:");
    scanf("%d%d%d",&x,&y,&z);

    if(x>y){
       swap(&x,&y);
    }
    if(x>z){
        swap(&x,&z);
    }
    if(y>z){
        swap(&y,&z);
    }
    printf("%d %d %d",x,y,z);

}

8、打印九九口诀表

下面是一个完整的下三角九九口诀表:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  

本题要求对任意给定的1位正整数N,输出从1*1到N*N的部分口诀表。

输入格式:

输入在一行中给出一个正整数N(1<=N<=9)。

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:

4

输出样例:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16

#include <stdio.h> 

void main(){ 
	int n;
//	scanf("%d",n);
	n=9;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= i; j++){
			printf("%d*%d=%-4d",j,i,j*i);	
		}
		printf("\n");	
	}	
}

11、题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)

可以看出,每个月的兔子总数依次为1, 1, 2, 3, 5, 8, 13…这就是 斐波那契数列(Fibonacci sequence)。总结数列规律即从前两个月的兔子数可以推出第3个月的兔子数

 

#include<stdio.h>
int f(int month){
    if(month==1 || month==2){
        return 1;
    }else{
        return f(month-1)+f(month-2);
    }
}
int main() {
    for(int i = 1; i <= 40; i++){
        printf("%12d",f(i));
        if(i%4==0){ //每四个换行
            printf("\n");
        }

    }

    return 0;
}

法二:

#include<stdio.h>

int main() {
    int fi1=1,fi2=1;
    for(int i = 1; i <=20; i++){
        printf("%12d%12d",fi1,fi2);
        if(i%2==0) printf("\n"); //每次输出两个,所以四个一换行
        fi1=fi1+fi2;
        fi2=fi1+fi2;
    }

    return 0;
}

12:题目:判断101到200之间的素数。

 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。

#include<stdio.h>
//素数:除了1和它自身外,不能被其他自然数整除的数叫做素数
int main() {
     int cnt = 0; //计数器
    for(int i = 101; i < 201; i++ ){
        int flag = 1; //假如是素数
        //这个循环判断是不是素数
        for(int j = 2; j < i; j++){
            if(i%j==0){
                flag=0; //不是素数就跳出循环
                break;
            }
        }
        //如果是素数就输出
        if(flag){
            printf("%d ",i);
            cnt++;
            if (cnt % 5 == 0){
                printf("\n");
            }

        }

    }
}

变形:统计素数并求和

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出2个正整数M和N(1<=M<=N<=500)。

输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:

10 31

输出样例:

7 143

#include <stdio.h> 
//除了1和它自身外,不能被其他自然数整除的数叫做素数
void main(){ 
	
	int m,n;
	int cnt=0; //计数器
	int sum=0; //素数和
	scanf("%d %d",&m,&n);

	if(m==1) m = 2; 
	for(int i = m; i < n+1; i++){
		//判断这个数字是不是素数
		int isPrime = 1; //假如是
		for(int j = 2; j < i; j++){
			if(i % j ==0){
				isPrime = 0; //不是素数
				break;
			}
			
		}

		if(isPrime){
			cnt++;
			sum+=i;
		}
	}
	printf("%d %d\n",cnt,sum);
}

13、题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

#include<stdio.h>
// %取个位数 比如 123%10=3
// /去个位数 比如 123/10=12
int main() {

    for(int i = 100; i < 1000; i++){
        int sum = 0; //累计和
        int temp = i;//用临时变量拆分,原数还要用于比较是不是水仙花数
        //这个循环把每个数拆开求其三次方之和
        do{
            int a=temp%10;
            temp=temp/10;
            sum+=a*a*a;
        }while(temp >0);

        //判断:是不是水仙花数
        if(i==sum){
            printf("%d ",i);
        }
    }
}

 法二:

#include<stdio.h>
 
int main()
{
    int i,x,y,z;
    for(i=100;i<1000;i++)
    {
        x=i%10;
        y=i/10%10;
        z=i/100%10;
        
        if(i==(x*x*x+y*y*y+z*z*z))
        printf("%d\n",i);
        
    }
    return 0;
}

变形:水仙花数

水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3<=N<=7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:

3

输出样例:

153
370
371
407

#include <stdio.h>

int main(){
	int n;
	scanf("%d",&n);
//如果n=3,while执行二次 first=100
//如果n=4,while执行三次 first=1000
	int first=1;
	int i=1;//循环变量
	while(i<n){
		first*=10;
		i++;
	}
//输入 n=3时候:100 - 1000 之间数字
	for(i = first; i< first*10; i++){
		int sum=0; //三次方的和
		int temp = i;
		do{
			int a =temp%10;   // %取最低位数(个位数)
			temp/=10;         // /去掉最低位数(个位数)
			//j=0 n=3 循环执行三次 a*a*a 求三次幂
			int p=1;
			int j = 0;//循环变量
			while(j<n){
				p=p*a;
				j++;
			}
			//每次的三次幂求和
			sum+=p;
		}while(temp>0);

		//满足水仙花数要求 打印
		if(sum == i){
			printf("%d\n",i);
		}

	}
    return 0;
}

14、题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

  1. 首先找到一个最小的质数k,最小的质数为2
  2. 如果这个质因数k等于n那么分解过程就结束了
  3. 如果k不等于n,但是n可以被k整除,那么输出这个k,并用n/k(n除以k)作为n的新值,并重复步骤2(用循环)
  4. 如果n不能被k整除,那么是k=k+1; 重复执行第2步

注意:仔细理解2,3,4的循环步骤,可在纸上演练一遍

#include <stdio.h>

int main(){
	int n;
	printf("请输入一个正整数:");
	scanf("%d",&n);
	printf("%d=",n);
	//1、最小质因数k=2
    for(int k = 2; k < n; k++){
        //2、当质因数k等于n时,分解结束
        while(k!=n){
            //3、n可以被k整除,那么输出k*,并用n/k作为n的新值,重复2
            if(n%k==0){
                printf("%d*",k);
                n/=k;
            }else{
                //4、如果n不能被k整除,那么k++;重复2
                break;
            }
        }

    }
    //补充最后一个质因数
    printf("%d\n",n);

    return 0;
}

16、题目:输入两个正整数a和b,求其最大公约数和最小公倍数。

  1. 如果b等于0,计算结束,a就是最大公约数
  2. 否则,计算a除以b的余数,让a等于b,而b等于那个余数;
  3. 回到第一步

求最大公约数——辗转相除法
最小公倍数=输入的两个数之积除于它们的最大公约数

#include <stdio.h>
/*
求最大公约数——辗转相除法
最小公倍数=输入的两个数之积除于它们的最大公约数
a=12 b=18 t=12
a=18 b=12 t=6
a=12 b=6  t=0
a=6  b=0 循环结束
*/
int main(){
    int a,b,n;
	scanf("%d %d",&a,&b);
	n=a*b;
	while(b!=0){
		int t = a % b;
		a = b;
		b = t;
		printf("a=%d b=%d t=%d\n", a,b,t);
	}

	printf("最大公约数是%d\n",a);
	printf("最小公倍数是%d\n",n/a);

}

17、题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

#include <stdio.h>

int main(){
    int letters=0,numbers=0,emptys=0,others=0;
    char c;
    printf("输入一些字母\n");
    while((c=getchar())!='\n'){
        if((c>='a' && c <= 'z') || (c >='A' && c <='Z') ){
            letters++;
        }else if( c >= '0' && c <='9'){
            numbers++;
        }else if(c==' '){
            emptys++;
        }else{
            others++;
        }
    }
    printf("字母=%d,数字=%d,空格=%d,其他=%d\n",letters,numbers,emptys,others);

}

18、题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制

#include <stdio.h>

int main(){
    int s=0,a,n;
    scanf("%d %d",&a,&n);
    int temp=a;
    for(int i =1; i <= n; i++){
        s+=temp;
        temp=temp*10+a;
    }
    printf("%d\n",s);
}

19、题目一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。

#include <stdio.h>

int main(){

    for(int i = 2; i <= 1000; i++) {
        int sum=1;//因子之和(1是所有数的因子)
        //for循环找出当前数的所有因子
        for(int j = 2; j <= i/2; j++){ 
            if(i%j==0){
                sum+=j;//所有因子相加
            }
        }
        //完数输出
        if(sum==i){
            printf("%d=1",i);
            for(int j = 2; j <= i/2; j++){
                if(i%j==0){
                    printf("+%d",j);
                }
            }
            printf("\n");
        }
    }
    return 0;
}

20、题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

#include <stdio.h>

int main(){
    double height = 100;
    double sum = 100;//第一次落地时,小球经过100m
    for(int i = 2; i <= 10; i++){ //计算小球第2到第10次落地经过的高度
        height/=2;
        sum=sum+2*height;
    }
    height/=2;//第10次弹起的高度
    printf("第10次落地时,共经过%f米,第10次反弹高%f米\n",sum,height);
    return 0;
}

21、题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

#include <stdio.h>

int main(){
    int peach = 1; //第10天桃子
    for(int i = 9; i >=1; i--){
        peach = 2*(peach+1);
        printf("第%d天的桃子为: %d 个\n",i,peach);
    }
    return 0;
}

 

 递归解法:

#include <stdio.h>

//返回第n天时的桃子数
int func(int n) {
    if (n >= 10) {
        return 1;
    } else {
        return (func(n + 1) + 1) * 2;
    }
}

int main() {
    int i;
    for (i = 1; i <= 10; i++) {
        printf("第 %d 天桃子数:%d \n", i, func(i));
    }

    return 0;
}

22、题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

#include <stdio.h>

int main() {
    char a,b,c;
    for(a ='x'; a<='z'; a++){
        for(b ='x'; b<='z'; b++){
            for(c='x'; c<='z'; c++){
                if(a!='x' && c!='x' && c!='z' && a!=b && a!=c && b!=c){
                    printf("a->%c\n",a);
                    printf("b->%c\n",b);
                    printf("c->%c\n",c);
                }
            }
        }
    }

    return 0;
}

23、题目:打印出如下图案(菱形)。

   *
  ***
 *****
*******
 *****
  ***
   *

法一:

#include <stdio.h>
/*外层循环控制行 ,内层循环控制列
上面四行                            下面三行
    空格            星星              空格        星星
    行  列          行  列           行  列       行   列
     i   j           i   j            i   j        i   j

     1   3           1   1            1   1        1   5

     2   2           2   3            2   2        2   3

     3   1           3   5            3   3        3   1

     4   0           4   7            j=i          j=7-i*2

     j=4-i           j=i*2-1

*/
int main() {
    int i, j;
    //上面四行
    for( i =1; i<=4; i++){
        //输出空格
        for(j=1; j<=4-i;j++){
            printf(" ");
        }
        //输出星星
        for(j=1; j<=(i*2-1); j++){
            printf("*");
        }
        printf("\n");
    }
        // 下面三行
    for( i =1; i<=3; i++){
        //输出空格
        for(j=1; j<=i; j++){
            printf(" ");
        }
        //输出星星
        for(j=1; j<=(7-i*2); j++){
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

 法二:

#include<stdio.h>
#include<stdlib.h>
int main(){
	int i,j;
	for(i=0; i<7; i++){
		for(j=0; j<abs(3-i); j++){
			printf(" ");
		}
		for(j=0; j<(i<=3?2*i+1:13-2*i); j++){
			printf("*");
		}
		printf("\n");
	}
	system("pause");
}

变形题: 

    *
   * *
  * * *
 * * * *
* * * * * 
 * * * *
  * * *
   * *
    *
#include<stdio.h>
#include<stdlib.h>
int main(){
	int i,j;
	for(i=0; i<9; i++){
		for(j=0; j<abs(4-i); j++){
			printf(" ");
		}
		for(j=0; j<9-2*abs(4-i); j++){//上下对称
			if(j%2){
				printf(" ");
			}else{
				printf("*");
			}	
		}
		printf("\n");
	}
	system("pause");
}

 

变形题:

    *
   * *
  *   *
 *     *
*       *
 *     *
  *   *
   * *
    *
#include<stdio.h>
#include<stdlib.h>

int main(){
	int i,j;
	for(i=1; i<=5; i++){
		for(j=1; j<=5-i; j++){
			printf(" ");
		}
		for(j=1; j<=i; j++){
			if(j==1||j==i)
				printf("* ");
			else
				printf("  ");
		}
		printf("\n");
	}
	for(i=1; i<=4; i++){
		for(j=1; j<=i; j++){
			printf(" ");
		}
		for(j=1; j<=5-i; j++){
			if(j==1||j==(5-i))
				printf("* ");
			else
				printf("  ");

		}
		printf("\n");
	}
	system("pause");
}

24、题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

#include <stdio.h>

int main() {
    float a = 2, b = 1,sum = 0;
    float temp;
    for(int i=0; i<20; i++){
        sum+=a/b;
        temp=a;
        a=a+b;
        b=temp;
    }

     printf("%9.6f\n",sum);
    return 0;
}

25、题目:求1+2!+3!+...+20!的和。

#include <stdio.h>

int main() {
    int sum=0;
    for(int i =1; i <=20; i++){
        //阶乘
        int t =1;
        for(int j =2; j <=i; j++){
            t=t*j;
        }
        //累加
        sum+=t;
    }
    printf("%d\n",sum);
    return 0;
}

 法二:累加变成累乘

#include <stdio.h>

int main() {
    int sum=0,temp=1;
    for(int i =1; i <=20; i++){
        temp=temp*i;//累加变成累乘
        sum=sum+temp;
    }
    printf("%d\n",sum);
    return 0;
}

法三:递归

#include <stdio.h>
//递归
int fact(int n) {
    if(n == 0 || n == 1)
        return 1;
    else
        return n * fact(n - 1);
}

int main(void) {
    int sum=0;
    for(int i = 1; i <= 20; i++) {
       sum+=fact(i);
    }
    printf("%d\n",sum);
    return 0;
}

26、题目:利用递归方法求5!。

#include <stdio.h>
 
int main()
{
    int i;
    int fact(int);
    for(i=0;i<6;i++){
        printf("%d!=%d\n",i,fact(i));
    }
}
int fact(int j)
{
    int sum;
    if(j==0){
        sum=1;
    } else {
        sum=j*fact(j-1);
    }
    return sum;
}

27、题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

#include<stdio.h>
/*
程序【27】
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
【分析】递归最重要的是压栈和出栈的顺序
*/
void fun(void)
{
	char c;
	if ((c = getchar()) != '\n')  //出栈条件
	{
		fun();
	}
	if (c != '\n')  //出栈
	{
		printf("%c", c);
	}
}

int main(void){
	printf("请输入5个字符\n");
	fun();
	return 0;
}

28、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

int f(int n){
    if(n==1){
        return 10
    }else{
       return (n-1)+2;
    }
}

int main(void){
    printf("%d\n",f(5));

}

29、题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

#include<stdio.h>

int main(void){
    int num;//不多于5位的正整数
    int cnt=0; //几位数
    int t;
    printf("请输入不多于5位的正整数:");
    scanf("%d",&num);

    do{
        t = num%10;
        printf("%d",t);
        num/=10;
        cnt++;
    }while(num>0);
    printf("\n这是%d位数",cnt);
    return 0;
}

30、题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

#include<stdio.h>

int main(void){
    int num,reverse_num=0;
    printf("请输入一个5位数:");
    scanf("%d",&num);

    //逆序
    int temp=num;
    while(temp>0){
        reverse_num=reverse_num*10+temp%10;
        temp/=10;
    }
    printf("%d",reverse_num);
    if(num==reverse_num){
        printf("是回文");
    }else{
        printf("不是回文");
    }
    return 0;
}

31、题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。 

#include<stdio.h>
//monday tuesday wednesday thursday friday saturday sunday
/*
前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),
所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而
是会直接取走这个“无用的”回车符,从而导致读取有误
*/
int main(void){
    char i,j;
    printf("请输入第一次字母:");
    scanf("%c",&i);
    getchar();//scanf("%c",&j);的问题,第二次是读入的一个换行符,而不是输入的字符,因此需要加一个getchar() 吃掉换行符
    switch(i){
        case 'm':printf("monday\n"); break;
        case 'w':printf("wednesday\n");break;
        case 'f':printf("friday\n");break;
        case 't':
            printf("请输入下一个字母:");
            scanf("%c",&j);
            if(j=='u') printf("tuesday\n");break;
            if(j=='h') printf("thursday\n");break;
        case 's':
            printf("请输入下一个字母:");
            scanf("%c",&j);
            if (j=='a') {printf("saturday\n");break;}
            if (j=='u') {printf("sunday\n"); break;}
         default :
            printf("error\n"); break;
    }

    return 0;
}

32、题目:删除一个字符串中的指定字母,如:字符串 "I love this program",删除其中的 o字母。

#include<stdio.h>

int main(void) {
    char s[100]= "I love this program";
    char c;
    printf("请输入要删除的字母:");
    c=getchar();
    int j =0;
    for(int i=0; s[i]!='\0';i++){
        if(s[i]!=c){
            s[j]=s[i];
            j++;
        }

    }
    s[j]='\0';
    puts(s);

    return 0;
}

 

33、题目:判断一个数字是否为质数。

程序分析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。

#include<stdio.h>

int main(void) {
    int num, flag = 1;
    printf("输入一个大于1的自然数:\n");
    scanf("%d", &num);
    for(int i = 2; i < num; i++) {
        if(num % i == 0) {
            flag = 0; //不是素数
            break;
        }
    }

    if(flag || num == 2) {
        printf("%d是素数", num);
    } else {
        printf("%d不是素数", num);
    }
    return 0;
}

35、题目:字符串反转,如将字符串 "www.runoob.com" 反转为 "moc.boonur.www"。

#include<stdio.h>

int main() {
    char ch[100];
    gets(ch);
    int i =0;
    while(ch[i]!='\0'){
        i++;
    }

    while(--i>=0){
        putchar(ch[i]);

    }
    return 0;
}

 法二:

#include<stdio.h>
#include<string.h>
void reverse(char *ch){
    int i=0;
    int j = strlen(ch)-1;
    while(i<j){
        int temp = *(ch+i);
        *(ch+i) = *(ch+j);
        *(ch+j) = temp;
        i++;
        j--;
    }
}
void main() {
    char ch[100];
    printf("输入一个字符串: ");
    gets(ch);
    reverse(ch);
    puts(ch);

}

38、题目:求一个3*3矩阵对角线元素之和 

#include<stdio.h>
#define N 3
int main()
{
    int i,j,a[N][N],sum=0;
    printf("请输入矩阵(3*3):\n");
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<N;i++)
        sum+=a[i][i];
    printf("对角线之和为:%d\n",sum);
    return 0;
}

39、题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

#include<stdio.h>
void insert(int *n, int number) {

    if(number > *(n + 9)) {
        *(n + 10) = number;
    } else {
        int i ;
        for( i = 9; i >= 0; i--) {
            if(*(n + i) > number) {
                *(n + i + 1) = *(n + i);
            }else{
                break;
            }
        }

        *(n + i + 1) = number;
    }
}
int main() {
    int number;
    int n[11] = {1, 2, 4, 5, 6, 7, 8, 9, 10, 11};
    printf("插入前:\n");
    for(int i = 0; i < 10; i++) {
        printf("%d ", n[i]);
    }
    printf("\n插入一个新的数字: ");
    scanf("%d", &number);

    insert(n, number);

    printf("插入后:\n");
    for(int i = 0; i < 11; i++) {
        printf("%d ", n[i]);
    }
    return 0;
}

 

40、题目:将一个数组逆序输出

#include<stdio.h>
#define N 10
int main() {
    int array[N]={1,2,3,4,5,6,7,8,9,10};
    printf("原始数组:\n");
    for(int i=0;i<N;i++){
        printf("%d ",array[i]);
    }
    for(int i =0; i < N/2; i++ ){
        int t = array[i];
        array[i]=array[N-i-1];
        array[N-i-1]=t;

    }
    printf("逆序数组:\n");
    for(int i=0;i<N;i++){
        printf("%d ",array[i]);
    }
    return 0;
}

67、题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

#include<stdio.h>
void swap(int *a, int *b){
    int t = *a;
    *a=*b;
    *b=t;
}
void compare(int a[], int n){
    int max=0;//假设最大元素的下标
    int min=0;//假设最小元素的下标
    for(int i =1; i < n; i++){
        if(a[max] < a[i]){
            max=i;
        }
        if(a[min] > a[i]){
            min=i;
        }
    }
    swap(&a[max],&a[0]); //交换最大与第一个元素
    swap(&a[min],&a[4]);//交换最小与最后一个元素
}
int main() {
    int a[5];
    printf("请输入5个整数:\n");
    for(int i = 0; i < 5; i++){
        scanf("%d",&a[i]);
    }
    compare(a,5);
    for(int i = 0; i < 5; i++){
        printf("%d ",a[i]);
    }
}

68、题目:有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。

#include<stdio.h>
#define N 100
void reverse(int a[], int i, int j){
    while(i < j){
        int temp = a[i];
        a[i]=a[j];
        a[j]=temp;
        i++;
        j--;
    }
}
int main() {
    int a[N],n,m;
    printf ("请输入数组元素个数:\n");
    scanf("%d",&n);
    printf ("请输入后移几个元素\n");
    scanf("%d",&m);
    printf("请输入%d个元素\n",n);
    for (int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    reverse(a,0,n - 1);
    reverse(a,0,m - 1);
    reverse(a,m,n - 1);
    for (int i=0;i<n;i++){
        printf("%d ",a[i]);
    }

}

 

69、题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

#include <stdio.h>
void main()
{
    int num[50],n,*p,j,loop,i,m,k;
    printf("请输入这一圈人的数量:\n");
    scanf("%d",&n);
    p=num;
    //开始给这些人编号
    for (j=0;j<n;j++)
    {
        *(p+j)=j+1;
    }
    i=0;//i用于计数,即让指针后移
    m=0;//m记录退出圈子的人数
    k=0;//k报数1,2,3
    while(m<n-1)//当退出的人数不大于总人数时,即留下的人数至少是一个人
        //这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
        //这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
    {
        if (*(p+i)!=0)//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
        {
            k++;
        }
        if (k==3)
        {    k=0;    //报数清零,即下一个人从1开始报数
            *(p+i)=0;//将报数为3的人编号重置为0
            m++;    //退出人数加1
        }
        i++;      //指针后移
        if (i==n)//这句很关键,如果到了队尾,就要使指针重新指向对头
            //并且它只能放在i++后面,因为只有i++了才有可能i==n
        {
            i=0;
        }
        
        
    }
    printf("现在剩下的人是:");
    for (loop=0;loop<n;loop++)
    {
        if (num[loop]!=0)
        {
            printf("%2d号\n",num[loop]);
        }
    }
    
}

71、题目:编写input()和output()函数输入,输出5个学生的数据记录

#include<stdio.h>
typedef struct{
    char name[50];
    char sex[5];
    int age;
}Stu;
void input(Stu *stu);
void output(Stu *stu);

int main() {
    Stu stu[5];
    printf("请输入5个学生的信息:姓名 性别 年龄:\n");
    input(stu);
    printf("5个学生的信息如下:\n姓名 性别 年龄\n");
    output(stu);
    return 0;
}
void input(Stu *stu){
    for(int i =0; i < 5; i++){
        scanf("%s%s%d",stu[i].name,stu[i].sex,&(stu[i].age));
    }
}
void output(Stu *stu){
    for(int i =0; i < 5; i++){
        printf("%s\t%s\t%d\n",stu[i].name,stu[i].sex,stu[i].age);
    }
}

80、题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?

#include<stdio.h>

int main() {
    int i = 0;  //循环次数
    int j = 1;  //假设第五只猴子分的桃子数。(1-255,当为255时满足条件)
    int n;      
    while(i < 5) {               //i记录逆推次数,达到5说明for循环执行了5次,找到了满足条件的最小数
        n = 4 * j;               //n初值为最后剩下的桃子数,然后从n=4,8···寻找满足条件的数
        for(i = 0; i < 5; i++) {
            if(n % 4 != 0)       //后面四只猴子分之前的桃子数必须是四的倍数,因为是前一只猴子剩下的,不满足则退出循环
                break;
            n = n / 4 * 5 + 1;   //一次求第5只猴子分桃子前的桃子数,判断是否是4的倍数
            printf("第五只猴子分得桃子为%d个时,剩余桃子数为%d\n",j,n);
        }
        j++;
    }
    printf("海滩上原来最少有%d个桃子\n", n);
    return 0;
}

法二:

#include <stdio.h>
#include <stdlib.h>
/*
A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。
日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。
B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。 。
C、D、E依次醒来,也按同样的方法拿鱼。
问他们台伙至少捕了多少条鱼?以及每个人醒来时见到了多少鱼?
*/
int main(){
    int n;//至少捕了多少条鱼
    int A,B,C,D,E;
    for(n=6;;n++){//这个n是一开始总共鱼的数量,最起码得能分成五份还余1吧
        A=4*(n-1)/5;  //A=(n-1)乘五分之四
        B=4*(A-1)/5;
        C=4*(B-1)/5;
        D=4*(C-1)/5;
        if(n%5==1 && A%5==1 && B%5==1 && C%5==1 && D%5==1){   //平均分成5份多一
            printf("至少合伙捕鱼:%d条\n",n);
            printf("分别见到鱼的条数:%d %d %d %d\n",A,B,C,D);
            break;
        }
    }
    return 0;
}

82、题目:八进制转换为十进制

#include<stdio.h>
#include<math.h>

int main() {
    int n,sum=0;
    int i =0;
    printf("请输入一个八进制数:\n");
    scanf("%d",&n);
    while(n){
        sum+=(n%10)*pow(8,i++);
        n/=10;

    }
    printf("刚输入的8进制数转化为十进制为\n%d\n",sum);
    return 0;
}

83、题目:求0—7所能组成的奇数个数

程序分析:

这个问题其实是一个排列组合的问题,设这个数为 sun=a1a2a3a4a5a6a7a8,a1-a8 表示这个数的某位的数值,当一个数的最后一位为奇数时,那么这个数一定为奇数,不管前面几位是什么数字。如果最后一位数为偶数,则这个数一定为偶数。

a1-a8可以取 0-7 这个八个数字,首位数字不为 0。

从该数为一位数到该数为8位数开始统计奇数的个数:

  • 1.当只有一位数时也就是该数的最后一位,奇数个数为4
  • 2.当该数为两位数时,奇数个数为4*7=28
  • 3.当该数为三位数时,奇数个数为:4*8*7=224
  • ...
  • 8.当该数为八位数时,奇数个数为:4*8*8*8*8*8*8*7(依次为最后一位到第一位)
#include<stdio.h>
#include<math.h>
//个位1 3 5 7是奇数
int main() {
    int s,sum = 0;;
    for(int i =1; i <=8; i++){  //i表示有几位数
        if(i==1){               //最后一位是奇数有4种情况,其他是0-7八种情况,首位数字不能为0有七种情况
            s=4;
        }else if(i==2){         //两位数 奇数个数为7*4,三位数7*8*4
            s=4*7;
        }else{
            s*=8;
        }
        sum+=s;
        printf("%d位数奇数有%d个\n",i,s);
    }
    printf("奇数的总个数为:%d\n", sum);
    return 0;
}

 

89、 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

#include<stdio.h>
#include<math.h>
//个位1 3 5 7是奇数
int main() {
    int tel,a1,a2,a3,a4,t;
    printf("请输入四位整数:\n");
    scanf("%d",&tel);
    a1=tel%10;
    a2=tel/10%10;
    a3=tel/100%10;
    a4=tel/1000;
    //加密
    a1=(a1+5)%10;
    a2=(a2+5)%10;
    a3=(a3+5)%10;
    a4=(a4+5)%10;

    t=a1; a1=a4; a4=t;
    t=a2; a2=a3; a3=t;
    printf("加密后的数字:\n");
    printf("%d%d%d%d\n",a1,a2,a3,a4);
    return 0;
}

97、题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。  

#include <stdio.h>
#include<stdlib.h>
//题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。
int main(){
    FILE*fp=NULL;
    char fileName[20]; //文件名
    char ch;           //要输入的字符
    printf("请输入你要保存的文件的名称:\n");
    gets(fileName);
    if((fp=fopen(fileName,"w"))==NULL){
        printf("打开文件失败\n");
        exit(0);
    }
    printf("请输入你要保存的一些字符,以#结束\n");
    while((ch=getchar())!='#'){
        fputc(ch,fp);
    }
    fclose(fp);
    return 0;
}

98、题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。 输入的字符串以!结束。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//98题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。 输入的字符串以!结束
int main()
{
    FILE *fp = NULL;
    char ch;
    //打开文件
    if((fp=fopen("test.txt","w"))==NULL){
        printf("写入失败\n");
        exit(0);
    }
    printf("请输入一个字符串(以!结束):\n");
    while((ch=getchar()) != '!'){
        if(ch <='z' && ch >= 'a'){
            ch -= 32;
        }
        fputc(ch,fp);
    }
    //关闭文件流
    fclose(fp);
    return 0;
}

 法二:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){

    FILE*fp=NULL;
    char str[50];
    int i,len;
    printf("输入一个字符串:\n");
    gets(str);
    len=strlen(str);
    for(i=0;i<len;i++)
    {
        if(str[i]<='z'&&str[i]>='a')
            str[i]-=32;
    }
    if((fp=fopen("test","w"))==NULL)
    {
        printf("error: cannot open file!\n");
        exit(0);
    }
    fprintf(fp,"%s",str);
    fclose(fp);


    return 0;
}

99、题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 200
//99 题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。
int main(){
    FILE *fa=NULL,*fb=NULL,*fc=NULL;
    char *str=NULL;
    //打开文件
    fa=fopen("A.txt","r");
    fb=fopen("B.txt","r");
    fc=fopen("C.txt","w");
    if(fa==NULL || fb==NULL || fc==NULL){
        printf("ERROR,cannot open file\n");
        exit(0);
    }
    str=(char*)malloc((NUM*sizeof(char)));
    //读取文件A B 并合并排序
    fgets(str,100,fa);
    printf("%s",str);
    int i=0;//记a.txt文件字符串个数
    while(*(str+i)!='\0'){
        i++;
    }
    //此时*(str+i)='\0'
    fgets(str+i,100,fb);
    int len = strlen(str)-1;//减去末尾的换行符
    //冒泡排序
    for(i=0; i < len-1; i++){
        for(int j=0; j<=len-i-1;j++){
            if(str[j]>str[j+1]){
                char temp=str[j];
                str[j]=str[j+1];
                str[j+1]=temp;
            }
        }
    }
    fputs(str,fc);
    free(str);

    //关闭文件
    fclose(fa);
    fclose(fb);
    fclose(fc);
    return 0;
}

100、题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中

#include <stdio.h>
#include <stdlib.h>
typedef struct{
    int id;
    char name[20];
    int math,english,c;
    int avarg;  //平均成绩
}Stu;
int main(){
    FILE*fp;
    Stu stu[5];
    printf("请输入5个同学的信息:学生号,姓名,3门成绩:\n");
    //键入5位同学成绩,计算平均分
    for(int i=0; i<5; i++){
        scanf("%d %s %d %d %d",&(stu[i].id),stu[i].name,&(stu[i].math),&(stu[i].english),&(stu[i].c));
        stu[i].avarg=(stu[i].math+stu[i].english+stu[i].c)/3;
    }
    //打开文件
    if((fp=fopen("stud.txt","w"))==NULL){
        printf("ERROR");
        exit(0);
    }
    //写入文件
    for(int i=0; i<5; i++){
        fprintf(fp,"%d %s %d %d %d %d\n",stu[i].id,stu[i].name,stu[i].math,stu[i].english,stu[i].c,stu[i].avarg);

    }
    //关闭文件
    fclose(fp);
    return 0;
}

 变形:把文件stud.txt的内容读取到结构体中输出到控制台

stud.txt内容:

1 小红 100 100 100 100
2 小白 100 100 100 100
3 小黑 100 100 100 100
4 小兰 100 100 100 100
5 小狗 100 100 100 100

#include <stdio.h>
#include <stdlib.h>
//把文件stud.txt的内容读取到结构体中输出到控制台
typedef struct Stu{
    int id;
    char name[20];
    int math,english,c;
    int avarg;
}Stu;
int main(){
    FILE*fp;
    Stu stu[5];
     //打开文件
    if((fp=fopen("stud.txt","r"))==NULL){
        printf("ERROR");
        exit(0);
    }
    //从文件读取到结构体中方法一
  /*  int i=0;
    while(!feof(fp)){
        fscanf(fp,"%d %s %d %d %d %d\n",&(stu[i].id),stu[i].name,&(stu[i].math),&(stu[i].english),&(stu[i].c),&stu[i].avarg);
        i++;
    }*/
     //从文件读取到结构体中方法二
    for(int i=0; i<5; i++){
       fscanf(fp,"%d %s %d %d %d %d\n",&(stu[i].id),stu[i].name,&(stu[i].math),&(stu[i].english),&(stu[i].c),&stu[i].avarg);
    }

    //关闭文件
    fclose(fp);
    //输出到控制台
    for(int i=0; i<5; i++){
        printf("%d %s %d %d %d %d\n",stu[i].id,stu[i].name,stu[i].math,stu[i].english,stu[i].c,stu[i].avarg);

    }
    return 0;
}

 

 补充:以二进制形式写入和读取操作

#include<stdio.h>
#include<stdlib.h>
#define N 2

struct Student{
	char name[10];
	int age;
	float score;
}stu[N],stu2[N],st;
//写入
void write(){
	FILE*fp;
    //打开文件
	if((fp=fopen("E://a.txt","wb"))==NULL){
		printf("打开文件失败");
		exit(1);
	}
	//以二进制写入文件写入文件
	fwrite(stu,sizeof(struct Student),N,fp);
    //关闭文件流
	fclose(fp);
}
//读取
void display(){
	FILE*fp;

	if((fp=fopen("E://a.txt","rb"))==NULL){
		printf("打开文件失败");
		exit(1);
	}
	fread(stu2,sizeof(struct Student),N,fp);
	for(int i = 0; i < N; i++){
		printf("%s %d %f \n",stu2[i].name,stu2[i].age,stu2[i].score);
	}

	fclose(fp);
}


int main(){
	for(int i = 0; i < N; i++){
        printf("输入第%d位学生姓名,年纪,得分:\n",i+1);
		scanf("%s %d %f",stu[i].name,&stu[i].age,&stu[i].score);
	}
    //把输入的成绩以位二进制写入到文件里
	write();
	//从文件里读取输出到控制台
	display();

    return 0;

}

 

 

题目14来源: https://blog.csdn.net/weixin_44018859/article/details/88087467

题目3来源:https://blog.csdn.net/hello_word2/article/details/80951731

题目来源->菜鸟教程:https://www.runoob.com/cprogramming/c-100-examples.html

本文件中讲述了c语言经典的282个案例,由浅入深。有利于提高广大爱好c语言编程的人员。 其中包括: 第1章 初识C语言 1 实例001 第一个C语言程序 2 实例002 一个完整的C语言程序 2 实例003 输出名言 3 实例004 用TC 2.0打开文件 4 实例005 计算正方形的周长 5 第2章 简单的C程序 6 实例006 输出一个正方形 7 实例007 输出一个三角形 8 实例008 一个简单的求和程序 9 实例009 求10! 10 实例010 3个数由小到大排序 11 实例011 猴子桃 13 实例012 阳阳买苹果 14 第3章 算法入门 15 实例013 任意次方后的最后三位 16 实例014 计算某日是该年的第几天 16 实例015 婚礼上的谎言 18 实例016 百元买百鸡 19 实例017 打渔晒网问题 20 实例018 判断三角形的类型 22 实例019 直接插入排序 23 实例020 希尔排序 25 实例021 冒泡排序 26 实例022 快速排序 27 实例023 选择排序 28 实例024 归并排序 29 实例025 二分查找 31 实例026 分块查找 32 实例027 哈希查找 34 实例028 斐波那契数列 37 实例029 哥德巴赫猜想 38 实例030 尼科彻斯定理 39 第4章 常用数据类型 41 实例031 数值型常量的使用 42 实例032 字符型变量的使用 42 实例033 求100~200之间的素数 43 实例034 利用#输出三角形 44 实例035 十进制转换为二进制 45 实例036 n进制转换为十进制 46 实例037 小球下落问题 48 实例038 巧分苹果 49 实例039 老师分糖果 50 实例040 IP地址形式输出 51 实例041 特殊的完全平方数 52 实例042 一数三平方 54 实例043 求等差数列 55 实例044 亲密数 56 实例045 自守数 57 第5章 运算符与表达式 60 实例046 求二元一次不定方程 61 实例047 可逆素数 63 实例048 判断闰年 64 实例049 黑纸与白纸 65 实例050 阿姆斯特朗数 67 实例051 最大公约数和最小公倍数 67 实例052 求一元二次方程的根 69 实例053 自然对数的底e的计算 70 实例054 满足abcd=(ab+cd)2的数 70 实例055 整数加减法练习 71 实例056 判断整倍数 73 实例057 阶梯问题 73 实例058 乘积大于和的数 74 实例059 求各位数之和为5的数 75 第6章 数据输入与输出函数 77 实例060 使用字符函数输入/输出字符 78 实例061 输出相对的最小整数 79 实例062 将小写字母转换为大写字母 80 实例063 水池注水问题 80 实例064 用*号输出图案 81 实例065 输出一个字符的前驱字符 82 实例066 求学生总成绩和平均成绩 83 实例067 回文素数 84 第7章 选择和分支结构程序设计 86 实例068 判断偶数 87 实例069 判断字母是否为大写 88 实例070 检查字符类型 89 实例071 求最低分和最高分 90 实例072 模拟自动售货机 91 实例073 计算工资 93 实例074 平方和值判断 94 实例075 加油站加油 95 实例076 简单计算器 97 第8章 循环结构 98 实例077 使用while语句求n! 99 实例078 使用while为用户提供 菜单显示 100 实例079 一元钱的兑换方案 102 实例080 特殊等式 103 实例081 打印乘法口诀表 104 实例082 平方和运算的问题 105 实例083 求从键盘中输入字符的个数 106 实例084 打印杨辉三角 108 实例085 求总数问题 109 实例086 彩球问题 110 实例087 新同学年龄 112 实例088 灯塔数量 113 实例089 计算12+22+…+102 114 实例090 循环显示随机数 115 实例091 卖西瓜 116 实例092 银行存款问题 117 实例093 统计不及格的人数 118 实例094 猜数字游戏 119 第9章 数组 123 实例095 求各元素之和 124 实例096 使用二维数组保存数据 125 实例097 计算字符串中有多少个单词 126 实例098 不使用strcpy()函数实现 字符串复制功能 127 实例099 逆序存放数据 129 实例100 相邻元素之和 130 实例101 选票统计 131 实例102 使用数组统计学生成绩 132 实例103 查找数组中的最值 134 实例104 判断一个数是否存在数组中 135 实例105 求二维数组对角线之和 136 实例106 模拟比赛打分 137 实例107 矩阵的转置 139 实例108 设计魔方阵 141 实例109 字符升序排列 142 实例110 在指定位置插入字符 144 实例111 删除字符串中的连续字符 146 实例112 统计各种字符个数 147 实例113 字符串替换 148 实例114 回文字符串 150 实例115 字符串加密和解密 151 实例116 对调最大数与最小数位置 153 第10章 函数编程基础 155 实例117 输出两个数中的最大值 156 实例118 判断素数 157 实例119 递归解决年龄问题 158 实例120 递归解决分鱼问题 159 实例121 小数分离 160 实例122 求任意数的n次幂 161 实例123 固定格式输出当前时间 163 实例124 设计函数计算学生平均身高 164 实例125 求数组元素中的最小值 165 实例126 打印1~5的阶乘 166 实例127 求最大公约数和最小公倍数 167 实例128 求直角三角形的斜边 168 实例129 相对的最小整数 169 实例130 当前时间转换 170 实例131 显示程序运行时间 171 实例132 显示当前日期及时间 172 实例133 设置DOS系统日期 173 实例134 设置DOS系统时间 174 实例135 读取并设置BIOS的时钟 175 实例136 任意大写字母转小写 176 实例137 字符串复制到指定空间 176 实例138 查找位置信息 177 实例139 复制当前目录 179 实例140 产生唯一文件 180 实例141 不同亮度显示 181 实例142 字母检测 182 实例143 建立目录 183 实例144 删除目录 184 实例145 对数组进行升序和降序排序 185 实例146 设置组合键 187 实例147 获取当前日期与时间 188 实例148 获取当地日期与时间 189 实例149 获取格林尼治平时 190 实例150 设置系统日期 191 实例151 获取BIOS常规内存容量 193 实例152 读/写BIOS计时器 194 实例153 获取CMOS密码 195 实例154 获取Ctrl+Break消息 197 实例155 鼠标中断 198 实例156 设置文本显示模式 200 实例157 显卡类型测试 204 实例158 获取系统配置信息 206 实例159 访问系统temp中的文件 209 实例160 控制扬声器声音 210 实例161 获取Caps Lock键状态 211 实例162 获取环境变量 212 实例163 贪蛇游戏 213 实例164 五子棋游戏 219 实例165 弹力球游戏 227 第11章 指针 235 实例166 使用指针实现整数排序 236 实例167 指向结构体变量的指针 237 实例168 使用指针输出数组元素 238 实例169 使用指针查找数列中的 最大值和最小值 240 实例170 使用指针的指针输出字符串 241 实例171 使用指向指针的指针对 字符串排序 242 实例172 使用返回指针的函数查找 最大值 244 实例173 使用指针连接两个字符串 245 实例174 用指针实现逆序存放数 组元素值 247 实例175 用指针数组构造字符串数组 248 实例176 用指针函数输出学生成绩 249 实例177 寻找相同元素的指针 251 实例178 查找成绩不及格的学生 252 实例179 使用指针实现冒泡排序 254 实例180 输入月份号并输出英文月份名 255 实例181 使用指针插入元素 256 实例182 使用指针交换两个数组 中的最大值 257 实例183 输出二维数组有关值 259 实例184 输出二维数组任一行 任一列值 260 实例185 将若干字符串按照字母 顺序输出 262 实例186 用指向函数的指针比较大小 263 实例187 寻找指定元素的指针 265 实例188 字符串的匹配 266 第12章 常用数据结构 269 实例189 比较计数 270 实例190 找出最高分 271 实例191 信息查询 272 实例192 候选人选票程序 274 实例193 计算开机时间 276 实例194 取出整型数据的高字节数据 277 实例195 使用共用体存放学生和 老师信息 278 实例196 使用共用体处理任意类型数据 279 实例197 输出今天星期几 281 实例198 创建单向链表 282 实例199 创建双向链表 284 实例200 创建循环链表 287 实例201 使用头插入法建立单链表 289 实例202 双链表逆序输出 291 实例203 约瑟夫环 293 实例204 创建顺序表并插入元素 294 实例205 合并两个链表 296 实例206 单链表节点逆置 298 实例207 应用栈实现进制转换 300 实例208 用栈实现行编辑程序 303 实例209 用栈设置密码 306 实例210 括号匹配检测 310 实例211 用栈及递归计算多项式 313 实例212 链队列 315 实例213 循环缓冲区问题 318 实例214 简单的文本编辑器 321 第13章 位运算操作符 326 实例215 使二进制数特定位翻转 327 实例216 将输入的数左移两位并输出 327 实例217 编写循环移位函数 328 实例218 取出给定16位二进制数 的奇数位 330 实例219 取一个整数的后四位 331 实例220 求一个数的补码 332 实例221 普通的位运算 333 实例222 整数与0异或 334 第14章 存储管理 335 实例223 使用malloc()函数分配内存 336 实例224 调用calloc()函数动态分 配内存 337 实例225 为具有3个数组元素的 数组分配内存 338 实例226 为二维数组动态分配内存 338 实例227 商品信息的动态存放 340 第15章 预处理和函数类型 341 实例228 用不带参数的宏定义求 平行四边形面积 342 实例229 使用宏定义实现数组值 的互换 343 实例230 编写头文件包含圆面积的 计算公式 344 实例231 利用宏定义求偶数和 345 实例232 利用文件包含设计输出模式 346 实例233 使用条件编译隐藏密码 347 第16章 文件读写 349 实例234 关闭所有打开的文件 350 实例235 同时显示两个文件的内容 352 实例236 创建文件 353 实例237 格式化读写文件 355 实例238 创建临时文件 357 实例239 成块读写操作 358 实例240 随机读写文件 360 实例241 以行为单位读写文件 362 实例242 查找文件 364 实例243 重命名文件 364 实例244 删除文件 366 实例245 删除文件中的记录 367 实例246 文件内容复制 369 实例247 错误处理 370 实例248 合并两个文件信息 373 实例249 统计文件内容 375 实例250 读取磁盘文件 376 实例251 将数据写入磁盘文件 378 实例252 显示目录内同类型文件 379 实例253 文件分割 382 实例254 文件加密 384 实例255 自毁程序 386 实例256 明码序列号保护 388 实例257 非明码序列号保护 389 实例258 恺撒加密 391 实例259 RSA加密 394 实例260 获取当前磁盘空间信息 396 实例261 DES加密 398 实例262 获取系统配置信息 403 实例263 获取寄存器信息 405 第17章 图形图像处理 407 实例264 绘制直线 408 实例265 绘制矩形 409 实例266 绘制表格 411 实例267 绘制立体窗口 412 实例268 绘制椭圆 414 实例269 绘制圆弧线 415 实例270 绘制扇区 417 实例271 绘制空心圆 418 实例272 绘制箭头 419 实例273 绘制正弦曲线 420 实例274 绘制彩带 421 实例275 绘制黄色网格填充的椭圆 423 实例276 绘制红色间隔点填充的 多边形 424 实例277 绘制五角星 425 实例278 颜色变换 427 实例279 彩色扇形 428 实例280 输出不同字体 429 实例281 相同图案的输出 431 实例282 设置文本及背景颜色 433
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值