C语言经典100题目(满足所有C程序基础)

C 练习实例1 - 组无重复数字的数

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

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

#include<stdio.h>
#define MAX 5

int main() {
    int i,j,k;
    int count = 0;
    for (int i = 1; i < MAX; i++) {
        for (int j = 1; j < MAX; j++) {
            for (int k = 1; k < MAX; k++) {
                //一步将三个位置数不重复的条件满足
                if(i != j && i != k && j != k) {
                    printf("%d%d%d\n",i,j,k);
                    count++;
                }
            }
        }
    }
    printf("%d",count);
}

C 练习实例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,求应发放奖金总数?

程序分析:定义时需把奖金定义成双精度浮点(double)型。

#include<stdio.h>
#define LAC 100000 //将10w定义为一个常用数

int main() {
    double i,bonus,bonus_0_10,bonus_10_20,bonus_20_40,bonus_40_60,bonus_60_100,bonus_100_;
    //先计算好各自区间的奖金,避免重复输入公式
    bonus_0_10 = LAC * 0.1;
    bonus_10_20 = LAC * 0.075;
    bonus_20_40 = LAC * 2 * 0.05;
    bonus_40_60 = LAC * 2 * 0.03;
    bonus_60_100 = LAC * 4 * 0.015;
    printf("从键盘输入当月利润I,求应发放奖金总数:\n");
    scanf("%lf",&i);
    if(i<=LAC) {
        bonus = i * 0.1;
    }
    else if(i<=LAC*2){
        bonus = bonus_0_10 + (i - LAC) * 0.075;
    }
    else if(i<=LAC*4){
        bonus = bonus_0_10 + bonus_10_20 + (i - LAC * 2) * 0.05;
    }
    else if(i<=LAC*6){
        bonus = bonus_0_10 + bonus_10_20 + bonus_20_40 +  (i - LAC * 4) * 0.03;
    }
    else if(i<=LAC*10){
        bonus = bonus_0_10 + bonus_10_20 + bonus_20_40 + bonus_40_60 + (i - LAC * 6) * 0.015;
    }
    else {
        bonus = bonus_0_10 + bonus_10_20 + bonus_20_40 + bonus_40_60 + bonus_60_100 + (i - LAC * 10) * 0.01;
    }
    printf("求应发放奖金总数为%lf",bonus);
}

C 练习实例3 - 完全平方数                                                       

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

程序分析:

假设该数为 x。

1、则:x + 100 = n^2, x + 100 + 168 = m^2;

2、计算等式:m^2 - n^2 = (m + n)(m - n) = 168;

3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数;

4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数;

5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数;

6、由于 i * j = 168, j>=2,则 1 <= i <= 168 / 2 ;

7、接下来将 i 的所有数字循环计算即可。x即为100-n^2。

#include<stdio.h>

int main() {
    int i,j,x,m,n;
    printf("---------------------------------------\n");
    for (i = 2; i <= 168/2; ++i) {
        //因为i*j=168,而j为偶数,所以168/i必然是偶数
        if(168%i == 0) {
            j = 168/i;
            //假设此时i>j
            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 ^ 2\n",x,n);
                printf("%d + 100 + 168 = %d ^ 2\n",x,m);
                printf("---------------------------------------\n");
            }
        }
    }
}

C 练习实例4 - 判断当年第几天

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

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

#include<stdio.h>

int main() {
    int year,month,day,leap;
    printf("请输入 年,月,日 可判断这一天是该年第几天(包含逗号):\n");
    scanf("%d,%d,%d",&year,&month,&day);
    int sum = 0;
    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;
    }
    //case中的sum是在本月前所有月份的天数之和
    sum = sum + day;
    // 判断是否为闰年,leap根据其为0或1
    if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
        leap = 1;
    } else {
        leap = 0;
    }
    //如果月份不在2月之后只是1,2月;则2月是否闰月不影响天数
    if(leap == 1 && month>2) {
        sum++;
    }
    printf("第%d天",sum);
}

C 练习实例5 - 三个数由小到大

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

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

#include<stdio.h>

void swap(int *a,int *b) {
    int t;
    t = *a;
    *a = *b;
    *b = t;
}
int main() {
    int x,y,z;
    printf("输入三个整数 x,y,z,请把这三个数由小到大输出:\n");
    scanf("%d,%d,%d",&x,&y,&z);
    //输入三个整数 x、y、z,请把这三个数由小到大输出
    if(x>y){
        swap(&x,&y);
    }
    else if(x>z){
        swap(&x,&z);
    }
    else if(y>z){
        swap(&y,&z);
    }
    printf("%d %d %d",x,y,z);
}

C 练习实例6 - 输出字母C图案

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

程序分析:可先用'*'号在纸上写出字母C,再分行输出。

#include<stdio.h>

int main() {
    printf("用 * 号输出字母 C!\n");
    printf("  ****\n");
    printf(" *\n");
    printf("*\n");
    printf(" *\n");
    printf("  ****\n");
}

C 练习实例7 - 特殊图案

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

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

VC6.0下出现中文乱码(原因+解决方法):

176的16进制是B0,219的16进制是DB,0xB0DB是"佰"字的内码,所以输出的就是"佰"了。

主要原因是文件信息的代码页不同,我们所使用的操作系统中文状态下的代码页,要显示扩展的ASCII码需要在437 OEM-美国这个下面显示,这样就可以显示出你所希望的。具体修改控制台的默认代码页步骤如下:

  • 1.点击运行界面左上角标题栏图标【c:\】,选择默认值一项
  • 2.修改默认代码页,936(ANSI/OEM-简体中文GBK)为437 OEM-美国
  • 3、关闭后重新运行一下即可 

#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;
}

C 练习实例8 -  9*9 乘法表

题目:输出 9*9 口诀。

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

#include<stdio.h>
#define MAX 9
int main() {
    int i,j,result;
    for (i = 1; i <= MAX; ++i) {
        for (j = 1; j <= i; ++j) {
            result = i*j;
            printf("%d * %d = %d   ",i,j,result);
        }
        printf("\n");
    }
}

C 练习实例9 - 国际象棋棋盘

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

程序分析:国际象棋棋盘由64个黑白相间的格子组成,分为8行*8列。用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。

如果出现乱码情况请参考本博客【C 练习实例7】的解决方法。


#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;
}

C 练习实例10 - 打印笑脸

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

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

如果出现乱码情况请参考【C 练习实例7】的解决方法。

#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;
}

C 练习实例11 - 斐波那契

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

程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....,即下个月是上两个月之和(从第三个月开始)。

#include<stdio.h>

int fibonacci(int n) {
    if(n<2) {
        return n;
    }
    return fibonacci(n-1)+fibonacci(n-2);
}

int main()
{
    int n,result;
    printf("输入一个大于0的数字,求斐波那契数列第n项\n");
    scanf("%d",&n);
    result = fibonacci(n);
    printf("结果是:%d",result);
}

C 练习实例12 - 101到200的素数

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

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

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

bool isPrime(int num) {
    if(num <= 1) return false; // 小于1的都不是素数
    if (num == 2) return true; // 2是素数
    if(num%2 == 0) return false; //能被2整除说明不是素数

    for (int i = 3; i * i <= num; i += 2) {
        if(num%i == 0) return false; // 能有非1的数i整除说明不是素数
    }
    return true; // 通过了重重考验,说明是素数
}

int main()
{
    int count = 0;
    for (int i = 101; i <= 200; ++i) {
        if(isPrime(i)) {
            count++;
            printf("%d\n",i);

        }
    }
    printf("一共有%d个素数",count);
}

C 练习实例13 - 水仙花数

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

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

