Featured image of post Cknow

Cknow

本文简要介绍了使用C语言实现基本的100道例题。

c语言100道经典例题

【程序1】

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include<stdio.h>
 
int main()
{
    int i,j,k;
    printf("\n");
    for(i=1;i<5;i++) { // 以下为三重循环
        for(j=1;j<5;j++) {
            for (k=1;k<5;k++) { // 确保i、j、k三位互不相同
                if (i!=k&&i!=j&&j!=k) { 
                    printf("%d,%d,%d\n",i,j,k);
                }
            }
        }
    }
}

【程序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,求应发放奖金总数?

1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。      

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
int main()
{
    double i;
    double bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
    printf("你的净利润是:\n");
    scanf("%lf",&i);
    bonus1=100000*0.1;
    bonus2=bonus1+100000*0.075;
    bonus4=bonus2+200000*0.05;
    bonus6=bonus4+200000*0.03;
    bonus10=bonus6+400000*0.015;
    if(i<=100000) {
        bonus=i*0.1;
    } else if(i<=200000) {
        bonus=bonus1+(i-100000)*0.075;
    } else if(i<=400000) {
        bonus=bonus2+(i-200000)*0.05;
    } else if(i<=600000) {
        bonus=bonus4+(i-400000)*0.03;
    } else if(i<=1000000) {
        bonus=bonus6+(i-600000)*0.015;
    } else if(i>1000000) {
        bonus=bonus10+(i-1000000)*0.01;
    }
    printf("提成为:bonus=%lf",bonus);
 
    printf("\n");
}

【程序3】

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

1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main (void)
{
    int  i, j, m, n, x;
    for (i = 1; i < 168 / 2 + 1; i++)
    {
        if (168 % i == 0)
        {
            j = 168 / i;
            if ( i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)
            {
                m = (i + j) / 2;
                n = (i - j) / 2;
                x = n * n - 100;
                printf ("%d + 100 = %d * %d\n", x, n, n);
                printf ("%d + 268 = %d * %d\n", x, m, m);
            }
        }
    }
    return 0;
}

【程序4】

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

1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
int isLeapYear(int year) {
    // 闰年的判断规则:能被4整除且(不能被100整除或能被400整除)
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        return 1;
    }
    return 0;
}
 
int main() {
    int year, month, day;
    int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int totalDays = 0;
    
    printf("请输入年份、月份和日期(格式:年 月 日):");
    scanf("%d %d %d", &year, &month, &day);
    
    // 判断是否是闰年
    if (isLeapYear(year)) {
        daysInMonth[1] = 29; // 闰年2月有29天
    }
 
    // 计算从1月1日到输入日期的天数
    for (int i = 0; i < month - 1; i++) {
        totalDays += daysInMonth[i];
    }
    totalDays += day; // 加上当前月份的天数
 
    printf("%d年%d月%d日是该年的第%d天\n", year, month, day, totalDays);
 
    return 0;
}

【程序5】

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

1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
int main()
{
    int x,y,z,t;
    printf("\n请输入三个数字:\n");
    scanf("%d%d%d",&x,&y,&z);
 
    if ( x>y ) { 
        /*交换x,y的值*/
        t=x; x=y; y=t;
    }
 
    if ( x>z ) { 
        /*交换x,z的值*/
        t=z; z=x; x=t;
    }
 
    if ( y>z ) { 
        /*交换z,y的值*/
        t=y; y=z; z=t;
    }
 
    printf("从小到大排序: %d %d %d\n",x,y,z);
}

【程序6】

题目:用*号输出字母C的图案。

1.程序分析:可先用’‘号在纸上写出字母C,再分行输出。

2.程序源代码:

1
2
3
4
5
6
7
8
9
#include "stdio.h"
int main()
{
    printf("用 * 号输出字母 C!\n");
    printf(" ****\n");
    printf(" *\n");
    printf(" * \n");
    printf(" ****\n");
}

【程序7】

题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!

1.程序分析:字符共有256个。不同字符,图形不一样。      

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include<stdio.h>
int main()
{
    char a=176,b=219;
    printf("%c%c%c%c%c\n",b,a,a,a,b);
    printf("%c%c%c%c%c\n",a,b,a,b,a);
    printf("%c%c%c%c%c\n",a,a,b,a,a);
    printf("%c%c%c%c%c\n",a,b,a,b,a);
    printf("%c%c%c%c%c\n",b,a,a,a,b);
    return 0;
}

【程序8】

题目:输出9*9口诀。

1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>
 
int main() {
    int i, j, result;
    printf("\n");
    for (i = 1; i < 10; i++) {
        for (j = 1; j <= i; j++) {
            result = i * j;
            printf("%d*%d=%-3d", i, j, result); /* -3d表示左对齐,占3位 */
        }
        printf("\n"); /* 每一行后换行 */
    }
    return 0;
}

【程序9】

题目:要求输出国际象棋棋盘。

1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include<stdio.h>
 
int main()
{
    int i,j;
    for(i=0;i<8;i++)
    {
        for(j=0;j<8;j++)
            if((i+j)%2==0)
                printf("%c%c",219,219);
            else printf("  ");
        printf("\n");
    }
    return 0;
}

【程序10】

题目:打印楼梯,同时在楼梯上方打印两个笑脸。

1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include<stdio.h>
 
int main()
{
    int i,j;
    printf("\1\1\n"); /*输出两个笑脸*/
    for(i=1;i<11;i++)
    {
        for(j=1;j<=i;j++)
            printf("%c%c",219,219);
        printf("\n");
    }
    return 0;
}

【程序11】

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21…

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
int main()
{
    int a = 1, b = 1, temp, i;
    printf("%12d%12d", a, b); // 输出前两项
 
    for (i = 3; i <= 20; i += 2)
    {
        temp = a + b; // 计算下一项
        printf("%12d", temp); // 输出下一项
 
        a = b; // 更新a
        b = temp; // 更新b
 
        temp = a + b; // 再计算下一项
        printf("%12d\n", temp); // 输出并换行
 
        a = b; // 更新a
        b = temp; // 更新b
    }
 
    return 0;
}

【程序12】

题目:判断101-200之间有多少个素数,并输出所有素数。

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

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main()
{
    int i,j;
    int count=0;
    
    for (i=101; i<=200; i++) 
    {
        for (j=2; j<i; j++) 
        {
        // 如果 j 能被 i 整除再跳出循环
            if (i%j==0) 
                break;
        }
    // 判断循环是否提前跳出,如果 j<i 说明在 2~j 之间,i 有可整除的数
        if (j>=i) 
        {
            count++;
            printf("%d ",i);
        // 换行,用 count 计数,每五个数换行
            if (count % 5 == 0) 
            printf("\n");
        }
    }    
    return 0;
}

【程序13】

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

