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

  • 11
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值