#include <stdbool.h>
#include<stdio.h>
#define MAX 1000
int main()
{
    int i,g,s,b;// 分别是 个 十 百 位;
    for (int i = 100; i < MAX; ++i) {
        b = i / 100;
        s = (i%100)/10;
        g = (i%100)%10;
        if( i == g*g*g+ s*s*s + b*b*b ) {
            printf("%d\n",i);
        }
    }
}

C 练习实例14 - 分解质因数

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

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

  • (1)如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外 打印出即可。
  • (2)但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n.重复执行第二步。
  • (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
#include <stdio.h>
//一个数n,从2开始除以。如果2能一直整除就没有4,6,8...的事情了
//不能除以2则试3,以此类推5,7...

void Prime_Factors(int n) {
    int prime = 2;// 除了1的最小素数
    printf("%d =",n);
    while (n>1) {
        if(n%prime == 0) {
            n = n/prime;
            printf(" %d",prime);
            if(n>1) {
                printf(" *");
            }
        }
        else {
            prime++; // 3,5,7...
        }
    }
}

int main() {
    int num;
    printf("请输入一个整数:\n");
    scanf("%d",&num);
    Prime_Factors(num);
}

C 练习实例15 - (a>b)?a:b

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

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

#include <stdio.h>

int main() {
    int num;
    char grade;
    printf("请输入一个分数:\n");
    scanf("%d",&num);
    grade = ((num >= 90)?'A':(num>60)?'B':'C');
    printf("评价是%c",grade);
}

C 练习实例16 - 公约数&公倍数

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

程序分析:

(1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数;

(2)求最大公约数用辗转相除法(又名欧几里德算法)

#include <stdio.h>
int gcd(int a,int b) {
    while (b != 0) {
        int temp = b; // 把b存进temp里面
        b = a % b; // 一直到b = 0
        a = temp;
    }
    return a;
}

int lcm(int a,int b) {
    return (a*b)/gcd(a,b);
}

int main() {
    int m, n;
    printf("请输入两个正整数 m 和 n: \n");
    scanf("%d,%d", &m, &n);
    // 计算最大公约数和最小公倍数
    int gcd_value = gcd(m, n);
    int lcm_value = lcm(m, n);
    // 打印结果
    printf("最大公约数 (GCD) = %d\n", gcd_value);
    printf("最小公倍数 (LCM) = %d\n", lcm_value);
}

C 练习实例17 - 统计字母、数字等

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

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

#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;
}

C 练习实例18 - s=a+aa+aaa...

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

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

#include <stdio.h>

int Zz(int a,int n) {
    int zzz = 0;
    for (int i = 0; i < n; i++) {
        zzz = zzz * 10 + a;
    }
    return zzz;
}

int main() {
    int a,n;
    printf("请输入一个数字 a 和 一直到 222...22 多少个 n: \n");
    scanf("%d,%d", &a,&n);
    int sum = 0;
    for (int i = 1; i <= n; ++i) {
        int result = Zz(a,i);
        sum += result;
    }
    printf("结果是 = %d",sum);
}

C 练习实例19 - 完数

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

程序分析:请参照:C 练习实例14

#include <stdio.h>

int SumFactors(int n) {
    int sum = 1;
    for (int i = 2; i*i < n; ++i) {
        if(n%i == 0) {
            sum += i;
            if(n/i != i) {
                sum += n/i;//既然i是,那么n/i肯定也是(一对)
            }
        }
    }
    return sum;
}

int main() {
    int limit = 1000;
    printf("1000以内的完数有:\n");
    for (int num = 2; num <= limit; num++) {
        if (SumFactors(num) == num) {
            printf("%d\n", num);
        }
    }
}

C 练习实例20 - 球落下反弹

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

程序分析:见下面注释。

#include<stdio.h>

int main() {
    double height = 100.0; // 每次下落的高度
    double distance = 0; //经过的距离
    double rebound = 0; //反弹的高度

    for (int i = 0; i < 10; ++i) {
        distance += height;//先加上此次下落的高度
        rebound = height / 2.0; //反弹的高度
        for (int j = 0; j < 9; ++j) {
            distance += rebound;//加上此次反弹的高度(最后第10次下落不加没有反弹)
        }
        height = rebound;
    }
    // 输出结果
    printf("在第10次落地时,总共经过的距离: %.2f 米\n",distance);
    printf("第10次反弹的高度: %.4f 米\n",rebound);
}

C 练习实例21 - 猴子吃桃

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

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

1) 设x1为前一天桃子数,设x2为第二天桃子数, 则:

x2=x1/2-1, x1=(x2+1)*2

x3=x2/2-1, x2=(x3+1)*2

以此类推: x前=(x后+1)*2

2) 从第10天可以类推到第1天,是一个循环过程。

#include<stdio.h>

int main() {
    int peach = 1;//第10天的桃子数
    for (int i = 10; i > 1; i--) {
        peach = (peach + 1) * 2;//循环9次即可,十个数之间九个空
    }
    printf("第一天摘了 %d 个桃子\n", peach);

}

C 练习实例22 - 乒乓球推理

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

#include<stdio.h>
int main() {
    char i, j, k; // i, j, k分别代表甲队队员a, b, c的对手,‌即乙队的x, y, z
    for (i = 'x'; i <= 'z'; i++) { // 遍历乙队队员x到z
        for (j = 'x'; j <= 'z'; j++) { // 遍历乙队队员x到z,‌确保j不等于i(‌避免a与x比赛)‌
            if (i != j) { // 确保不重复
                for (k = 'x'; k <= 'z'; k++) { // 遍历乙队队员x到z,‌确保k不等于i和j(‌避免c与x或z比赛)‌
                    if (i != k && j != k) { // 确保不重复且满足条件
                        printf("赛手名单是 a-%c\tb- %c\tc- %c\n", i, j, k); // 输出满足条件的比赛名单
                    }
                }
            }
        }
    }
    return 0; // 程序结束
}

C 练习实例23 - 打印图案

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

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

int main() {
    int n = 4;  // 这是中间行的星号数量的一半

    // 打印菱形的上半部分(包括中间行)
    for (int i = 0; i < n; i++) {
        // 打印空格
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        // 打印星号
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }

    // 打印菱形的下半部分
    for (int i = n - 2; i >= 0; i--) {
        // 打印空格
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        // 打印星号
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }

    return 0;
}

C 练习实例24 - 2/1+3/2+5/3...

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

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

#include<stdio.h>

int fibonacci(int n) {
    if(n<2) {
        return n;
    }
    return fibonacci(n-1)+fibonacci(n-2);
}

//有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
int main() {
    int arr[30];//为了合适,弄了个30个数的数组
    double sum = 0.0;
    double fenshu = 0.0;
    for (int i = 0; i < 30; ++i) {
        arr[i] = fibonacci(i);
    }//1,1,2,3,5,8,13,21....(从0开始)
    for (int i = 3; i < 23; ++i) {
        int fenzi = arr[i];
        int fenmu = arr[i-1];
        fenshu = (double)fenzi/fenmu;
        sum += fenshu;
    }
    printf("%f",sum);
}

C 练习实例25 - 求阶乘的和

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

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

#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;
}

C 练习实例26 - 递归求阶乘

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

程序分析:

在C语言中,可以使用递归方法来计算阶乘。阶乘的定义是一个正整数 n 的阶乘 n! 等于 n 乘以 n-1 的阶乘。例如,5 的阶乘是 5! = 5 × 4 × 3 × 2 × 1

递归的方法是通过函数调用自身来解决问题。计算 n! 的递归方法可以定义如下:

  • 基本情况:0!1! 都是 1
  • 递归情况:n! = n × (n-1)!
#include<stdio.h>