1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int main() {
    int i, x, y, z;
    
    // 遍历 100 到 999 的数字
    for (i = 100; i < 1000; i++) {
        // 计算各位数字
        x = i % 10;             // 个位
        y = (i / 10) % 10;      // 十位
        z = (i / 100) % 10;     // 百位
 
        // 计算立方和
        int sum = x * x * x + y * y * y + z * z * z;
 
        // 判断是否为水仙花数
        if (i == sum) {
            printf("%d\n", i);
        }
    }
 
    return 0;
}

【程序14】

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

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main()
{
    int n,i;
    printf("请输入整数:");
    scanf("%d",&n);
    printf("%d=",n);
    for(i=2;i<=n;i++)
    {
        while(n%i==0)
        {
            printf("%d",i);
            n/=i;
            if(n!=1) printf("*");
        }
    }
    
    printf("\n");
    return 0;
}

【程序15】

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

1.程序分析:(a>b)?a:b这是条件运算符的基本例子。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include<stdio.h>
int main()
{
    int score;
    char grade;
    printf("请输入分数: ");
    scanf("%d",&score);
    grade=(score>=90)?'A':((score>=60)?'B':'C');
    printf("%c\n",grade);
    return 0;
}

【程序16】

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

1.程序分析:利用辗除法。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main()
{
    int a,b,t,r,n;
    printf("请输入两个数字:\n");
    scanf("%d %d",&a,&b);
    if(a<b)
    {t=b;b=a;a=t;}
    r=a%b;
    n=a*b;
    while(r!=0)
    {
        a=b;
        b=r;
        r=a%b;
    }
    printf("这两个数的最大公约数是%d,最小公倍数是%d\n",b,n/b);
    
    return 0;
}

【程序17】

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

1.程序分析:利用while语句,条件为输入的字符不为’\n’.

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
#include <stdio.h>
 
int main() {
    char c;
    int letterCount = 0, spaceCount = 0, digitCount = 0, otherCount = 0;
 
    printf("请输入一些字符:\n");
 
    while ((c = getchar()) != '\n') {
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
            letterCount++;
        } else if (c >= '0' && c <= '9') {
            digitCount++;
        } else if (c == ' ') {
            spaceCount++;
        } else {
            otherCount++;
        }
    }
 
    printf("字母 = %d, 数字 = %d, 空格 = %d, 其他 = %d\n", letterCount, digitCount, spaceCount, otherCount);
    return 0;
}

【程序18】

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

1.程序分析:关键是计算出每一项的值。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
 
int main() {
    int sum = 0;        // 存储结果的变量
    int base, terms;    // base 为 a 的值,terms 为 n 的值
    int temp;           // 临时变量,用于计算当前项的值
 
    // 提示用户输入值
    printf("请输入整数 a 和 n(例如 2 和 5):\n");
    scanf("%d%d", &base, &terms);
 
    // 初始化 temp 为 a
    temp = base;
 
    // 通过循环计算 a + aa + aaa + ...
    while (terms > 0) {
        sum += temp;          // 累加当前项
        base *= 10;           // base 每次左移一位(例如 2 -> 20 -> 200)
        temp += base;         // 更新 temp,使其变为下一项
        terms--;              // 减少剩余项数
    }
 
    // 输出结果
    printf("计算结果为:%d\n", sum);
    return 0;
}

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

1.程序分析:请参照程序<–上页程序14.

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
int main() {
    int i, j, sum;
    
    printf("1000以内的完数有:\n");
    
    for (i = 1; i <= 1000; i++) {
        sum = 0;  // 每次循环前重置sum
        
        // 找出i的所有真因子并求和
        for (j = 1; j < i; j++) {
            if (i % j == 0) {
                sum += j;
            }
        }
        
        // 如果和等于i本身,则是完数
        if (sum == i) {
            printf("%d = 1", i);  // 所有完数都包含1
            
            // 打印其他因子
            for (j = 2; j < i; j++) {
                if (i % j == 0) {
                    printf(" + %d", j);
                }
            }
            printf("\n");
        }
    }
    
    return 0;
}

【程序20】

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

1.程序分析:见下面注释

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
#define INITIAL_HEIGHT 100.0
#define BOUNCE_COUNT 10
 
int main()
{
    double h = INITIAL_HEIGHT;
    double s = INITIAL_HEIGHT;
 
    // 第一次反弹高度
    h /= 2;
 
    // 计算后续反弹高度和总路程
    for (int i = 2; i <= BOUNCE_COUNT; i++) {
        s += 2 * h;
        h /= 2;
    }
 
    // 输出结果,指定小数位数为2位
    printf("第%d次落地时,共经过%.5f米,第%d次反弹高%.5f米\n", BOUNCE_COUNT, s, BOUNCE_COUNT, h);
 
    return 0;
}

【程序21】

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

1.程序分析:采取逆向思维的方法,从后往前推断。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
int main(){
    int day, x1 = 0, x2;
    day=9;
    x2=1;
    while(day>0) {
        x1=(x2+1)*2;  // 第一天的桃子数是第2天桃子数加1后的2倍
        x2=x1;
        day--;
    }
    printf("总数为 %d\n",x1);
    
    return 0;
}

【程序22】

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

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,

       则表明此数不是素数,反之是素数。       

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
int main() {
    // 定义甲队和乙队的成员
    char teamA[] = {'a', 'b', 'c'}; // 甲队:a, b, c
    char teamB[] = {'x', 'y', 'z'}; // 乙队:x, y, z
 
    // 变量 i, j, k 分别表示 a, b, c 的对手
    char i, j, k;
 
    // 枚举 a 的对手
    for (i = 'x'; i <= 'z'; i++) {
        // 枚举 b 的对手
        for (j = 'x'; j <= 'z'; j++) {
            // 确保 a 和 b 的对手不同
            if (i != j) {
                // 枚举 c 的对手
                for (k = 'x'; k <= 'z'; k++) {
                    // 确保 c 的对手与 a 和 b 的对手不同
                    if (i != k && j != k) {
                        // 满足题目条件:a 不和 x 比,c 不和 x 和 z 比
                        if (i != 'x' && k != 'x' && k != 'z') {
                            // 输出匹配结果
                            printf("比赛顺序:a--%c\tb--%c\tc--%c\n", i, j, k);
                        }
                    }
                }
            }
        }
    }
 
    return 0;
}

【程序23】

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

1
2
3
4
5
6
7
   *
  ***
 *****
*******
 *****
  ***
   *

1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int main()
{
 int i,j,k;
 for(i=0;i<=3;i++) {
     for(j=0;j<=2-i;j++) {
         printf(" ");
     }
     for(k=0;k<=2*i;k++) {
         printf("*");
     }
     printf("\n");
 }
 for(i=0;i<=2;i++) {
     for(j=0;j<=i;j++) {
         printf(" ");
     }
     for(k=0;k<=4-2*i;k++) {
         printf("*");
     }
     printf("\n");
 }
  
}

