学懂C语言(三十九):C语言编程实践---从实例精通C语言

avatar
作者
筋斗云
阅读量:0

目录

实例1:字符转 ASCII 码

 实例2:交换两个数的值

实例3:判断奇数/偶数

实例4:判断元音/辅音

实例5: 判断闰年

实例6:求两数的最大公约数

实例7:求两数最小公倍数

实例8: 阶乘

实例9:判断数字为几位数

实例10:判断回文数

实例11:判断素数

实例12 :判断两个数之间的素数

实例13:使用函数判断两数间的素数

实例14:求一个整数的所有因数

实例15:实现简单的计算器

实例16:计算一个数是否可为两个素数之和

实例17:字符串翻转

实例18:查找字符在字符串中出现的次数

实例19: 约瑟夫生者死者小游戏

实例20: 五人分鱼


实例1:字符转 ASCII 码

#include <stdio.h> int main() {     char c;     printf("输入一个字符: ");       // 读取用户输入     scanf("%c", &c);            // %d 显示整数     // %c 显示对应字符     printf("%c 的 ASCII 为 %d", c, c);     return 0; }

运行结果:

输入一个字符: a a 的 ASCII 为 97

基础知识扩展

ASCII 定义了 128 个字符。

分类:

  • 一:0-31、127(删除键)是控制字符
  • 二:空白字符:空格(32)、 制表符、 垂直制表符、 换行、 回车。
  • 三:可显示字符:a-z、A-Z、0-9、~、!、@、、%、^、&、#、$、*、(、)、-、+、{、}、[、]、'、"、<、>、,、?、/、|、\、_、:、;、.,还有顿号、。