int factorial(int n) {
    if(n == 0 || n == 1) {
        return 1;
    }
    else {
        return n * factorial(n-1);
    }
}

int main() {
    int result = factorial(5); // 计算5!
    printf("5! = %d\n", result); // 输出结果
    return 0;
}

C 练习实例27 - 逆序打印字符

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

程序分析:在C语言中,scanf函数可以用来从标准输入读取字符。当使用"%5s"格式说明符时,scanf会读取最多5个字符,并自动在输入的末尾加上一个空字符('\0'),形成一个C字符串。

#include<stdio.h>

int reverse(int index, char str[]) {
    if(index >= 0) {
        printf("%c",str[index]);
        reverse(index - 1,str);
    }
}

int main() {
    char str[6];// 自动有一个'\n'
    int num = 5;
    printf("请输入5个字符:");
    scanf("%5s",str);
    reverse(num - 1,str);
}

C 练习实例28 - 岁数推理

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

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

#include<stdio.h>

int getAge(int age) {
    if(age == 1) {
        return 10;
    }
    else {
        age = getAge(age - 1) + 2;
    }
}

int main() {
    printf("%d\n",getAge(5));
}

C 练习实例29 - 逆序打印各位数字

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

程序分析:学会分解出每一位数,如下解释。

#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);
    }
}

C 练习实例30 - 判断是否回文数

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

程序分析:学会分解出每一位数。

#include<stdio.h>

int main() {
    int ge,shi,qian,wan,x;
    printf("请输入 5 位数字:");
    scanf("%d",&x);
    wan = x/10000;
    qian = x%10000/1000;
    shi = x%10000%1000%100/10;
    ge = x%10;
    if (ge==wan&&shi==qian) { /*个位等于万位并且十位等于千位*/
        printf("这是回文数\n");
    } else {
        printf("这不是回文数\n");
    }
}

C 练习实例31 - 判断星期几

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

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

#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;
}

C 练习实例32 - 删字符串指定字母

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

程序分析:

  • removeChar 函数

    • 该函数接受一个字符串 str 和一个要删除的字符 charToRemove
    • 使用两个指针 srcdstsrc 指向字符串的当前位置,dst 用于保存不需要删除的字符。
    • 遍历字符串,如果当前字符不是要删除的字符,则将其复制到 dst 指向的位置,并移动 dst 指针。
    • 最后,给 dst 指针指向的位置添加字符串终止符 '\0',完成删除操作。
  • main 函数

    • 定义了一个示例字符串 "aca" 和一个要删除的字符 'a'
    • 调用 removeChar 函数处理字符串,并打印删除后的结果。
#include<stdio.h>
#include<string.h>

void RemoveChar(char *str,char removeChar) {
    int i,j = 0;
    int len = strlen(str);
    for (i = 0; i < len; i++) {
        if(str[i] != removeChar) {
            str[j] = str[i];
            j++;
        }
    }
    str[j] = '\0';
}

int main() {
    char str[] = "aca";
    char removeChar = 'a';
    printf("Original string: %s\n", str);
    printf("Removed char: %c\n", removeChar);
    RemoveChar(str,removeChar);
    printf("Modified string: %s\n", str);
}

C 练习实例33 - 判断是否质数

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

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

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

bool isPrime(int number) {
    if(number <= 1) {
        return false;
    }
    if(number == 2) {
        return true;
    }
    if(number%2 == 0) {
        return false;
    }
    for (int i = 3; i*i <= number; i += 2) {
        if(number%i == 0){
            return false;
        }
    }
    return true;
}

int main() {
    int number;
    printf("请输入一个整数: \n");
    scanf("%d", &number);
    if (isPrime(number)) {
        printf("%d 是质数。\n", number);
    } else {
        printf("%d 不是质数。\n", number);
    }
}

C 练习实例34 - 练习函数调用

题目:练习函数调用。

程序分析:轻松一下 ~ ~ ~

#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();/*调用此函数*/
}

C 练习实例35 - 字符串反转

题目:字符串反转,如将字符串 "www.csdn.net" 反转为 "ten.ndcs.www"。

程序分析:

reverseString 函数

  • 计算字符串的长度。
  • 使用两个指针,一个指向字符串的开始,另一个指向字符串的末尾。
  • while循环中,交换两个指针所指向的字符,然后移动指针向中间靠拢,直到两个指针交叉。
#include<stdio.h>
#include<stdbool.h>
#include <string.h>

reverseString(char str[]) {
    int length = strlen(str);
    int start = 0;
    int end = length - 1;
    while (start<end) {
        int temp = str[start];
        str[start] = str[end];
        str[end] = temp;
        start++;
        end--;
    }
}

int main() {
    char str[] = "www.csdn.net";
    printf("原字符串: %s\n", str);
    reverseString(str);
    printf("反转后的字符串: %s\n", str);
    return 0;
}

C 练习实例36 - 100内素数

题目:求100之内的素数。

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

#include<stdio.h>
#include<math.h>
int main()
{
    int i,j,k,n=0;
    for(i=2;i<=100;i++)
    {
        k=(int)sqrt(i);
        for(j=2;j<=k;j++)
            if(i%j==0) break;
        if(j>k)
        {
            printf("%d ",i);
            n++;
            if(n%5==0)
                printf("\n");
        }
    }
    return 0;
}

C 练习实例37 - 各种排序

题目:对10个数进行排序。

程序分析:插入排序,选择排序,冒泡排序

#include<stdio.h>