【程序24】

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

1.程序分析:请抓住分子与分母的变化规律。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 
#include <stdio.h>
 
int main()
{
    int i,t;
    float sum=0;
    float a=2,b=1;
    for(i=1;i<=20;i++)
    {
        sum=sum+a/b;
        t=a;
        a=a+b;
        b=t;
    }
    printf("%9.6f\n",sum);  
}

【程序25】

题目:求1+2!+3!+…+20!的和

1.程序分析:此程序只是把累加变成了累乘。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
// 计算阶乘的函数
unsigned long long factorial(int n) {
    unsigned long long result = 1;
    for(int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}
 
int main() {
    unsigned long long sum = 0;
    
    // 计算1 + 2! + 3! + ... + 20!
    for(int i = 1; i <= 20; i++) {
        sum += factorial(i);
    }
    
    // 输出结果
    printf("1 + 2! + 3! + ... + 20!的和是: %llu\n", sum);
    
    return 0;
}

【程序26】

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

1.程序分析:递归公式:fn=fn_1*4!

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
// 递归函数,用于计算阶乘
int factorial(int n);
 
int main() {
    // 打印 0 到 5 的阶乘
    for (int num = 0; num < 6; num++) {
        printf("%d! = %d\n", num, factorial(num));
    }
    return 0; // 程序正常结束
}
 
// 计算阶乘的递归函数
// 参数:n - 需要计算阶乘的数
// 返回值:n 的阶乘
int factorial(int n) {
    // 定义变量存储结果
    int result;
 
    // 阶乘的递归基准条件
    if (n == 0) {
        result = 1; // 0! = 1
    } else {
        result = n * factorial(n - 1); // 递归计算 n! = n * (n-1)!
    }
    return result; // 返回计算结果
}

【程序27】

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

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
int main()
{
    int i=5;
    void palin(int n);
    printf("请输入5个字符\40:\40");
    palin(i);
    printf("\n");
}
void palin(n)
int n;
{
    char next;
    if(n<=1) {
        next=getchar();
        printf("相反顺序输出结果\40:\40");
        putchar(next);
    } else {
        next=getchar();
        palin(n-1);
        putchar(next);
    }
}

【程序28】

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

1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>
 
int age(n)
int n;
{
    int c;
    if(n==1) c=10;
    else c=age(n-1)+2;
    return(c);
}
int main()
{
    printf("%d\n",age(5));
}

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

1.程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法,师专数002班赵鑫提供) 2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
int main( )
{
    long a,b,c,d,e,x;
    printf("请输入 5 位数字:");
    scanf("%ld",&x);
    a=x/10000;        /*分解出万位*/
    b=x%10000/1000;   /*分解出千位*/
    c=x%1000/100;     /*分解出百位*/
    d=x%100/10;       /*分解出十位*/
    e=x%10;           /*分解出个位*/
    if (a!=0){
        printf("为 5 位数,逆序为: %ld %ld %ld %ld %ld\n",e,d,c,b,a);
    } else if(b!=0) {
         printf("为 4 位数,逆序为: %ld %ld %ld %ld\n",e,d,c,b);
    } else if(c!=0) {
         printf("为 3 位数,逆序为:%ld %ld %ld\n",e,d,c);
    } else if(d!=0) {
         printf("为 2 位数,逆序为: %ld %ld\n",e,d);
    } else if(e!=0) {
         printf("为 1 位数,逆序为:%ld\n",e);
    }
}

【程序30】

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

1.程序分析:同29例

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main( )
{
    long ge,shi,qian,wan,x;
    printf("请输入 5 位数字:");
    scanf("%ld",&x);
    wan=x/10000;        /*分解出万位*/
    qian=x%10000/1000;  /*分解出千位*/
    shi=x%100/10;       /*分解出十位*/
    ge=x%10;            /*分解出个位*/
    if (ge==wan&&shi==qian) { /*个位等于万位并且十位等于千位*/
        printf("这是回文数\n");
    } else {
        printf("这不是回文数\n");
    }
}

【程序31】

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

1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<stdio.h>
 
