目录
实例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
}