// 插入排序 --从小到大
void insertionSort(int arr[],int arrayLength) {
    int key;
    for (int i = 1; i < arrayLength; ++i) {
        key = arr[i];
        int j = i - 1;
        while (j>=0 && arr[j] > key) {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}

// 选择排序 --从小到大
void selectionSort(int arr[],int arrayLength) {
    int minIndex,temp;
    // 排好前面n-1个数,最后一个不需要排了
    for (int i = 0; i < arrayLength-1; ++i) {
        minIndex = i; // 此刻正在排第i个索引位置的数,应该放什么数
        // j从i的下一个数开始
        for (int j = i+1; j < arrayLength; ++j) {
            if(arr[j]<arr[minIndex]) {
                minIndex = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

// 冒泡排序 --从小到大
void bubbleSort(int arr[],int arrayLength) {
    int temp;
    // i表示轮次,
    for (int i = 0; i < arrayLength-1; ++i) {
        // j表示交换位置的索引,因为一共索引就到了arrayLength-1,并且是交换前面arrayLength-1-i个数
        for (int j = 0; j < arrayLength-1-i; ++j) {
            
        }
    }
}

// 打印数组的函数
void printArray(int arr[], int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {4,3,5,4,7,5,2,9};
    int arrayLength = sizeof(arr) / sizeof(arr[0]); // 获取数组的长度
    insertionSort(arr, arrayLength);
    printf("Sorted array: \n");
    printArray(arr, arrayLength);
}

C 练习实例38 - 矩阵对角元素和

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

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

#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;
}

C 练习实例39 - 一个数插入数组

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

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

#include <stdio.h>

void insert_into_sorted(int brr[], int n, int num) {
    int i;
    for (i = n - 1; i >= 0 && brr[i] > num; i--) {
        brr[i + 1] = brr[i];
    }
    brr[i + 1] = num;
}

int main() {
    int arr[] = {1, 3, 5, 6, 7, 9};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("原数组:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    int brr[n+1]; //由于数组长度不可变,故复刻一个比原来数组arr长度大1的数组brr
    for (int i = 0; i < n; ++i) {
        brr[i] = arr[i];
    }
    int num = 4; // 要插入的数
    insert_into_sorted(brr, n, num);
    // 打印结果
    printf("\n");
    printf("新数组:\n");
    for (int i = 0; i < n+1; i++) {
        printf("%d ", brr[i]);
    }
    return 0;
}

C 练习实例40 - 数组逆序输出

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

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

#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-i-1];
        a[N-i-1] = t;
    }
    printf("\n排序后的数组:\n");
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}

C 练习实例41 - static用法1

题目:学习 static 定义静态变量的用法。

在 C 语言中,static 关键字用于声明静态变量。静态变量与普通变量不同,它们的生存期和作用域是不同的。静态变量在声明时被初始化,只被初始化一次,而且在整个程序的生命周期内都保持存在。在函数内声明的静态变量只能在该函数内访问,而在函数外声明的静态变量则只能在该文件内访问。

程序分析:以下实例中 x() 函数声明了一个静态变量 x,并将其初始化为 0。每次调用 x() 数时,x 的值都会加 1,并打印出新的值。由于 x 是静态变量,它在程序的整个生命周期中都存在,而不仅仅是在函数调用时存在。因此,每次调用 static_x() 时,它都可以记住 x 的值,并在此基础上递增。

#include<stdio.h>
#include<String.h>

void x(){
	int x = 0;
	x++;
	printf("%d\n",x);
}

void static_x(){
	static int x = 0;
	x++;
	printf("%d\n",x);
}

int main(){
	x();
	x();
	static_x();
	static_x();
}

C 练习实例42 - auto用法

题目:学习使用auto定义变量的用法。

程序分析:无。

#include <stdio.h>
int main()
{
    int i,num;
    num=2;
    for(i=0;i<3;i++)
    {
        printf("num 变量为 %d \n",num);
        num++;
        {
            auto int num=1;
            printf("内置模块 num 变量为 %d \n",num);
            num++;
        }
    }
    return 0;
}

C 练习实例43 - static用法2

题目:学习使用static的另一用法。 

程序分析:无。

#include<stdio.h>
#include<String.h>

int main(){
	int i,num =3;
	for(i=0;i<3;i++){
		printf("num的值为: %d\n",num);
		num--;
		{
			static int num = 1;
			printf("内部模块num的值为: %d\n",num);
			num++;
		}
	}
}

C 练习实例44 - 调用外部函数

题目:学习使用如何调用外部函数。

程序分析:无。

#include <stdio.h>
int a,b,c;
void add()
{
    int a;
    a=3;
    c=a+b;
}
int main()
{
    a=b=4;
    add();
    printf("c 的值为 %d\n",c);
    return 0;
}

C 练习实例45 - register用法

题目:学习使用register定义变量的方法。

程序分析:无。

#include <stdio.h>
int main()
{
    register int i;
    int tmp=0;
    for(i=1;i<=100;i++)
        tmp+=i;
    printf("总和为 %d\n",tmp);
    return 0;
}

C 练习实例46 - 宏#define练习1

题目:宏#define命令练习1。

程序分析:无。

#include<stdio.h>
#define mul(x) x*x

int main() {
    int a = 2;
    printf("%d",mul(a));
}

C 练习实例47 - 宏#define练习2

题目:宏#define命令练习2。

程序分析:无。

#include<stdio.h>
#define sw(x,y) {int t;t=x;x=y;y=t;}

int main(){
    int a = 1;
    int b = 2;
    printf("交换前 %d,%d\n",a,b);
    sw(a,b);
    printf("交换后 %d,%d\n",a,b);
}

C 练习实例48 - 宏#define练习3

题目:宏#define命令练习3。

程序分析:无。

#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;
}

C 练习实例49 - #if,#ifdef,#ifndef

题目:#if #ifdef和#ifndef的综合应用。

程序分析:无。

// #if
// #if 指令用于根据表达式的值来决定是否编译某一段代码。表达式的值必须是常量表达式(即在编译时可以确定的值),通常用于定义的常量或宏。
/*
#define VERSION 2

#if VERSION >= 2
    // 这段代码只有在 VERSION >= 2 时才会被编译
    printf("Version 2 or higher\n");
#else
// 这段代码只有在 VERSION < 2 时才会被编译
printf("Version less than 2\n");
#endif
*/

// #ifdef
// #ifdef 是 "if defined" 的缩写,用于检查一个宏是否已经被定义。如果宏已经被定义,紧随其后的代码块会被编译;如果宏未被定义,这段代码块则会被忽略。
/*
#define DEBUG

#ifdef DEBUG
    // 只有在 DEBUG 被定义时,这段代码才会被编译
    printf("Debug mode is enabled\n");
#endif
*/

// #ifndef
// #ifndef 是 "if not defined" 的缩写,用于检查一个宏是否未被定义。如果宏未被定义,紧随其后的代码块会被编译;如果宏已经被定义,这段代码块则会被忽略。
/*
#ifndef VERSION
    // 只有在 VERSION 没有被定义时,这段代码才会被编译
    #define VERSION 1
#endif
*/

#include<stdio.h>
#define MAX
#define MAXIMUM(x,y)(x>y)?x:y
#define MINIMUM(x,y) (x>y)?y:x
int main()
{
    int a=10,b=20;
#ifdef MAX
    printf("更大的数字是 %d\n",MAXIMUM(a,b));
#else
    printf("更小的数字是 %d\n",MINIMUM(a,b));
#endif
#ifndef MIN
    printf("更小的数字是 %d\n",MINIMUM(a,b));
#else
    printf("更大的数字是 %d\n",MAXIMUM(a,b));
#endif
#undef MAX
#ifdef MAX
    printf("更大的数字是 %d\n",MAXIMUM(a,b));
#else
    printf("更小的数字是 %d\n",MINIMUM(a,b));
#endif
#define MIN
#ifndef MIN
    printf("更小的数字是 %d\n",MINIMUM(a,b));
#else
    printf("更大的数字是 %d\n",MAXIMUM(a,b));
#endif
    return 0;
}

C 练习实例50 - #include练习

题目:#include 的应用练习。

程序分析:无。

//test.h 文件代码如下:
#define LAG >
#define SMA <
#define EQ ==

//主文件代码:
#include "test.h"  
#include <stdio.h>

int main()
{
    int i=10;
    int j=20;
    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;
}

C 练习实例51 - 按位与 & 使用

题目:学习使用按位与 &。

程序分析:0&0=0; 0&1=0; 1&0=0; 1&1=1 。

#include <stdio.h>
int main()
{
    int a,b;
    a=077;
    b=a&3;
    printf("a & b(decimal) 为 %d \n",b);
    b&=7;
    printf("a & b(decimal) 为 %d \n",b);
    return 0;
}

//a = 077;八进制 077 转换为十进制是 63
/*
00111111  (63 的二进制)
&
00000011  (3 的二进制)
----------
00000011  (结果是 3)
*/


a & b(decimal) 为 3 
a & b(decimal) 为 3

C 练习实例52 - 按位或 | 使用

题目:学习使用按位或 |。

程序分析:0|0=0; 0|1=1; 1|0=1; 1|1=1 。

#include<stdio.h>
int main()
{
    int a,b;
    a=077;
    b=a|3;
    printf("b 的值为 %d \n",b);
    b|=7;
    printf("b 的值为 %d \n",b);
    return 0;
}
b 的值为 63 
b 的值为 63  

C 练习实例53 - 按位异或 ^ 使用

题目:学习使用按位异或 ^。

程序分析:0^0=0; 0^1=1; 1^0=1; 1^1=0 。

#include <stdio.h>
int main()
{
    int a,b;
    a=077;
    b=a^3;
    printf("b 的值为 %d \n",b);
    b^=7;
    printf("b 的值为 %d \n",b);
    return 0;
}
b 的值为 60 
b 的值为 59 

C 练习实例 54 - 取数右端4~7位

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

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

要从一个整数 a 的右端提取出第 4 到第 7 位(二进制位),可以通过以下步骤完成:

  1. 右移操作:首先将整数右移,使得我们想要的位数对齐到最低位。
  2. 掩码操作:然后使用掩码来提取这些位。

假设我们要提取的是第 4 到第 7 位(从右端开始计数,最低位为第 0 位),可以使用掩码和右移操作完成。以下是详细步骤和代码示例:

解释

  1. 右移:将整数右移 4 位,使得我们想要提取的位对齐到最低位(右端)。

  2. 掩码:使用掩码 0x0F 来提取这四位。0x0F 的二进制表示是 00001111,它能保留最低的 4 位,而将其他位清零。

#include <stdio.h>

int main() {
    int a = 0xABCD1234; // 示例整数,十六进制表示
    int result;

    // 右移 4 位,使得我们需要的位对齐到最低位
    result = (a >> 4) & 0x0F;

    printf("The bits from position 4 to 7 are: %X\n", result);

    return 0;
}

C 练习实例55 - 按位取反~

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

程序分析:~0=-1; ~1=-2;

按位取反的基本原理

按位取反运算符用 ~ 表示,它将一个整数的每一个二进制位都反转。即,将二进制位中的 0 变为 1,将 1 变为 0。例如:

  • 对于二进制数 0000 1110(十进制 14),按位取反的结果是 1111 0001(十进制 -15)。

如何计算按位取反

  1. 将数字转换为二进制形式:

    • 首先,将数字转换为其二进制表示形式。在计算机中,整数通常以补码形式存储。
  2. 对每一位进行取反:

    • 将每一个二进制位反转,0 变成 11 变成 0
  3. 补码表示法:

    • 在计算机中,整数通常使用补码表示。补码表示法中,按位取反的结果是 -(x + 1),其中 x 是原始的十进制数。

实例

a = 234 为例,假设计算机使用 32 位整数:

  1. 转换为二进制:

    • 十进制数 234 的二进制表示是 0000 0000 0000 0000 0000 0000 1110 1010
  2. 按位取反:

    • 取反后得到的二进制数是 1111 1111 1111 1111 1111 1111 0001 0101
  3. 转换回十进制:

    • 这个二进制数表示的是 -235(十进制)。这是因为按位取反运算结果是 -(a + 1)
#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;
}

C 练习实例56 - circle画圆形

题目:画图,学用circle画圆形。

程序分析:无。

#include <graphics.h> //VC6.0中是不能运行的,要在Turbo2.0/3.0中  
int main()   
{  
    int driver,mode,i;   
    float j=1,k=1;   
    driver=VGA;  
    mode=VGAHI;   
    initgraph(&driver,&mode,"");   
    setbkcolor(YELLOW);   
    for(i=0;i<=25;i++)   
    {   
        setcolor(8);   
        circle(310,250,k);   
        k=k+j;   
    j=j+0.3;   
    }   
    return 0;  
}

C 练习实例57 - line画直线

题目:画图,学用line画直线(在TC中实现)。

程序分析:无。

#include "graphics.h"
int main()
{
    int driver,mode,i;
    float x0,y0,y1,x1;
    float j=12,k;
    driver=VGA;mode=VGAHI;
    initgraph(&driver,&mode,"");
    setbkcolor(GREEN);
    x0=263;y0=263;y1=275;x1=275;
    for(i=0;i<=18;i++)
    {
        setcolor(5);
        line(x0,y0,x0,y1);
        x0=x0-5;
        y0=y0-5;   
        x1=x1+5;   
        y1=y1+5;   
        j=j+10;
    }
}

C 练习实例58 - rectangle画方形

题目:学用rectangle画方形。(在TC中实现)。

程序分析:无。

#include "graphics.h"
int main()
{
    int x0,y0,y1,x1,driver,mode,i;
    driver=VGA;mode=VGAHI;
    initgraph(&driver,&mode,"");
    setbkcolor(YELLOW);
    x0=263;y0=263;y1=275;x1=275;
    for(i=0;i<=18;i++)
    {
        setcolor(1);
        rectangle(x0,y0,x1,y1);
        x0=x0-5;
        y0=y0-5;
        x1=x1+5;
        y1=y1+5;
    }
    settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
    outtextxy(150,40,"How beautiful it is!");
    line(130,60,480,60);
    setcolor(2);
    circle(269,269,137);
}

C 练习实例59 - 综合画图1

题目:画图,综合例子。(在TC中实现)。

程序分析:无。

# define PAI 3.1415926
# define B 0.809
# include "graphics.h"
#include "math.h"
int main()
{
    int i,j,k,x0,y0,x,y,driver,mode;
    float a;
    driver=CGA;mode=CGAC0;
    initgraph(&driver,&mode,"");
    setcolor(3);
    setbkcolor(GREEN);
    x0=150;y0=100;
    circle(x0,y0,10);
    circle(x0,y0,20);
    circle(x0,y0,50);
    for(i=0;i<16;i++)
    {
        a=(2*PAI/16)*i;
        x=ceil(x0+48*cos(a));
        y=ceil(y0+48*sin(a)*B);
        setcolor(2); line(x0,y0,x,y);
    }
    setcolor(3);circle(x0,y0,60);
    /* Make 0 time normal size letters */
    settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
    outtextxy(10,170,"press a key");
    getch();
    setfillstyle(HATCH_FILL,YELLOW);
    floodfill(202,100,WHITE);
    getch();
    for(k=0;k<=500;k++)
    {
        setcolor(3);
        for(i=0;i<=16;i++)
        {
            a=(2*PAI/16)*i+(2*PAI/180)*k;
            x=ceil(x0+48*cos(a));
            y=ceil(y0+48+sin(a)*B);
            setcolor(2); line(x0,y0,x,y);
        }
        for(j=1;j<=50;j++)
        {
            a=(2*PAI/16)*i+(2*PAI/180)*k-1;
            x=ceil(x0+48*cos(a));
            y=ceil(y0+48*sin(a)*B);
            line(x0,y0,x,y);
        }
    }
    restorecrtmode();
}

C 练习实例60 - 综合画图2

题目:画图,综合例子2。(在TC中实现)。

程序分析:无。

#include "graphics.h"
#define LEFT 0
#define TOP 0
#define RIGHT 639
#define BOTTOM 479
#define LINES 400
#define MAXCOLOR 15
int main()
{
    int driver,mode,error;
    int x1,y1;
    int x2,y2;
    int dx1,dy1,dx2,dy2,i=1;
    int count=0;
    int color=0;
    driver=VGA;
    mode=VGAHI;
    initgraph(&driver,&mode,"");
    x1=x2=y1=y2=10;
    dx1=dy1=2;
    dx2=dy2=3;
    while(!kbhit())
    {
        line(x1,y1,x2,y2);
        x1+=dx1;y1+=dy1;
        x2+=dx2;y2+dy2;
        if(x1<=LEFT||x1>=RIGHT)
            dx1=-dx1;
        if(y1<=TOP||y1>=BOTTOM)
            dy1=-dy1;
        if(x2<=LEFT||x2>=RIGHT)
            dx2=-dx2;
        if(y2<=TOP||y2>=BOTTOM)
                dy2=-dy2;
        if(++count>LINES)
        {
            setcolor(color);
            color=(color>=MAXCOLOR)?0:++color;
        }
    }
    closegraph();
}

C 练习实例61 - 杨辉三角形

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

程序分析:

结构如下所示:

1
1    1
1    2    1
1    3    3    1
1    4    6    4    1
#include <stdio.h>
#define MAX_ROWS 10

int main() {
    int triangle[MAX_ROWS][MAX_ROWS];
    int i, j;

    // 初始化杨辉三角数组
    for (i = 0; i < MAX_ROWS; i++) {
        for (j = 0; j <= i; j++) {
            if (j == 0 || j == i) {
                // 边界条件:每行的第一个和最后一个元素都是1
                triangle[i][j] = 1;
            } else {
                // 计算当前元素值:等于上方两个元素之和
                triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
            }
        }
    }

    // 打印杨辉三角
    for (i = 0; i < MAX_ROWS; i++) {
        // 打印前导空格以对齐三角形
        for (j = 0; j < MAX_ROWS - i - 1; j++) {
            printf(" ");
        }
        // 打印每行的元素
        for (j = 0; j <= i; j++) {
            printf("%d ", triangle[i][j]);
        }
        printf("\n");
    }
    return 0;
}

C 练习实例62 - putpixel画点

题目:学习putpixel画点,(在TC中实现)。

程序分析:无。


#include "stdio.h"
#include "graphics.h"
int main()
{
    int i,j,driver=VGA,mode=VGAHI;
    initgraph(&driver,&mode,"");
    setbkcolor(YELLOW);
    for(i=50;i<=230;i+=20)
        for(j=50;j<=230;j++)
            putpixel(i,j,1);
    for(j=50;j<=230;j+=20)
        for(i=50;i<=230;i++)
            putpixel(i,j,1);
}

C 练习实例63 - 画椭圆ellipse

题目:画椭圆ellipse(在TC中实现)。

程序分析:无。

#include "stdio.h"
#include "graphics.h"
#include "conio.h"
int main()
{
    int x=360,y=160,driver=VGA,mode=VGAHI;
    int num=20,i;
    int top,bottom;
    initgraph(&driver,&mode,"");
    top=y-30;
    bottom=y-30;
    for(i=0;i<num;i++)
    {
        ellipse(250,250,0,360,top,bottom);
        top-=5;
        bottom+=5;
    }
    getch();
}

C 练习实例64 - 画图

题目:利用ellipse and rectangle 画图(在TC中实现)。

程序分析:无。

#include "stdio.h"
#include "graphics.h"
#include "conio.h"
main()
{
    int driver=VGA,mode=VGAHI;
    int i,num=15,top=50;
    int left=20,right=50;
    initgraph(&driver,&mode,"");
    for(i=0;i<num;i++)
    {
        ellipse(250,250,0,360,right,left);
        ellipse(250,250,0,360,20,top);
        rectangle(20-2*i,20-2*i,10*(i+2),10*(i+2));
        right+=5;
        left+=5;
        top+=10;
    }
    getch();
}

C 练习实例65 - 画优美的图案

题目:一个最优美的图案(在TC中实现)。

程序分析:无。

#include "graphics.h"
#include "math.h"
#include "dos.h"
#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
#include "stdarg.h"
#define MAXPTS 15
#define PI 3.1415926
struct PTS {
    int x,y;
};
double AspectRatio=0.85;
void LineToDemo(void)
{
    struct viewporttype vp;
    struct PTS points[MAXPTS];
    int i, j, h, w, xcenter, ycenter;
    int radius, angle, step;
    double rads;
    printf(" MoveTo / LineTo Demonstration" );
    getviewsettings( &vp );
    h = vp.bottom - vp.top;
    w = vp.right - vp.left;
    xcenter = w / 2; /* Determine the center of circle */
    ycenter = h / 2;
    radius = (h - 30) / (AspectRatio * 2);
    step = 360 / MAXPTS; /* Determine # of increments */
    angle = 0; /* Begin at zero degrees */
    for( i=0 ; i<MAXPTS ; ++i ){ /* Determine circle intercepts */
        rads = (double)angle * PI / 180.0; /* Convert angle to radians */
        points[i].x = xcenter + (int)( cos(rads) * radius );
        points[i].y = ycenter - (int)( sin(rads) * radius * AspectRatio );
        angle += step; /* Move to next increment */
    }
    circle( xcenter, ycenter, radius ); /* Draw bounding circle */
    for( i=0 ; i<MAXPTS ; ++i ){ /* Draw the cords to the circle */
        for( j=i ; j<MAXPTS ; ++j ){ /* For each remaining intersect */
            moveto(points[i].x, points[i].y); /* Move to beginning of cord */
            lineto(points[j].x, points[j].y); /* Draw the cord */
        }
    }
}
int main()
{
    int driver,mode;
    driver=CGA;mode=CGAC0;
    initgraph(&driver,&mode,"");
    setcolor(3);
    setbkcolor(GREEN);
    LineToDemo();
}

C 练习实例66 - 用指针大小排序

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

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

# 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;
}

C 练习实例67 - 数组交换位置

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

程序分析:如下。

#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int n;

    // 输入数组大小
    printf("请输入数组的大小:");
    scanf("%d", &n);

    int arr[n];

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

    // 找到最大值和最小值的索引
    int maxIndex = 0;
    int minIndex = 0;
    for (int i = 1; i < n; i++) {
        if (arr[i] > arr[maxIndex]) {
            maxIndex = i;
        }
        if (arr[i] < arr[minIndex]) {
            minIndex = i;
        }
    }

    // 交换最大值与第一个元素
    swap(&arr[0], &arr[maxIndex]);

    // 交换最小值与最后一个元素
    // 注意:如果最小值和最大值可能是同一个元素,且其位置是相同的,交换需要特殊处理
    if (minIndex == 0) {
        minIndex = maxIndex; // 避免交换第一个元素与自己
    }
    swap(&arr[n-1], &arr[minIndex]);

    // 输出修改后的数组
    printf("修改后的数组是:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

C 练习实例68 - n个数放前面

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

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

#include <stdio.h>

// 函数用于交换数组中的两个部分
void reverse(int arr[], int start, int end) {
    int temp;
    while (start < end) {
        temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

// 主函数
int main() {
    int n, m;

    // 输入数组的大小
    printf("输入数组的大小: ");
    scanf("%d", &n);
    int arr[n];
    // 输入数组元素
    printf("输入数组元素:\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    // 输入旋转的位置
    printf("输入旋转的位置(即需要最后多少个数放前面来): ");
    scanf("%d", &m);
    // 旋转数组
    // 步骤 1: 反转整个数组
    reverse(arr, 0, n - 1);

    // 步骤 2: 反转前 m 个元素
    reverse(arr, 0, m - 1);

    // 步骤 3: 反转后 n - m 个元素
    reverse(arr, m, n - 1);

    // 输出旋转后的数组
    printf("输出旋转后的数组:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

C 练习实例69 - 约瑟夫环

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

程序分析:无。

#include <stdio.h>

// 计算最后剩下的人的原始编号
int josephus(int n, int k) {
    if (n == 1) {
        return 1; // 只有一个人时,返回编号1
    } else {
        // 递归求解
        return (josephus(n - 1, k) + k - 1) % n + 1;
    }
}

int main() {
    int n = 10; // 总人数
    int k = 3;  // 每报数到3的人退出
    
    printf("最后那位是 is: %d\n", josephus(n, k));
    return 0;
}

C 练习实例70 - 求字符串长度

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

程序分析:无。

#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;  
}

C 练习实例71 - 结构体学生数据

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

程序分析:运用结构体。

#include <stdio.h>

// 定义学生结构体
typedef struct {
    int id;         // 学号
    char name[50];  // 姓名
    float score;    // 成绩
} Student;

// 函数声明
void input(Student students[], int count);
void output(Student students[], int count);

int main() {
    Student students[5];
    
    // 输入学生数据
    input(students, 5);
    
    // 输出学生数据
    output(students, 5);
    
    return 0;
}

// 输入学生数据的函数
void input(Student students[], int count) {
    for (int i = 0; i < count; i++) {
        printf("请输入第 %d 个学生的学号: ", i + 1);
        scanf("%d", &students[i].id);
        
        printf("请输入第 %d 个学生的姓名: ", i + 1);
        scanf("%s", students[i].name);
        
        printf("请输入第 %d 个学生的成绩: ", i + 1);
        scanf("%f", &students[i].score);
    }
}

// 输出学生数据的函数
void output(Student students[], int count) {
    printf("\n学生数据记录:\n");
    printf("学号\t姓名\t成绩\n");
    
    for (int i = 0; i < count; i++) {
        printf("%d\t%s\t%.2f\n", students[i].id, students[i].name, students[i].score);
    }
}

C 练习实例72 - 创建链表

题目:创建一个链表。

程序分析:无。

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

// 定义节点结构体
typedef struct Node {
    int data;            // 数据部分
    struct Node* next;   // 指向下一个节点的指针
} Node;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node)); // 分配内存
    if (newNode == NULL) {
        printf("Error allocating memory!\n");
        exit(1);
    }
    newNode->data = data;  // 设置数据
    newNode->next = NULL;  // 初始化下一个节点指针为NULL
    return newNode;
}

// 在链表头部插入新节点
void insertAtHead(Node** head, int data) {
    Node* newNode = createNode(data); // 创建新节点
    newNode->next = *head;            // 将新节点的next指向当前链表的头部
    *head = newNode;                  // 更新链表头部为新节点
}

// 打印链表
void printList(Node* head) {
    Node* current = head;  // 从链表头部开始
    while (current != NULL) {
        printf("%d -> ", current->data);
        current = current->next;  // 移动到下一个节点
    }
    printf("NULL\n");
}

// 释放链表内存
void freeList(Node* head) {
    Node* current = head;
    Node* nextNode;

    while (current != NULL) {
        nextNode = current->next;  // 保存下一个节点的指针
        free(current);             // 释放当前节点
        current = nextNode;        // 移动到下一个节点
    }
}

int main() {
    Node* head = NULL;  // 初始化链表头部为空

    // 向链表中插入数据
    insertAtHead(&head, 10);
    insertAtHead(&head, 20);
    insertAtHead(&head, 30);

    // 打印链表
    printf("Linked List: ");
    printList(head);

    // 释放链表内存
    freeList(head);

    return 0;
}

C 练习实例73 - 反向输出链表

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

程序分析:无。

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

// 定义链表节点
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 反向输出链表
void reversePrint(Node* head) {
    Node* current = head;
    Node* stack[100]; // 假设链表长度不会超过100
    int top = -1;

    // 将链表节点压入栈
    while (current != NULL) {
        stack[++top] = current;
        current = current->next;
    }

    // 依次弹出栈中节点并打印数据
    while (top >= 0) {
        printf("%d ", stack[top--]->data);
    }
    printf("\n");
}

// 打印链表
void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("%d -> ", current->data);
        current = current->next;
    }
    printf("NULL\n");
}

int main() {
    // 创建链表: 1 -> 2 -> 3 -> 4 -> NULL
    Node* head = createNode(1);
    head->next = createNode(2);
    head->next->next = createNode(3);
    head->next->next->next = createNode(4);

    printf("Original list:\n");
    printList(head);

    printf("Reversed list:\n");
    reversePrint(head);

    // 释放链表节点
    Node* temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp);
    }

    return 0;
}