int main()
{
    char i,j;
    printf("请输入第一个字母:\n");
    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("请输入下一个字母\n");
            scanf("%c",&j);
            if (j=='u') {printf("tuesday\n");break;}
            if (j=='h') {printf("thursday\n");break;}
        case 's':
            printf("请输入下一个字母\n");
            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】

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

1.程序分析:无            

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
// 删除字符串中指定字母函数
char* deleteCharacters(char* str, char* charSet) {
    // 用于存储要删除的字符的哈希表
    int hash[256] = {0}; // 使用256大小的数组来存储ASCII字符,初始化为0
    // 如果要删除的字符集为空,则直接返回原字符串
    if (charSet == NULL)
        return str;
    
    // 标记要删除的字符
    for (int i = 0; i < strlen(charSet); i++)
        hash[(unsigned char)charSet[i]] = 1; // 将要删除的字符的ASCII码位置标记为1
 
    int currentIndex = 0; // 用于追踪当前的字符串索引
    // 通过遍历字符串来删除指定的字符
    for (int i = 0; i < strlen(str); i++) {
        // 如果当前字符不在要删除的字符集中,则保留该字符
        if (!hash[(unsigned char)str[i]])
            str[currentIndex++] = str[i];
    }
    str[currentIndex] = '\0'; // 在字符串的末尾添加空字符,以表示字符串的结束
    return str;
}
 
int main() {
    char s[] = "a";      // 要删除的字母
    char s2[] = "aca";   // 目标字符串
    printf("%s\n", deleteCharacters(s2, s)); // 打印删除指定字符后的字符串
    return 0;
}

【程序33】

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

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

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include<stdio.h>
#include<math.h>
 
#define MAX 1000  // 最大数组大小
 
int prime[MAX];  // 存储是否为质数的数组
 
// 判断数字是否为质数的简单方法(暴力法)
int isPrimeNaive(int n)
{
    if (n <= 1)  // 1及以下的数字不是质数
        return 0;
    for (int i = 2; i < n; i++)  // 从2到n-1逐一检查是否能整除n
        if (n % i == 0)  // 如果能整除,则不是质数
            return 0;
    return 1;  // 找不到因数,则是质数
}
 
// 优化后的质数判断方法:只检查到sqrt(n),并跳过偶数
int isPrime(int n)
{
    if (n <= 1)  // 1及以下的数字不是质数
        return 0;
    if (n == 2)  // 2是质数
        return 1;
    if (n % 2 == 0)  // 排除偶数
        return 0;
    
    int limit = (int)sqrt((double)n);  // 只需要检查到sqrt(n)
    for (int i = 3; i <= limit; i += 2)  // 从3开始,只检查奇数
    {
        if (n % i == 0)  // 如果能整除,则不是质数
            return 0;
    }
    return 1;  // 通过所有测试,n是质数
}
 
// 筛法初始化质数表
void sieve()
{
    for (int i = 0; i < MAX; i++)
        prime[i] = 1;  // 假设所有数都是质数
    prime[0] = prime[1] = 0;  // 0和1不是质数
 
    int limit = (int)sqrt((double)MAX);  // 只需要检查到sqrt(MAX)
    for (int i = 2; i <= limit; i++)  // 从2开始,遍历每个数字
    {
        if (prime[i])  // 如果i是质数
        {
            for (int j = i * i; j < MAX; j += i)  // 标记i的倍数为非质数
                prime[j] = 0;
        }
    }
}
 
// 通过筛法判断一个数是否为质数
int isPrimeSieve(int n)
{
    return prime[n];  // 直接返回该位置是否为质数
}
 
int main()
{
    sieve();  // 初始化质数筛选
 
    // 测试各种数字是否为质数
    printf("N=%d %d\n", 1, isPrime(1));  // 输出:1 不是质数
    printf("N=%d %d\n", 2, isPrime(2));  // 输出:2 是质数
    printf("N=%d %d\n", 3, isPrime(3));  // 输出:3 是质数
    printf("N=%d %d\n", 4, isPrime(4));  // 输出:4 不是质数
    printf("N=%d %d\n", 7, isPrime(7));  // 输出:7 是质数
    printf("N=%d %d\n", 9, isPrime(9));  // 输出:9 不是质数
    printf("N=%d %d\n", 13, isPrime(13));  // 输出:13 是质数
    printf("N=%d %d\n", 17, isPrime(17));  // 输出:17 是质数
    printf("N=%d %d\n", 100, isPrime(100));  // 输出:100 不是质数
    printf("N=%d %d\n", 23, isPrime(23));  // 输出:23 是质数
    printf("N=%d %d\n", 1, isPrime(1));  // 输出:1 不是质数
 
    return 0;
}

【程序34】 题目:练习函数调用

1.程序分析:无 2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>
void hello_world(void)
{
    printf("Hello, world!\n");
}
void three_hellos(void)
{
    int counter;
    for (counter = 1; counter <= 3; counter++)
        hello_world();/*调用此函数*/
}
int main(void)
{
    three_hellos();/*调用此函数*/
}

【程序35】

题目:字符串反转,如将字符串 “www.runoob.com” 反转为 “moc.boonur.www”。

1.程序分析:无

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
 
 
void reverse(char* s)
{
    // 获取字符串长度
    int len = 0;
    char* p = s;
    while (*p != 0)
    {
        len++;
        p++;
    }
    
    // 交换 ...
    int i = 0;
    char c;
    while (i <= len / 2 - 1)
    {
        c = *(s + i);
        *(s + i) = *(s + len - 1 - i);
        *(s + len - 1 - i) = c;
        i++;
    }
}
 
int main()
{
    char s[] = "www.runoob.com";
    printf("'%s' =>\n", s);
    reverse(s);           // 反转字符串
    printf("'%s'\n", s);
    return 0;
}

【程序36】

题目:求100之内的素数   

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

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <math.h>
 
int main() {
    int n = 0;
    for (int i = 2; i <= 100; i++) {
        int is_prime = 1;  // 假设i是素数
        int k = (int)sqrt(i);
        for (int j = 2; j <= k; j++) {
            if (i % j == 0) {
                is_prime = 0;  // 如果i能被j整除,则i不是素数
                break;
            }
        }
        if (is_prime) {
            printf("%d ", i);
            n++;
            if (n % 5 == 0) {
                printf("\n");
            }
        }
    }
    return 0;
}


#include <stdio.h>
#include <stdbool.h>

int main() {
    bool is_prime[101];  // 创建一个布尔数组,初始化为true
    for (int i = 2; i <= 100; i++) {
        is_prime[i] = true;
    }

    for (int i = 2; i * i <= 100; i++) {
        if (is_prime[i]) {
            for (int j = i * i; j <= 100; j += i) {
                is_prime[j] = false;
            }
        }
    }

    int n = 0;
    for (int i = 2; i <= 100; i++) {
        if (is_prime[i]) {
            printf("%d ", i);
            n++;
            if (n % 5 == 0) {
                printf("\n");
            }
        }
    }
    return 0;
}

【程序37】

题目:对10个数进行排序

1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。       

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
 
#define N 10
 
void selectionSort(int arr[], int n) {
    int i, j, minIndex, temp;
    for (i = 0; i < n - 1; i++) {
        minIndex = i;
        for (j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            // Swap the elements
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}
 
int main() {
    int arr[N];
    printf("请输入 %d 个数字:\n", N);
    for (int i = 0; i < N; i++) {
        scanf("%d", &arr[i]);
    }
 
    selectionSort(arr, N);
 
    printf("排序结果是:\n");
    for (int i = 0; i < N; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
 
    return 0;
}

【程序38】

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

1.程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#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】 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。 2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h>
int main()
{
    int a[11]={1,4,6,9,13,16,19,28,40,100};
    int temp1,temp2,number,end,i,j;
    printf("原始数组是:\n");
    for(i=0;i<10;i++)
        printf("%4d",a[i]);
    printf("\n插入一个新的数字: ");
    scanf("%d",&number);
    end=a[9];
    if(number>end)
        a[10]=number;
    else
    {
        for(i=0;i<10;i++)
        {
            if(a[i]>number)
            {
                temp1=a[i];
                a[i]=number;
                for(j=i+1;j<11;j++)
                {
                    temp2=a[j];
                    a[j]=temp1;
                    temp1=temp2;
                }
                break;
            }
        }
    }
    for(i=0;i<11;i++)
        printf("%4d",a[i]);
    printf("\n");
    return 0;
}

【程序40】

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

1.程序分析:用第一个与最后一个交换。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#define N 10
int main()
{
    int a[N]={0,1,2,3,4,5,6,7,8,9};
    int i,t;
    printf("原始数组是:\n");
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    for(i=0;i<N/2;i++)
    {
        t=a[i];
        a[i]=a[N-1-i];
        a[N-1-i]=t;
    }
    printf("\n排序后的数组:\n");
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}

【程序46】

题目:宏#define命令练习(1)   

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define SQ(x) (x)*(x)
int main()
{
    int num;
    int again=1;
    printf("如果值小于 50 程序将终止。\n");
    while(again)
    {
        printf("\n请输入数字:");
        scanf("%d",&num);
        printf("该数字的平方为 %d \n",SQ(num));
        if(num>=50)
            again=TRUE;
        else
            again=FALSE;
    }
    return 0;
}

【程序47】

题目:宏#define命令练习(2)

1.程序分析:            

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include<stdio.h>
#define exchange(a,b) { int t;t=a;a=b;b=t;}//注意放在一行里
int main()
{
    int x=10;
    int y=20;
    printf("x=%d; y=%d\n",x,y);
    exchange(x,y);
    printf("x=%d; y=%d\n",x,y);
    return 0;
}

【程序48】

题目:宏#define命令练习(3)   

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#define LAG >
#define SMA <
#define EQ ==
#include <stdio.h>
int main()
{
    int i,j;
    printf("请输入两个数字:\n");
    scanf("%d %d",&i,&j);
    if(i LAG j)
        printf("%d 大于 %d \n",i,j);
    else if(i EQ j)
        printf("%d 等于 %d \n",i,j);
    else if(i SMA j)
        printf("%d 小于 %d \n",i,j);
    else
        printf("没有值。\n");
    return 0;
}

【程序54】

题目:取一个整数a从右端开始的4~7位。

程序分析:可以这样考虑:

(1)先使a右移4位。

(2)设置一个低4位全为1,其余全为0的数。可用(0«4)

(3)将上面二者进行&运算。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <stdio.h>
int main()
{
    unsigned a,b,c,d;
    printf("请输入整数:\n");
    scanf("%o",&a);
    b=a>>4;
    c=~(~0<<4);
    d=b&c;
    printf("%o\n%o\n",a,d);
    return 0;
}

【程序55】

题目:学习使用按位取反~。   

1.程序分析:~0=1; ~1=0;

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
int main()
{
    int a,b;
    a=234;
    b=~a;
    printf("a 的按位取反值为(十进制) %d \n",b);
    a=~a;
    printf("a 的按位取反值为(十六进制) %x \n",a);
    return 0;
}

【程序61】

题目:打印出杨辉三角形(要求打印出10行如下图)   

1.程序分析:

       1

       1  1

       1  2  1

       1  3  3  1

       1  4  6  4  1

       1  5  10 10 5  1 

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main()
{
    int i,j;
    int a[10][10];
    printf("\n");
    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;j++)
            a[i][j]=a[i-1][j-1]+a[i-1][j];
    for(i=0;i<10;i++) {
        for(j=0;j<=i;j++)
            printf("%5d",a[i][j]);
        printf("\n");
    }
}

【程序66】

题目:输入3个数a,b,c,按大小顺序输出。   

1.程序分析:利用指针方法。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# include<stdio.h>
 
void swap(int *, int *);
int main(void)
{
    int a, b, c;
    int *p1, *p2, *p3;
    printf("输入 a, b ,c:\n");
    scanf("%d %d %d", &a, &b, &c);
    p1 = &a;
    p2 = &b;
    p3 = &c;
    if(a>b)
        swap(p1, p2);
    if(a>c)
        swap(p1, p3);
    if(b>c)
        swap(p2, p3);
    printf("%d %d %d\n", a, b, c);
}
void swap(int *s1, int *s2)
{
    int t;
    t = *s1; *s1 = *s2; *s2 = t;
}

【程序67】

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

1.程序分析:谭浩强的书中答案有问题。      

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<stdio.h>
#include<stdlib.h>
 
void fun(int *s,int n)
{
    int i;
    int max=s[0];
    int a=0;
    for(i=0;i<n;i++)
    {
        if(s[i]>max)
        {
            max=s[i];
            a=i;
        }
    }
    s[a]=s[0];
    s[0]=max;
    int j;
    int min=s[n-1];
    int b=n-1;
    for(j=0;j<n;j++)
    {
        if(s[j]<min)
        {
            min=s[j];
            b=j;
        }
    }
    s[b]=s[n-1];
    s[n-1]=min;
}
 
void printf_s(int *s,int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d ",s[i]);
    printf("\n");
}
 
int main()
{
    int s[20];
    int i,n;
    printf("设置数组长度(<20):");
    scanf("%d",&n);
    printf("输入 %d 个元素:\n",n);
    for(i=0;i<n;i++)
        scanf("%d",&s[i]);
    fun(s,n);
    printf_s(s,n);
    return 0;
}

【程序68】

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

1.程序分析:可以使用一个辅助数组来保存需要移动的元素,然后再将元素按照要求移动到正确的位置。

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
// 通过 shiftArray 函数来实现数组元素的移动。
void shiftArray(int arr[], int n, int m) {
    int temp[m];

    // 保存最后 m 个数到临时数组
    for (int i = n - m, j = 0; i < n; i++, j++) {
        temp[j] = arr[i];
    }

    // 将前面的 n-m 个数向后移动 m 个位置
    for (int i = n - m - 1; i >= 0; i--) {
        arr[i + m] = arr[i];
    }

    // 将临时数组中的数放到最前面
    for (int i = 0; i < m; i++) {
        arr[i] = temp[i];
    }
}
// 在 main 函数中获取用户输入的数组和要移动的位置,调用s hiftArray 函数,最后输出移动后的数组

int main() {
    int n, m;

    printf("请输入整数个数 n:");
    scanf("%d", &n);

    printf("请输入向后移动的位置 m:");
    scanf("%d", &m);

    int arr[n];

    printf("请输入 %d 个整数:", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    shiftArray(arr, n, m);

    printf("移动后的数组:");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

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

1.程序分析: 2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#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]);
        }
    }
    
}

【程序70】

题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。   

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
 
int length(char *s);
 
int main() {
    char str[100]; // 可以根据实际情况增大数组长度
    printf("请输入字符串:\n");
    scanf("%s", str);
    
    int len = length(str); // 调用 length 函数计算字符串长度
    
    printf("字符串有 %d 个字符。\n", len);
    return EXIT_SUCCESS;
}
 
//求字符串长度  
int length(char *s) {  
    int i = 0;
    while (*s != '\0') {  
        i++;   
        s++;  
    }  
    return i;  
}

【程序71】

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

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>
#include<stdlib.h>
typedef struct{
    char name[20];
    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);
    
    system("pause");
    return 0;
}
void input(Stu*stu)
{
    int i;
    for(i=0;i<5;i++)
        scanf("%s%s%d",stu[i].name,stu[i].sex,&(stu[i].age));
}
void output(Stu*stu)
{
    int i;
    for(i=0;i<5;i++)
        printf("%s %s %d\n",stu[i].name,stu[i].sex,stu[i].age);
}

【程序72】

题目:创建一个链表。

1.程序分析:无         

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LNode{
    int          data;
    struct LNode *next;
}LNode,*LinkList;
 
LinkList CreateList(int n);
void print(LinkList h);
int main()
{
    LinkList Head=NULL;
    int n;
    
    scanf("%d",&n);
    Head=CreateList(n);
    
    printf("刚刚建立的各个链表元素的值为:\n");
    print(Head);
    
    printf("\n\n");
    system("pause");
    return 0;
}
LinkList CreateList(int n)
{
    LinkList L,p,q;
    int i;
    L=(LNode*)malloc(sizeof(LNode));
    if(!L)return 0;
    L->next=NULL;
    q=L;
    for(i=1;i<=n;i++)
    {
        p=(LinkList)malloc(sizeof(LNode));
        printf("请输入第%d个元素的值:",i);
        scanf("%d",&(p->data));
        p->next=NULL;
        q->next=p;
        q=p;
    }
    return L;
}
void print(LinkList h)
{
    LinkList p=h->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
}

【程序73】

题目:反向输出一个链表。   

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LNode{
    int          data;
    struct LNode *next;
}LNode,*LinkList;
 
LinkList CreateList(int n);
void print(LinkList h);
int main()
{
    LinkList Head=NULL;
    int n;
    
    scanf("%d",&n);
    Head=CreateList(n);
    
    printf("刚刚建立的各个链表元素的值为:\n");
    print(Head);
    
    printf("\n\n");
    system("pause");
    return 0;
}
LinkList CreateList(int n)
{
    LinkList L,p,q;
    int i;
    L=(LNode*)malloc(sizeof(LNode));
    if(!L)return 0;
    L->next=NULL;
    q=L;
    for(i=1;i<=n;i++)
    {
        p=(LinkList)malloc(sizeof(LNode));
        printf("请输入第%d个元素的值:",i);
        scanf("%d",&(p->data));
        p->next=NULL;
        q->next=p;
        q=p;
    }
    return L;
}
void print(LinkList h)
{
    LinkList p=h->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
}

【程序74】

题目:连接两个链表。

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdlib.h>
#include <stdio.h>
struct list
{
    int data;
    struct list *next;
};
typedef struct list node;
typedef node *link;
link delete_node(link pointer,link tmp)
{
    if (tmp==NULL) /*delete first node*/
        return pointer->next;
    else
    {
        if(tmp->next->next==NULL)/*delete last node*/
            tmp->next=NULL;
        else /*delete the other node*/
            tmp->next=tmp->next->next;
    return pointer;
    }
}
void selection_sort(link pointer,int num)
{
    link tmp,btmp;
    int i,min;
    for(i=0;i<num;i++)
    {
        tmp=pointer;
        min=tmp->data;
        btmp=NULL;
        while(tmp->next)
        {
            if(min>tmp->next->data)
            {
                min=tmp->next->data;
                btmp=tmp;
            }
            tmp=tmp->next;
        }
        printf("\40: %d\n",min);
        pointer=delete_node(pointer,btmp);
    }
}
link create_list(int array[],int num)
{
    link tmp1,tmp2,pointer;
    int i;
    pointer=(link)malloc(sizeof(node));
    pointer->data=array[0];
    tmp1=pointer;
    for(i=1;i<num;i++)
    {
        tmp2=(link)malloc(sizeof(node));
        tmp2->next=NULL;
        tmp2->data=array[i];
        tmp1->next=tmp2;
        tmp1=tmp1->next;
    }
    return pointer;
}
link concatenate(link pointer1,link pointer2)
{
    link tmp;
    tmp=pointer1;
    while(tmp->next)
        tmp=tmp->next;
    tmp->next=pointer2;
    return pointer1;
}
int main(void)
{
    int arr1[]={3,12,8,9,11};
    link ptr;
    ptr=create_list(arr1,5);
    selection_sort(ptr,5);
}

【程序75】

题目:输入一个整数,并将其反转后输出。

1.程序分析:无

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main()
{
    int n, reversedNumber = 0, remainder;
 
    printf("输入一个整数: ");
    scanf("%d", &n);
 
    while(n != 0)
    {
        remainder = n%10;
        reversedNumber = reversedNumber*10 + remainder;
        n /= 10;
    }
 
    printf("反转后的整数: %d", reversedNumber);
 
    return 0;
}

【程序76】

题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)

