目录
实例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值 控制字符 0 NUT 32 空格(space) 64 @ 96 `(反引号) 1 SOH 33 ! 65 A 97 a 2 STX 34 " 66 B 98 b 3 ETX 35 # 67 C 99 c 4 EOT 36 $ 68 D 100 d 5 ENQ 37 % 69 E 101 e 6 ACK 38 & 70 F 102 f 7 BEL 39 ' 71 G 103 g 8 BS 40 ( 72 H 104 h 9 HT 41 ) 73 I 105 i 10 LF 42 * 74 J 106 j 11 VT 43 + 75 K 107 k 12 FF 44 , 76 L 108 l 13 CR 45 - 77 M 109 m 14 SO 46 . 78 N 110 n 15 SI 47 / 79 O 111 o 16 DLE 48 0 80 P 112 p 17 DCI 49 1 81 Q 113 q 18 DC2 50 2 82 R 114 r 19 DC3 51 3 83 S 115 s 20 DC4 52 4 84 T 116 t 21 NAK 53 5 85 U 117 u 22 SYN 54 6 86 V 118 v 23 TB 55 7 87 W 119 w 24 CAN 56 8 88 X 120 x 25 EM 57 9 89 Y 121 y 26 SUB 58 : 90 Z 122 z 27 ESC 59 ; 91 [ 123 { 28 FS 60 < 92 \ 124 | 29 GS 61 = 93 ] 125 } 30 RS 62 > 94 ^ 126 ~ 31 US 63 ? 95 _ 127 DEL
实例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 }