C 练习实例74 - 链接两个链表

题目:连接两个链表。

程序分析:无。

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

// 定义链表节点
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 连接两个链表
void concatenateLists(Node* list1, Node* list2) {
    if (list1 == NULL) {
        list1 = list2;
        return;
    }
    Node* temp = list1;
    while (temp->next != NULL) {
        temp = temp->next;
    }
    temp->next = list2;
}

// 辅助函数:打印链表
void printList(Node* head) {
    while (head != NULL) {
        printf("%d -> ", head->data);
        head = head->next;
    }
    printf("NULL\n");
}

// 主函数示例
int main() {
    // 示例代码省略链表创建部分
    // 创建和连接两个链表后,可以用以下代码进行测试:
    Node* list1 = /* 创建第一个链表 */;
    Node* list2 = /* 创建第二个链表 */;
    
    concatenateLists(list1, list2);
    printList(list1); // 打印连接后的链表

    return 0;
}

C 练习实例75 - 整数反转输出

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

程序分析:无。

#include <stdio.h>

int main() {
    int num, reversed = 0, original;
    
    // 读取整数
    printf("请输入一个整数: ");
    scanf("%d", &num);
    
    original = num; // 保存原始值用于输出

    // 处理负数情况
    int is_negative = (num < 0);
    if (is_negative) {
        num = -num; // 反转时将负号移除
    }

    // 反转整数
    while (num != 0) {
        int digit = num % 10; // 获取最后一位数字
        reversed = reversed * 10 + digit; // 将其添加到反转结果的末尾
        num /= 10; // 去掉最后一位数字
    }

    // 如果原始整数是负数,反转后的结果也应为负数
    if (is_negative) {
        reversed = -reversed;
    }

    // 输出反转后的结果
    printf("反转后的整数是: %d\n", reversed);
    
    return 0;
}