1.程序分析:无

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
#include<stdlib.h>
double  evenumber(int n);
double  oddnumber(int n);
 
int main()
{
    int n;
    double r;
    double (*pfunc)(int);
    printf("请输入一个数字:");
    scanf("%d",&n);
    if(n%2==0) pfunc=evenumber;
    else pfunc=oddnumber;
    
    r=(*pfunc)(n);
    printf("%lf\n",r);
    
    system("pause");
    return 0;
}
double  evenumber(int n)
{
    double s=0,a=0;
    int i;
    for(i=2;i<=n;i+=2)
    {
        a=(double)1/i;
        s+=a;
    }
    return s;
}
double  oddnumber(int n)
{
    double s=0,a=0;
    int i;
    for(i=1;i<=n;i+=2)
    {
        a=(double)1/i;
        s+=a;
    }
    return s;
}

【程序77】

题目:指向指针的指针(使用多级指针遍历字符串数组)。

1.程序分析:无 

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    // 定义一个字符指针数组,存储字符串常量
    const char *s[] = {"man", "woman", "girl", "boy", "sister"};
    // 定义一个指向字符指针的指针变量
    const char **q;
    int k;
 
    // 遍历数组,并通过指向指针的指针输出每个字符串
    for (k = 0; k < 5; k++) {
        q = &s[k]; // 让指针 q 指向字符指针数组中第 k 个元素的地址
        printf("%s\n", *q); // 解引用 q,输出对应的字符串
    }
 
    return 0;
}