ASCII 表:

ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32空格(space)64@96`(反引号)
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39'71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92\124|
29GS61=93]125}
30RS62>94^126
31US63?95_127DEL

 实例2:交换两个数的值

方法一、使用临时变量

以下实例演示了交换两个浮点数的值。

#include <stdio.h>   int main() {       double firstNumber, secondNumber, temporaryVariable;         printf("输入第一个数字: ");       scanf("%lf", &firstNumber);         printf("输入第二个数字: ");       scanf("%lf",&secondNumber);         // 将第一个数的值赋值给 temporaryVariable       temporaryVariable = firstNumber;         // 第二个数的值赋值给 firstNumber       firstNumber = secondNumber;         // 将 temporaryVariable 赋值给 secondNumber       secondNumber = temporaryVariable;         printf("\n交换后, firstNumber = %.2lf\n", firstNumber);       printf("交换后, secondNumber = %.2lf", secondNumber);         return 0; }

运行结果:

输入第一个数字: 1 输入第二个数字: 2  交换后, firstNumber = 2.00 交换后, secondNumber = 1.00

方法一、不使用临时变量

不使用临时变量交换两个整数的值:

#include <stdio.h>   int main() {    int a, b;      a = 11;    b = 99;      printf("交换之前 - \n a = %d, b = %d \n\n", a, b);      a = a + b;  // ( 11 + 99 = 110)  此时 a 的变量为两数之和,b 未改变    b = a - b;  // ( 110 - 99 = 11)      a = a - b;  // ( 110 - 11 = 99)      printf("交换后 - \n a = %d, b = %d \n", a, b); }

运行结果:

交换之前 -   a = 11, b = 99   交换后 -   a = 99, b = 11 

实例3:判断奇数/偶数

#include <stdio.h>   int main() {     int number;       printf("请输入一个整数: ");     scanf("%d", &number);       // 判断这个数除以 2 的余数     if(number % 2 == 0)         printf("%d 是偶数。", number);     else         printf("%d 是奇数。", number);       return 0; }

运行结果:

请输入一个整数: 5 5 是奇数。

实例4:判断元音/辅音

判断输入的字母是元音,还是辅音。

英语有26个字母,元音只包括 a、e、i、o、u 这五个字母,其余的都为辅音。y是半元音、半辅音字母,但在英语中都把他当作辅音。

#include <stdio.h>   int main() {     char c;     int isLowercaseVowel, isUppercaseVowel;       printf("输入一个字母: ");     scanf("%c",&c);       // 小写字母元音     isLowercaseVowel = (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');       // 大写字母元音     isUppercaseVowel = (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U');       // if 语句判断     if (isLowercaseVowel || isUppercaseVowel)         printf("%c  是元音", c);     else         printf("%c 是辅音", c);     return 0; }

运行结果:

输入一个字母: G G 是辅音

实例5: 判断闰年

用户输入年份,判断该年份是否为闰年。

#include <stdio.h>   int main() {     int year;       printf("输入年份: ");     scanf("%d",&year);       if(year%4 == 0)     {         if( year%100 == 0)         {             // 这里如果被 400 整数是闰年             if ( year%400 == 0)                 printf("%d 是闰年", year);             else                 printf("%d 不是闰年", year);         }         else             printf("%d 是闰年", year );     }     else         printf("%d 不是闰年", year);          return 0; }

运行结果:

输入年份: 1990 1990 不是闰

实例6:求两数的最大公约数

用户输入两个数,求这两个数的最大公约数。

#include <stdio.h>   int main() {     int n1, n2, i, gcd;       printf("输入两个正整数,以空格分隔: ");     scanf("%d %d", &n1, &n2);       for(i=1; i <= n1 && i <= n2; ++i)     {         // 判断 i 是否为最大公约数         if(n1%i==0 && n2%i==0)             gcd = i;     }       printf("%d 和 %d 的最大公约数是 %d", n1, n2, gcd);       return 0; }

运行结果:

输入两个正整数,以空格分隔: 81 153 81 和 153 的最大公约数是 9

实例 - 使用 while 和 if

#include <stdio.h> int main() {     int n1, n2;          printf("输入两个数,以空格分隔: ");     scanf("%d %d",&n1,&n2);       while(n1!=n2)     {         if(n1 > n2)             n1 -= n2;         else             n2 -= n1;     }     printf("GCD = %d",n1);       return 0; }

运行结果:

输入两个数,以空格分隔: 81 153 GCD = 9

实例7:求两数最小公倍数

用户输入两个数,求这两个数的最小公倍数。

实例 - 使用 while 和 if

#include <stdio.h>   int main() {     int n1, n2, minMultiple;     printf("输入两个正整数: ");     scanf("%d %d", &n1, &n2);       // 判断两数较大的值,并赋值给 minMultiple     minMultiple = (n1>n2) ? n1 : n2;       // 条件为 true     while(1)     {         if( minMultiple%n1==0 && minMultiple%n2==0 )         {             printf("%d 和 %d 的最小公倍数为 %d", n1, n2,minMultiple);             break;         }         ++minMultiple;     }     return 0; }

运行结果:

输入两个正整数: 72 120 72 和 120 的最小公倍数为 360

实例8: 阶乘

一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且 0 的阶乘为 1。自然数 n 的阶乘写作 n!。

n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,1!=1,n!=(n-1)!×n。

实例

#include <stdio.h>   int main() {     int n, i;     unsigned long long factorial = 1;       printf("输入一个整数: ");     scanf("%d",&n);       // 如果输入是负数,显示错误     if (n < 0)         printf("Error! 负数没有阶乘jiechen");       else     {         for(i=1; i<=n; ++i)         {             factorial *= i;              // factorial = factorial*i;         }         printf("%d! = %llu", n, factorial);     }       return 0; }

实例 - 使用递归

#include <stdio.h> long int multiplyNumbers(int n);   int main() {     int n;     printf("输入一个整数: ");     scanf("%d", &n);     printf("%d! = %ld", n, multiplyNumbers(n));     return 0; } long int multiplyNumbers(int n) {     if (n > 1)         return n*multiplyNumbers(n-1);     else         return 1; }

实例9:判断数字为几位数

用户输入数字,判断该数字是几位数。

#include <stdio.h> int main() {     long long n;     int count = 0;       printf("输入一个整数: ");     scanf("%lld", &n);       while(n != 0)     {         // n = n/10         n /= 10;         ++count;     }       printf("数字是 %d 位数。", count); }

实例10:判断回文数

判断一个数是否为回文数。

设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数

#include <stdio.h>   int main() {     int n, reversedInteger = 0, remainder, originalInteger;       printf("输入一个整数: ");     scanf("%d", &n);       originalInteger = n;       // 翻转     while( n!=0 )     {         remainder = n%10;         reversedInteger = reversedInteger*10 + remainder;         n /= 10;     }       // 判断     if (originalInteger == reversedInteger)         printf("%d 是回文数。", originalInteger);     else         printf("%d 不是回文数。", originalInteger);          return 0; }

实例11:判断素数

质数(prime number)又称素数,有无限个。质数定义为在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数,这样的数称为质数。

#include <stdio.h>   int main() {     int n, i, flag = 0;       printf("输入一个正整数: ");     scanf("%d",&n);       for(i=2; i<=n/2; ++i)  {         // 符合该条件不是素数         if(n%i==0)  {             flag=1;             break;         }     }     if(n <=1 ) {         flag=1; // 1 和 0 不是素数     }     if (flag==0)         printf("%d 是素数",n);     else         printf("%d 不是素数",n);          return 0; }

运行结果:

输入一个正整数: 29 29 是素数

实例12 :判断两个数之间的素数

#include <stdio.h>   int main() {     int low, high, i, flag;     printf("输入两个整数: ");     scanf("%d %d", &low, &high);       printf("%d 与 %d 之间的素数为: ", low, high);       while (low < high)     {         flag = 0;           for(i = 2; i <= low/2; ++i)         {             if(low % i == 0)             {                 flag = 1;                 break;             }         }           if (flag == 0)             printf("%d ", low);           ++low;     }       return 0; }

运行结果:

输入两个整数: 100  200 100 与 200 之间的素数为: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199

实例13:使用函数判断两数间的素数

#include <stdio.h>   int checkPrimeNumber(int n); int main() {     int n1, n2, i, flag;       printf("输入两个正整数: ");     scanf("%d %d", &n1, &n2);     printf("%d 和 %d 间的素数为: ", n1, n2);       for(i=n1+1; i<n2; ++i)     {         // 判断是否为素数         flag = checkPrimeNumber(i);           if(flag == 1)             printf("%d ",i);     }     return 0; }   // 函数定义 int checkPrimeNumber(int n) {     int j, flag = 1;       for(j=2; j <= n/2; ++j)     {         if (n%j == 0)         {             flag =0;             break;         }     }     return flag; }

输出结果为:

输入两个正整数: 10 30 10 和 30 间的素数为: 11 13 17 19 23 29

实例14:求一个整数的所有因数

假如a*b=c(a、b、c都是整数),那么我们称a和b就是c的因数。

#include <stdio.h>   int main() {     int number, i;       printf("输入一个整数: ");     scanf("%d",&number);       printf("%d 的因数有: ", number);     for(i=1; i <= number; ++i)     {         if (number%i == 0)         {             printf("%d ",i);         }     }       return 0; }

运行结果:

输入一个整数: 60 60 的因数有: 1 2 3 4 5 6 10 12 15 20 30 60

实例15:实现简单的计算器

# include <stdio.h>   int main() {       char operator;     double firstNumber,secondNumber;       printf("输入操作符 (+, -, *, /): ");     scanf("%c", &operator);       printf("输入两个数字: ");     scanf("%lf %lf",&firstNumber, &secondNumber);       switch(operator)     {         case '+':             printf("%.1lf + %.1lf = %.1lf",firstNumber, secondNumber, firstNumber + secondNumber);             break;           case '-':             printf("%.1lf - %.1lf = %.1lf",firstNumber, secondNumber, firstNumber - secondNumber);             break;           case '*':             printf("%.1lf * %.1lf = %.1lf",firstNumber, secondNumber, firstNumber * secondNumber);             break;           case '/':             printf("%.1lf / %.1lf = %.1lf",firstNumber, secondNumber, firstNumber / secondNumber);             break;           // operator doesn't match any case constant (+, -, *, /)         default:             printf("Error! operator is not correct");     }          return 0; }

输出结果为:

输入操作符 (+, -, *, /): * 输入两个数字: 4 5 4.0 * 5.0 = 20.0

 

实例16:计算一个数是否可为两个素数之和

#include <stdio.h>   int checkPrime(int n); int main() {     int n, i, flag = 0;       printf("输入正整数: ");     scanf("%d", &n);       for(i = 2; i <= n/2; ++i)     {         // 检测判断         if (checkPrime(i) == 1)         {             if (checkPrime(n-i) == 1)             {                 printf("%d = %d + %d\n", n, i, n - i);                 flag = 1;             }           }     }       if (flag == 0)         printf("%d 不能分解为两个素数。", n);       return 0; }   // 判断素数 int checkPrime(int n) {     int i, isPrime = 1;       for(i = 2; i <= n/2; ++i)     {         if(n % i == 0)         {             isPrime = 0;             break;         }       }       return isPrime; }

输出结果为:

输入正整数: 34 34 = 3 + 31 34 = 5 + 29 34 = 11 + 23 34 = 17 + 17

实例17:字符串翻转

使用递归来翻转字符串。

#include <stdio.h> void reverseSentence();   int main() {     printf("输入一个字符串: ");     reverseSentence();       return 0; }   void reverseSentence() {     char c;     scanf("%c", &c);       if( c != '\n')     {         reverseSentence();         printf("%c",c);     } }

输出结果为:

输入一个字符串: abcdefg gfedcba

实例18:查找字符在字符串中出现的次数

查找字符在字符串中的起始位置(索引值从 0 开始)。

#include <stdio.h>   int main() {    char str[1000], ch;    int i, frequency = 0;      printf("输入字符串: ");    fgets(str, (sizeof str / sizeof str[0]), stdin);      printf("输入要查找的字符: ");    scanf("%c",&ch);      for(i = 0; str[i] != '\0'; ++i)    {        if(ch == str[i])            ++frequency;    }      printf("字符 %c 在字符串中出现的次数为 %d", ch, frequency);      return 0; }

实例19: 约瑟夫生者死者小游戏

30 个人在一条船上,超载,需要 15 人下船。

于是人们排成一队,排队的位置即为他们的编号。

报数,从 1 开始,数到 9 的人下船。

如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

#include<stdio.h>   int c = 0; int i = 1; int j = 0; int a[30] = { 0 }; int b[30] = { 0 };   int main() {     while (i<=31) {         if (i == 31) {             i = 1;         } else if (c == 15) {             break;         } else {             if (b[i] != 0) {                 i++;                 continue;             } else {                 j++;                 if (j != 9) {                     i++;                     continue;                 } else {                     b[i] = 1;                     a[i] = j;                     j = 0;                     printf("第%d号下船了\n", i);                     i++;                     c++;                 }             }         }     } }

执行以上实例,输出结果为:

第9号下船了 第18号下船了 第27号下船了 第6号下船了 第16号下船了 第26号下船了 第7号下船了 第19号下船了 第30号下船了 第12号下船了 第24号下船了 第8号下船了 第22号下船了 第5号下船了 第23号下船了

实例20: 五人分鱼

A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。

日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。

B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。 。

C、D、E依次醒来,也按同样的方法拿鱼。

问他们台伙至少捕了多少条鱼?以及每个人醒来时见到了多少鱼?

#include <stdio.h> int main(){     int n,x,j,k,l,m;     for(n=5;;n++){         j=4*(n-1)/5;         k=4*(j-1)/5;         l=4*(k-1)/5;         m=4*(l-1)/5;         if(n%5==1&&j%5==1&&k%5==1&&l%5==1&&m%5==1){             printf("至少合伙捕鱼:%d条\n",n);             printf("分别见到鱼的条数:%d %d %d %d\n",j,k,l,m);             break;         }     }     return 0; }

以上实例输出结果为:

至少合伙捕鱼:3121条 分别见到鱼的条数:2496 1996 1596 1276

实例21: 报数游戏

n个人围成一圈,进行顺序排号, 从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的使原来第几号的那位。(要求用指针)

#include <stdio.h> // 头文件  int main() { // 主函数     int i, k, n, m; // 定义整型变量     int num[50]; // 定义整型数组     int *p; // 定义指针变量     printf("输入n="); // 提示语句     scanf("%d", &n); // 键盘输入      // 判断输入的有效性     if (n <= 0 || n > 50) {         printf("请输入一个有效的数字(1-50)。\n");         return 1; // 返回错误代码     }      p = num; // 指针指向数组     for (i = 0; i < n; i++) {         *(p + i) = i + 1; // 以1至n为序给每个人编号     }      i = 0; // i为每次循环时计数变量     k = 0; // k为按1,2,3报数时的计数变量     m = 0; // m为退出人数      while (m < n - 1) { // 当退出人数比n-1少时执行循环体         if (*(p + i) != 0) { // 如果当前位置不为0             k++; // 报数         }         if (k == 3) { // 如果报到3             *(p + i) = 0; // 对退出的人的编号置为0             k = 0; // 重置报数             m++; // 退出人数加1         }         i++; // 移动到下一个人         if (i == n) { // 报数到尾后,i恢复为0             i = 0;         }     }      // 找到最后一个留下的人的编号     for (i = 0; i < n; i++) {         if (*(p + i) != 0) {             printf("最后一个留下的人是: %d\n", *(p + i)); // 输出结果             break; // 找到后退出循环         }     }      return 0; // 主函数返回值为0 } 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!