C 练习实例76 - 1/2+1/4+...+1/n

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

程序分析:无。

#include <stdio.h>

// 函数:计算偶数和
// 输入:n - 偶数
// 输出:result - 指向结果的指针
void sum_even(int n, double *result) {
    *result = 0.0; // 初始化结果为0
    // 遍历2到n之间的偶数
    for (int i = 2; i <= n; i += 2) {
        *result += 1.0 / i; // 累加每个偶数的倒数
    }
}

// 函数:计算奇数和
// 输入:n - 奇数
// 输出:result - 指向结果的指针
void sum_odd(int n, double *result) {
    *result = 0.0; // 初始化结果为0
    // 遍历1到n之间的奇数
    for (int i = 1; i <= n; i += 2) {
        *result += 1.0 / i; // 累加每个奇数的倒数
    }
}

int main() {
    int n; // 声明整数n
    printf("请输入一个整数 n: ");
    scanf("%d", &n); // 从用户输入读取n

    double result; // 声明结果变量
    // 判断n是偶数还是奇数
    if (n % 2 == 0) {
        sum_even(n, &result); // 如果是偶数,调用sum_even函数
    } else {
        sum_odd(n, &result); // 如果是奇数,调用sum_odd函数
    }

    // 输出结果
    printf("结果是: %lf\n", result);
    return 0; // 程序结束
}

 