【程序78】

题目:找到年龄最大的人,并输出。请找出程序中有什么问题。

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <stdlib.h>
 
// 定义结构体类型,用于存储人员的姓名和年龄
struct man {
    char name[20];
    int age;
} person[3] = {{"li", 18}, {"wang", 25}, {"sun", 22}}; // 初始化数组
 
int main() {
    struct man *q = NULL; // 用于指向年龄最大的人员
    struct man *p = person; // 指向数组的起始地址
    int i;
    int max_age = 0; // 存储最大年龄
 
    // 遍历数组,找到年龄最大的人员
    for (i = 0; i < 3; i++) {
        if (p->age > max_age) { // 如果当前年龄大于 max_age
            max_age = p->age; // 更新 max_age
            q = p; // 将 q 指向当前人员
        }
        p++; // 移动到下一个人员
    }
 
    // 输出年龄最大的人员的姓名和年龄
    if (q != NULL) {
        printf("%s %d\n", q->name, q->age);
    } else {
        printf("没有找到人员信息。\n");
    }
 
    return 0;
}

【程序79】

题目:字符串排序。

1.程序分析:无

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_LEN 20 // 定义常量表示字符串的最大长度
 
// 函数声明:用于交换两个字符串
void swap(char *str1, char *str2);
 
int main() {
    char str1[MAX_LEN], str2[MAX_LEN], str3[MAX_LEN];
 
    // 提示用户输入字符串
    printf("请输入3个字符串,每个字符串以回车结束:\n");
 
    // 使用 fgets 读取输入并去除换行符
    fgets(str1, sizeof(str1), stdin);
    str1[strcspn(str1, "\n")] = '\0'; // 去除换行符
 
    fgets(str2, sizeof(str2), stdin);
    str2[strcspn(str2, "\n")] = '\0'; // 去除换行符
 
    fgets(str3, sizeof(str3), stdin);
    str3[strcspn(str3, "\n")] = '\0'; // 去除换行符
 
    // 对字符串进行排序
    if (strcmp(str1, str2) > 0) swap(str1, str2);
    if (strcmp(str2, str3) > 0) swap(str2, str3);
    if (strcmp(str1, str2) > 0) swap(str1, str2);
 
    // 输出排序后的结果
    printf("排序后的结果为:\n");
    printf("%s\n%s\n%s\n", str1, str2, str3);
 
    return 0;
}
 
