关注

C语言经典100例(1~10)适合初学者(注释详细)

实例1—无重复数字组数

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

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

#include <stdio.h>

int main() {
    int i, j, k;      // 分别代表百位、十位、个位的数字
    int count = 0;    // 计数器,记录符合条件的三位数总数

    printf("所有互不相同的三位数:\n");
    
    // 百位循环:i从1到4
    for (i = 1; i <= 4; i++) {
        // 十位循环:j从1到4
        for (j = 1; j <= 4; j++) {
            // 个位循环:k从1到4
            for (k = 1; k <= 4; k++) {
                // 检查三个数字是否互不相同
                if (i != j && i != k && j != k) {
                    // 组合成三位数:例如i=1, j=2, k=3 → 123
                    int number = i * 100 + j * 10 + k;
                    printf("%d\n", number);
                    count++; // 每找到一个符合条件的数,计数器加1
                }
            }
        }
    }

    // 输出总数
    printf("\n总共有 %d 个符合条件的三位数。\n", count);
    return 0;
}
运行结果:
所有互不相同的三位数:
123
124
132
134
...
431
432
总共有 24 个符合条件的三位数。

    实例2—区间利润提成问题
     

    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>
    
    int main() {
        double profit;  // 输入的利润(单位:万元)
        double bonus = 0.0; // 初始化奖金总额
    
        printf("请从键盘输入当月利润(万元):");
        scanf("%lf", &profit); // 注意:输入时使用小数,例如10.5表示10.5万元
    
        // 根据利润区间分段计算奖金
        if (profit <= 10) {
            bonus = profit * 0.10;
        } else if (profit <= 20) {
            bonus = 10 * 0.10 + (profit - 10) * 0.075;
        } else if (profit <= 40) {
            bonus = 10 * 0.10 + 10 * 0.075 + (profit - 20) * 0.05;
        } else if (profit <= 60) {
            bonus = 10 * 0.10 + 10 * 0.075 + 20 * 0.05 + (profit - 40) * 0.03;
        } else if (profit <= 100) {
            bonus = 10 * 0.10 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (profit - 60) * 0.015;
        } else {
            bonus = 10 * 0.10 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100) * 0.01;
        }
    
        printf("应发放奖金总额(即提成)为:%.2f 万元\n", bonus); // 保留两位小数
        return 0;
    }
    
    ​
    
    ​
    运行结果:
    请输入当月利润(万元):15
    应发放奖金总额为:1.38 万元
    
    请输入当月利润(万元):30
    应发放奖金总额为:2.00 万元
    
    请输入当月利润(万元):150
    应发放奖金总额为:4.45 万元

    实例3—完全平方数

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

    程序分析:

    假设该数为 x。

    1、则:x + 100 = n2, x + 100 + 168 = m2

    2、计算等式:m2 - n2 = (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 + 1

    7、接下来将 i 的所有数字循环计算即可。

    #include <stdio.h>
    
    int main() {
        int i, j, m, n, x;
    
        // 遍历所有可能的i值(i和j均为偶数,且i*j=168)
        for (i = 2; i <= 168; i += 2) {
            if (168 % i == 0) {      // 检查i是否是168的因数
                j = 168 / i;        // 计算对应的j
                if (j % 2 == 0 && j >= 2) { // 检查j是否为偶数且>=2
                    // 计算m和n
                    m = (i + j) / 2;
                    n = (i - j) / 2;
                    // 计算x并验证条件
                    if (n > 0) {    // 确保n是正整数
                        x = n * n - 100;
                        // 输出结果
                        printf("找到符合条件的数:x = %d\n", x);
                        printf("验证:x+100=%d(%d²),x+268=%d(%d²)\n\n", 
                               x+100, n, x+268, m);
                    }
                }
            }
        }
        return 0;
    }

    运行结果:

    找到符合条件的数:x = 21
    验证:x+100=121(11²),x+268=289(17²)
    
    找到符合条件的数:x = 261
    验证:x+100=361(19²),x+268=529(23²)
    
    找到符合条件的数:x = 1581
    验证:x+100=1681(41²),x+268=1849(43²)

    关键点解释
    1. 为什么i和j必须是偶数?
       因为 `m` 和 `n` 必须是整数。若 `i` 和 `j` 均为偶数,则 `(i + j)` 和 `(i - j)` 均为偶数,除以2后仍为整数。

    2. 如何保证遍历所有可能的解?  
       通过遍历 `i` 的所有偶数因数(如2, 4, 6, 12等),确保覆盖所有合法的 `i` 和 `j` 组合。

    3. 为何需要检查 `n > 0`?
       如果 `n` 为负数,虽然数学上满足条件,但题目可能隐含要求 `x` 是正整数。若允许负解,可移除此条件。

    实例4—判断某天是该年的第几天

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

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

    #include <stdio.h>
    
    // 判断是否为闰年
    int isLeapYear(int year) {
        // 闰年规则:能被4整除且不能被100整除,或能被400整除
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            return 1;  // 是闰年
        } else {
            return 0;  // 不是闰年
        }
    }
    
    int main() {
        int year, month, day;
        int sum = 0;  // 存储总天数
        int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 平年每月天数
    
        printf("请输入年 月 日(用空格分隔):");
        scanf("%d %d %d", &year, &month, &day);
    
        // 累加前month-1个月的天数
        for (int i = 0; i < month - 1; i++) {
            sum += days_in_month[i];
        }
    
        sum += day;  // 加上当前月的天数
    
        // 如果是闰年且月份超过2月,额外加1天
        if (isLeapYear(year) && month > 2) {
            sum += 1;
        }
    
        printf("这一天是%d年的第%d天。\n", year, sum);
        return 0;
    }

    改进代码(判断日期是否合法):

    #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};
        
        printf("请输入年份、月份和日期(格式:年 月 日):");
        if (scanf("%d %d %d", &year, &month, &day) != 3) {
            printf("输入无效,请输入正确的年份、月份和日期。\n");
            return 1;
        }
     
        // 检查年份是否合法
        if (year <= 0) {
            printf("年份不合法,请输入一个正整数。\n");
            return 1;
        }
     
        // 检查月份是否合法
        if (month < 1 || month > 12) {
            printf("月份不合法,请输入1到12之间的数字。\n");
            return 1;
        }
     
        // 检查日期是否合法
        if (isLeapYear(year)) {
            daysInMonth[1] = 29; // 闰年2月有29天
        }
     
        if (day < 1 || day > daysInMonth[month - 1]) {
            printf("日期不合法,请输入有效的日期。\n");
            return 1;
        }
     
        // 计算从1月1日到输入日期的天数
        int totalDays = 0;
        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;
    }

    运行结果:

    请输入年 月 日(用空格分隔):2024 3 5
    这一天是2024年的第65天。

    实例5—三数比大小

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

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

    #include <stdio.h>
    
    int main() {
        int x, y, z, temp;  // 定义三个整数和临时变量
    
        printf("请输入三个整数(用空格分隔):");
        scanf("%d %d %d", &x, &y, &z);  // 输入三个数
    
        // 第一步:确保x是三个数中的最小值
        if (x > y) {   // 如果x比y大,交换x和y的值
            temp = x;
            x = y;
            y = temp;
        }
        if (x > z) {   // 如果x比z大,交换x和z的值
            temp = x;
            x = z;
            z = temp;
        }
    
        // 第二步:确保y是剩下的两个数中的较小值
        if (y > z) {   // 如果y比z大,交换y和z的值
            temp = y;
            y = z;
            z = temp;
        }
    
        printf("从小到大排序结果:%d %d %d\n", x, y, z);
        return 0;
    }
    请输入三个整数(用空格分隔):8 5 2
    从小到大排序结果:2 5 8
    
    请输入三个整数(用空格分隔):3 3 1
    从小到大排序结果:1 3 3

    实例6—输出字母C形态

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

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

    #include <stdio.h>
    
    int main() {
        // 逐行输出字母C的图案
        printf("  ****\n");    // 第一行:顶部横线
        printf(" *\n");        // 第二行:左上角竖线
        printf("*\n");         // 第三行:左竖线
        printf("*\n");         // 第四行:左竖线
        printf(" *\n");        // 第五行:左下角竖线
        printf("  ****\n");    // 第六行:底部横线
        return 0;
    }

    运行结果:

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

    实例7—输出特殊字符

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

      实例8—9*9乘法表

    • 8.题目:输出 9*9 口诀。

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

    • #include <stdio.h> // 包含标准输入输出库,用于实现printf等输出功能
      
      int main() {
          int i, j, result; // 定义三个整型变量:i控制行,j控制列,result用于存储乘法结果
          printf("\n"); // 在输出前换行,使输出更美观
      
          // 外层循环,控制行数,从1到9(i < 10)
          for (i = 1; i < 10; i++) {
              // 内层循环,控制列数,从1到当前行号i(j <= i)
              for (j = 1; j <= i; j++) {
                  result = i * j; // 计算当前行号i与列号j的乘积,存储到result变量中
                  // 输出乘法口诀,格式为"i*j=result",并使用%-3d左对齐,宽度为3个字符
                  printf("%d*%d=%-3d", i, j, result); 
              }
              printf("\n"); // 每完成一行的输出后换行,以便开始下一行的输出
          }
          return 0; // 程序正常结束,返回0
      }

      运行结果:

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

      实例9—国际象棋棋盘图

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

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

    • #include <stdio.h>
      
      int main() {
          int i, j; // 定义两个变量,i控制行,j控制列
      
          // 外层循环控制行,从1到8
          for (i = 1; i <= 8; i++) {
              // 内层循环控制列,从1到8
              for (j = 1; j <= 8; j++) {
                  // 根据i+j的和的奇偶性来决定输出黑方格还是白方格
                  if ((i + j) % 2 == 0) {
                      printf("B "); // 如果i+j的和是偶数,输出黑方格(B)
                  } else {
                      printf("W "); // 如果i+j的和是奇数,输出白方格(W)
                  }
              }
              // 每输出完一行后换行
              printf("\n");
          }
      
          return 0;
      }

      运行结果:

    • B W B W B W B W
      W B W B W B W B
      B W B W B W B W
      W B W B W B W B
      B W B W B W B W
      W B W B W B W B
      B W B W B W B W
      W B W B W B W B

    实例10—笑脸打印问题

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

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

    #include <stdio.h>
    
    int main() {
        int i, j;
    
        // 打印两个笑脸
        printf("\x01\x01\n");
    
        // 外层循环控制行,从1到7(假设楼梯有7层)
        for (i = 1; i <= 7; i++) {
            // 内层循环控制列,根据行号i来决定输出的黑方格数量
            for (j = 1; j <= i; j++) {
                // 输出黑方格(用'*'表示)
                printf("* ");
            }
            // 每完成一行后换行
            printf("\n");
        }
    
        return 0;
    }

    运行结果:

    ☺☺
    *
    * *
    * * *
    * * * *
    * * * * *
    * * * * * *
    * * * * * * *

    转载自CSDN-专业IT技术社区

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    原文链接:https://blog.csdn.net/2502_91430041/article/details/147192813

    评论

    赞0

    评论列表

    微信小程序
    QQ小程序

    关于作者

    点赞数:0
    关注数:0
    粉丝:0
    文章:0
    关注标签:0
    加入于:--