man
woman
girl
boy
sister

C 练习实例77 - 指针的指针练习

题目:填空练习(指向指针的指针)。

程序分析:无。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//
 
#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];       /*在这里填入内容*/
        printf("%s\n",*q);
    }
    return 0;
}
man
woman
girl
boy
sister

 

C 练习实例78 - 结构体找年龄最大

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

程序分析:无。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//
 
#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,*p;
    int i,m=0;
    p=person;
    for(i=0;i<3;i++)
    {
        if(m<p->age)
        {
            m=p->age;
            q=p;
        }
        p++;
    }
    printf("%s %d\n",q->name,q->age);
    return 0;
}
wang 25

 

C 练习实例79 - 字符串排序

题目:字符串排序。

程序分析:无。

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

#define MAX_STRINGS 100
#define MAX_LENGTH 100

int main() {
    char strings[MAX_STRINGS][MAX_LENGTH];
    int n, i, j;
    char temp[MAX_LENGTH];

    printf("输入字符串数量: ");
    scanf("%d", &n);
    printf("输入字符串:\n");
    for (i = 0; i < n; i++) {
        scanf("%s", strings[i]);
    }

    // 冒泡排序
    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; j++) {
            if (strcmp(strings[i], strings[j]) > 0) {
                strcpy(temp, strings[i]);
                strcpy(strings[i], strings[j]);
                strcpy(strings[j], temp);
            }
        }
    }

    printf("排序后的字符串:\n");
    for (i = 0; i < n; i++) {
        printf("%s\n", strings[i]);
    }

    return 0;
}

 