// 交换两个字符串的内容
void swap(char *str1, char *str2) {
    char temp[MAX_LEN];
    strcpy(temp, str1); // 将 str1 复制到临时字符串 temp
    strcpy(str1, str2); // 将 str2 复制到 str1
    strcpy(str2, temp); // 将 temp 复制到 str2
}

【程序80】

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

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
int main() {
    int n = 0;  // n 表示初始桃子数
    int i, count;
    int found = 0;
 
    while (!found) {
        n += 1;  // 假设初始桃子数
        count = n;
        for (i = 0; i < 5; i++) {
            if ((count - 1) % 5 == 0) {
                count = (count - 1) / 5 * 4;
            } else {
                break;
            }
        }
        if (i == 5) {
            found = 1;
        }
    }
 
    printf("最少有 %d 个桃子。\n", n);
    return 0;
}

【程序81】

题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
void output(long int b, long int i){
    printf("\n%ld = 800 * %ld + 9 * %ld\n", b,i,i);
}
 
 
int main(){
 
    void output(long int b, long int i);
    long int a,b,i;
    a = 809;
    for(i = 10; i < 100; i++){
        b = i * a;
        if (b >= 1000 && b <= 10000 && 8 * i < 100 && 9 * i >= 100){
            output(b, i);
        }
    }
    return 0;
}

【程序82】

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

1.程序分析:           

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <math.h>
#include <string.h>
 
// 函数声明
int octalToDecimal(const char *octalNumber);
 
int main() {
    char octalNumber[100];
    
    // 输入八进制数
    printf("请输入一个八进制数: ");
    scanf("%s", octalNumber);
    
    // 转换为十进制
    int decimalNumber = octalToDecimal(octalNumber);
    
    // 输出结果
    printf("八进制数 %s 转换为十进制数是: %d\n", octalNumber, decimalNumber);
    
    return 0;
}
 
// 八进制转换为十进制的函数
int octalToDecimal(const char *octalNumber) {
    int decimalNumber = 0;
    int length = strlen(octalNumber);
    
    for(int i = 0; i < length; i++) {
        int digit = octalNumber[i] - '0'; // 将字符转换为数字
        decimalNumber += digit * pow(8, length - i - 1);
    }
    
    return decimalNumber;
}

【程序83】

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

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main(int agrc, char*agrv[])
{
    long sum = 4, s = 4;//sum的初始值为4表示,只有一位数字组成的奇数个数为4个
    int j;
    for (j = 2; j <= 8; j++)
    {    
        printf("%d位数为奇数的个数%ld\n", j-1, s);
        if (j <= 2)
            s *= 7;
        else
            s *= 8;
        sum += s;    
    }
    printf("%d位数为奇数的个数%ld\n", j-1, s);
    printf("奇数的总个数为:%ld\n", sum);
    // system("pause");
    return 0;
}

【程序84】

题目:一个偶数总能表示为两个素数之和。

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
#include<stdlib.h>
int Isprimer(unsigned int n);
int main()
{
    unsigned int n,i;
    do{
        printf("请输入一个偶数:\n");
        scanf("%d",&n);
    }while(n%2!=0);
    for(i=1;i<n;i++)
        if(Isprimer(i)&&Isprimer(n-i))
            break;
    printf("偶数%d可以分解成%d和%d两个素数的和\n",n,i,n-i);
    
    return 0;
}
int Isprimer(unsigned int n)
{
    int i;
    if(n<4)return 1;
    else if(n%2==0)return 0;
    else
        for(i=3;i<sqrt(n)+1;i++)
            if(n%i==0)return 0;
    
    return 1;
}

【程序85】

题目:判断一个素数能被几个9整除

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int p,i;
    long int sum=9;
    printf("请输入一个素数:\n");
    scanf("%d",&p);
    for(i=1;;i++)
        if(sum%p==0)break;
        else sum=sum*10+9;
   
    printf("素数%d能整除%d个9组成的数%ld\n",p,i,sum);
    return 0;
}

【程序86】

题目:两个字符串连接程序

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
 
char* strconnect(char *str1,char *str2);
 
int main()
{
    char str1[20],str2[20];
    char *str;
    puts("请输入两个字符串,用回车分开:");
    scanf("%s%s", str1, str2);
    str=strconnect(str1,str2);
    puts("连接后的字符串为:");
    puts(str);
    return 0;
}
char* strconnect(char *str1,char *str2)
{
    char*str;
    str=(char*)malloc(strlen(str1)+strlen(str2)+1);
    str[0]='\0';
    strcat(str,str1);
    strcat(str,str2);
    return str;
}

【程序87】

题目:回答结果(结构体变量传递)

1.程序分析:     

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
 
struct student
{
    int x;
    char c;
} a;
 
int main()
{
    a.x=3;
    a.c='a';
    f(a);
    printf("%d,%c",a.x,a.c);
}
f(struct student b)
{
    b.x=20;
    b.c='y';
}

【程序88】

题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int n,i,j;
    printf("请输入数字:\n");i--;
    for(i=0;i<7;i++)
    {
        scanf("%d",&n);
        if(n>50){
            printf("请重新输入:\n");i--;
        }
        else
        {
            for(j=0;j<n;j++)
                printf("*");
        }
        printf("\n");
    }
    return 0;
}

【程序89】

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

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main()
{
    int a,i,aa[4],t;
    printf("请输入四位数字:");
    scanf("%d",&a);
    aa[0]=a%10;
    aa[1]=a%100/10;
    aa[2]=a%1000/100;
    aa[3]=a/1000;
    for(i=0;i<=3;i++)
    {
        aa[i]+=5;
        aa[i]%=10;
    }
    for(i=0;i<=3/2;i++)
    {
        t=aa[i];
        aa[i]=aa[3-i];
        aa[3-i]=t;
    }
    printf("加密后的数字:");
    for(i=3;i>=0;i--)
        printf("%d",aa[i]);
    printf("\n");
}