C 练习实例91 - 时间函数库1

题目:时间函数举例1

程序分析:

  1. #include <stdio.h>#include <time.h>: 这两行包含了必要的库文件。stdio.h 是用来进行输入输出操作的标准库,time.h 则提供了处理时间和日期的功能。

  2. time_t rawtime;: time_t 是一个数据类型,用于表示时间。rawtime 变量将用来存储当前的原始时间(即从某个时间点(通常是 1970 年 1 月 1 日 00:00:00 UTC)开始的秒数)。

  3. struct tm * timeinfo;: tm 是一个结构体,用于表示时间和日期的具体组成部分。timeinfo 是一个指向 tm 结构体的指针,用于存储本地时间的详细信息。

  4. time(&rawtime);: 调用 time 函数获取当前时间,并将其存储在 rawtime 中。time 函数的参数是一个 time_t 类型的指针,它将会被填充当前的时间值。

  5. timeinfo = localtime(&rawtime);: 将 rawtime 转换为本地时间的 tm 结构体,并将其指针赋值给 timeinfolocaltime 函数将时间转换为本地时间,并返回一个指向 tm 结构体的指针。

  6. printf("当前本地时间为: %s", asctime(timeinfo));: asctime 函数将 tm 结构体转换为一个人类可读的字符串形式的时间,然后使用 printf 函数将其输出到屏幕上。

  7. return 0;: 程序执行完毕,正常退出,返回值 0 表示程序成功结束。

#include <stdio.h>    // 引入标准输入输出库,用于使用 printf 函数
#include <time.h>     // 引入时间库,用于处理时间和日期

int main ()
{
    time_t rawtime;                // 声明一个变量,用于存储原始时间
    struct tm * timeinfo;          // 声明一个指针,指向 tm 结构体,用于存储本地时间信息
    
    time(&rawtime);                // 获取当前时间,并将其存储在 rawtime 中
    timeinfo = localtime(&rawtime); // 将原始时间转换为本地时间的结构体 tm,并将指针存储在 timeinfo 中
    
    // 使用 asctime 函数将 tm 结构体转换为字符串,并使用 printf 输出
    printf("当前本地时间为: %s", asctime(timeinfo));
    
    return 0;  // 程序正常结束
}

C 练习实例92 - 时间函数库2

题目:时间函数举例1

程序分析:

代码目的是测量一个循环的执行时间,但循环中每次打印一个换行符可能会导致I/O操作时间被包含在测量中,从而影响结果。如果你只想测量计算时间,建议将循环中的I/O操作去掉。下面是一个修改后的例子,用于测量计算操作的时间。

#include <stdio.h>
#include <time.h>

int main()
{
    clock_t start, end;
    double cpu_time_used;
    int i;

    start = clock();
    for(i = 0; i < 300000; i++)
    {
        // 这里做一些计算而不是打印
        volatile int dummy = i * i; // 使用 volatile 防止优化
    }
    end = clock();
    
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    
    // 输出执行时间
    printf("时间间隔为 %6.3f 秒\n", cpu_time_used);
    return 0;
}

C 练习实例93 - 时间函数库3

题目:时间函数举例3

程序分析:

#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;
}

C 练习实例94 - 猜数字

题目:猜谜游戏。

程序分析:无。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void caizi(void)
{
    int n;
    char begin;
    int count = 1;
    srand((int)time(NULL));
    int m = (rand() % 100) + 1;
    puts("游戏开始,请输入数字:");
    while (1)
    {
        scanf("%d", &n);
        if (n == m)
        {
            printf("猜中了,使用了 %d 次!\n", count);
            if (count == 1)
            {
                printf("你是神级人物了!膜拜\n");
                getchar();
                printf("你已经达到最高级别,还需要玩吗?Y/N \n");
                scanf("%c", &begin);
                if (begin == 'Y' || begin == 'y')      //重复玩的一个嵌套循环
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            else if (count <= 5)
            {
                printf("你是王级人物了!非常赞\n");
                getchar();
                printf("需要挑战最高级别不?Y/N \n");
                scanf("%c", &begin);
                if (begin == 'Y' || begin == 'y')
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            else if (count <= 10)
            {
                printf("你是大师级人物了!狂赞\n");
                getchar();
                printf("需要挑战最高级别不?Y/N \n");
                scanf("%c", &begin);
                if (begin == 'Y' || begin == 'y')
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            else if (count <= 15)
            {
                printf("你是钻石级人物了!怒赞\n");
                getchar();
                printf("需要挑战最高级别不?Y/N \n");
                scanf("%c", &begin);
                if (begin == 'Y' || begin == 'y')
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            else
            {
                getchar();
                printf("你的技术还有待提高哦!重玩? Y/N\n");
                scanf("%c",&begin);
                if (begin == 'Y' || begin == 'y')
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            break;
        }
        else if (n < m)
        {
            puts("太小了!");
            puts("重新输入:");
        }
        else
        {
            puts("太大了!");
            puts("重新输入:");
        }
        count++;//计数器
        
        
    }
}
 
 
int main(void)
{
    
    caizi();
    system("pause");
    return 0;
}

C 练习实例95 - 结构体实例

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

程序分析:无。

#include <stdio.h>

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

int main()
{
    struct programming variable;
    char string[] = "www.baidu.com";
   
    variable.constant = 1.23;
    variable.pointer = string;
   
    printf("%f\n", variable.constant);
    printf("%s\n", variable.pointer);
   
    return 0;
}

C 练习实例96 - 子串出现次数

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

程序分析:无。

#include<stdio.h>
#include<string.h>
 
int countSubString(char *str,char *substr){
	int count = 0;
	char *temp = str;
	
	while((temp = strstr(temp,substr) )!= NULL){
		count++;
		temp++;
	}
	return count;
}

int main(){
	char *str = "abcakfjaabcaf"	;
	char *substr = "abc";
	int count = countSubString(str,substr);
	printf("%d",count);
}

C 练习实例97 - 保存到txt

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

程序分析:无。

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


int main(){
	FILE *file;
	char ch;
	file = fopen("C:\Users\Administrator\Desktop\output.txt","w");
	if(file == NULL){
		perror("Error-------");
		return 1;
	}
	printf("输入字符,到#为止");
	while((ch= getchar()) != '#'){
		fputc(ch,file);
	}
	fclose(file);
	return 0;
}

C 练习实例98 - 字母大小写转换

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

程序分析:无。

#include<stdio.h>
#include<ctype.h>

int main(){
	char str[100];
	printf("请输入:\n");
	fgets(str,sizeof(str),stdin);
	
	for(int i=0; str[i]!='\0'; i++){
		if(islower(str[i])){
			str[i] = toupper(str[i]);
		}
		else if(isupper(str[i])){
			str[i] = tolower(str[i]);
		}
	}
	printf("%s",str);
}

C 练习实例99 -  A.txt 与 B.txt

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

程序分析:你需要先创建 A.txt 与 B.txt。

A.txt文件内容:

123

B.txt文件内容:

456
#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;
}

C 练习实例100 - 结构体与磁盘

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

程序分析:无。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值