【程序90】

题目:专升本一题,读结果。

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<stdlib.h>

#define M 5
int main()
{
    int a[M]={1,2,3,4,5};
    int i,j,t;
    i=0;j=M-1;
    while(i<j)
    {
        t=*(a+i);
        *(a+i)=*(a+j);
        *(a+j)=t;
        i++;j--;
    }
    for(i=0;i<M;i++) {
        printf("%d\n",*(a+i));
    }
    
}

【程序91】

题目:时间函数举例1

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>
#include <time.h>

int main ()
{
    time_t rawtime;
    struct tm * timeinfo;
    
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    printf ( "当前本地时间为: %s", asctime (timeinfo) );
    
    return 0;
}

【程序92】

题目:时间函数举例2

1.程序分析:           

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <time.h>

int main()
{
    time_t start,end;
    int i;
    start=time(NULL);
    for(i=0;i<300000;i++)
    {
        printf("\n");  // 返回两个time_t型变量之间的时间间隔
    }
    end=time(NULL);
    
    // 输出执行时间
    printf("时间间隔为 %6.3f\n",difftime(end,start));
}

【程序93】

题目:时间函数举例3

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    long i=10000000L;
    clock_t start,finish;
    double TheTimes;
    printf("做%ld次空循环需要的时间为",i);
    start=clock();
    while(i--);
    finish=clock();
    TheTimes=(double)(finish-start)/CLOCKS_PER_SEC;
    printf("%f秒。\n",TheTimes);
    return 0;
}

【程序94】

题目:猜谜游戏。

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
// 处理是否继续游戏的逻辑
int ask_to_play_again() {
    char begin;
    printf("需要挑战最高级别不?Y/N \n");
    scanf(" %c", &begin);  // 注意前面有个空格,确保跳过上次输入的换行符
    if (begin == 'Y' || begin == 'y') {
        return 1;  // 用户选择继续游戏
    }
    printf("谢谢,再见!\n");
    return 0;  // 用户选择退出游戏
}
 
// 游戏的主体逻辑
void caizi(void) {
    int n;
    int count = 1;
    srand((unsigned int)time(NULL));  // 更严谨地处理随机数种子
    int m = (rand() % 100) + 1;
    
    printf("游戏开始,请输入数字:\n");
    
    while (1) {
        scanf("%d", &n);
 
        if (n == m) {
            printf("猜中了,使用了 %d 次!\n", count);
 
            // 根据猜测次数,给出不同的评价
            if (count == 1) {
                printf("你是神级人物了!膜拜\n");
            } else if (count <= 5) {
                printf("你是王级人物了!非常赞\n");
            } else if (count <= 10) {
                printf("你是大师级人物了!狂赞\n");
            } else if (count <= 15) {
                printf("你是钻石级人物了!怒赞\n");
            } else {
                printf("你的技术还有待提高哦!\n");
            }
 
            // 询问是否继续游戏
            if (ask_to_play_again()) {
                caizi();  // 重新开始游戏
            }
            break;
        } else if (n < m) {
            puts("太小了!");
            puts("重新输入:");
        } else {
            puts("太大了!");
            puts("重新输入:");
        }
 
        count++;  // 计数器
    }
}
 
int main(void) {
    caizi();
    return 0;
}

【程序95】

题目:简单的结构体应用实例。

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

struct programming
{
    float constant;
    char *pointer;
};

int main()
{
    struct programming variable;
    char string[] = "菜鸟教程:https://www.runoob.com";
   
    variable.constant = 1.23;
    variable.pointer = string;
   
    printf("%f\n", variable.constant);
    printf("%s\n", variable.pointer);
   
    return 0;
}

【程序96】

题目:计算字符串中子串出现的次数

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int i,j,k,TLen,PLen,count=0;
    char T[50],P[10];
    printf("请输入两个字符串,以回车隔开,母串在前,子串在后:\n");
    gets(T);
    gets(P);
    TLen=strlen(T);
    PLen=strlen(P);
    for(i=0;i<=TLen-PLen;i++)
    {
        for(j=0,k=i;j<PLen&&P[j]==T[k];j++,k++)
            ;
        if(j==PLen)count++;
    }
    printf("%d\n",count);
    system("pause");
    return 0;
}

【程序97】

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

1.程序分析:     

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE*fp=NULL;
    char filename[25];
    char ch;
    printf("输入你要保存到的文件的名称:\n");
    gets(filename);
    if((fp=fopen(filename,"w"))==NULL)
    {
        printf("error: cannot open file!\n");
        exit(0);
    }
    printf("现在你可以输入你要保存的一些字符,以#结束:\n");
    getchar();
    while((ch=getchar())!='#'){
        fputc(ch,fp);
    }
    fclose(fp);
    system("pause");
    return 0;
}

【程序98】

题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。

    输入的字符串以!结束。

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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);
    
    system("pause");
    return 0;
}

【程序99】

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

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    FILE*fa,*fb,*fc;
    int i,j,k;
    char str[100],str1[100];
    char tem;
    if((fa=fopen("A.txt","r"))==NULL) // A.txt 文件需要存在
    {
        printf("error: cannot open A file!\n");
        exit(0);
    }
    fgets(str,99,fa);
    fclose(fa);
    if((fb=fopen("B.txt","r"))==NULL)  // B.txt 文件需要存在
    {
        printf("error: cannot open B file!\n");
        exit(0);
    }
    fgets(str1,100,fb);
    fclose(fb);
    strcat(str,str1);
    for(i=strlen(str)-1;i>1;i--)
        for(j=0;j<i;j++)
            if(str[j]>str[j+1])
            {
                tem=str[j];
                str[j]=str[j+1];
                str[j+1]=tem;
            }
    
    if((fc=fopen("C.txt","w"))==NULL)  // 合并为 C.txt
    {
        printf("error: cannot open C file!\n");
        exit(0);
    }
    fputs(str,fc);
    fclose(fc);
    system("pause");
    return 0;
}

【程序100】

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

1.程序分析:

2.程序源代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
#include<stdlib.h>
typedef struct{
    int ID;
    int math;
    int English;
    int C;
    int avargrade;
    char name[20];
}Stu;
int main()
{
    FILE*fp;
    Stu stu[5];
    int i,avargrade=0;
    printf("请输入5个同学的信息:学生号,姓名,3门成绩:\n");
    for(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].avargrade=(stu[i].math+stu[i].English+stu[i].C)/3;
    }
    
    if((fp=fopen("stud","w"))==NULL)
    {
        printf("error :cannot open file!\n");
        exit(0);
    }
    for(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].avargrade);
    
    fclose(fp);
    // system("pause");
    return 0;
}
✨ 本站由 Hugo + Stack 主题搭建 | 不忘初心,慢慢成长 ✨
使用 Hugo 构建
主题 StackJimmy 设计