🗒️C++实例
00 分钟
2024-3-31
2024-4-3
type
status
date
slug
summary
tags
category
icon
password
image
😀
C++: -实例

实例

 

输出整数的位数

#include <stdio.h>int main() { int number = 123; int i = 0; for (i = 0; number > 0; i++) { number /= 10; } printf("%d", i); return 0; }

控制小数点后输出的位数

#include <stdio.h>int main() { double f = 1342.2345; printf("%.10f\n", f); return 0; }
输出:
1342.2345000000
  • 注意:这样输出的值会进行四舍五入,例如:
#include <stdio.h>int main() { double a = 0.0049; printf("%.3f\n", a); printf("%.30f\n", a); printf("%.2f\n", 0.005); return 0; }
输出:
0.005 0.004899999999999999800000000000 0.01
我们可以通过在浮点数后面加上f来表示这个是float而并非double,负责就会默认为
由于浮点数在精度上有一定范围所以在做运算时会有误差,而且在大量的运算时这种误差会累积,所有不能用浮点数做计算,一般要用整数做计算
整数对于计算机是二进制都数,可以之间用来加减,但浮点数在计算机内部是一种编码
第一个比特表达正负,后面的11个比特表达指数部分,最后的52个比特表达分数部分,但实际情况不绝对是这样,不一定会把所有的比特都用完,这张图只是大致示意
  • 如果没有特殊需求整数用int,浮点数用double ,因为现在的计算机在硬件运算时对应这些类型在速度上不会有太大的差别

求平均数

#include <stdio.h>int main() { //初始化 int number; int sum = 0; int count = 0; scanf("%d", &number); while (number != -1)//当输入值为-1时循环结束,程序才能输出结果 { sum += number; //把所有数都加起来 count ++; //每加入一个数count的值就加一 scanf("%d", &number); } printf("%f\n", 1.0 * sum / count);//输出平均数 return 0; }
 
sum / count 表示总数除以所有数的数量=这些数的平均值
之所以乘1.0是因为要引入浮点数,这样就可以使输出的值为浮点数

整数逆序

一个整数,例如1234567,如何通过C语言变为7654321呢?
我们设想一个方案,一个整数123,我们对它除以10并取余就得到了12…3,这表示它可以除以12个10余数为3,然后再对这个剩下的12除以10并取余,得1…2,它可以除以1个10,余数为2,最后再对剩下的1除以10,得0…1,取余还是1。这时候我们输出三次取余的结果,输出结果为321,正好是整数123的逆序,,理论可行实践开始
首先需要一些变量,给变量x设一个整数值12345,然后给给这个整数除以10并取余
int x; int digit; int ret = 0; x = 12345; digit = x % 10;
但这样还不够,这只取了一个余数,我们需要有一个循环来连续的进行这个操作
int x; int digit; int ret = 0; x = 12345; while (x > 0) { digit = x % 10; x /= 10;//给整数x降一位,如果不降整数x不变,循环将一直进行 }
由于一个整数不断的除以10并取余,这个整数会不断减小,最终被除成小数零点几,如果我们变量使用的类型是int,那么这个数输出是则会直接取整数部分0,所以我们就有了一个循环条件,只要这个整数一直是大于0则循环一直进行,等于0时也就说明这个整数以及没有余数可取了
完整代码:
#include <stdio.h>int main() { int x; int digit; int ret = 0; scanf("%d", &x); while (x > 0) { digit = x % 10; x /= 10; printf("%d", digit); } return 0; }

判断是否为素数

#include <stdio.h>int main() { int x; int i; int isPrime = 1; scanf("%d", &x); //素数不能被除了1和它本身以外的整除,所以要从i=2开始,i要小于x for (i = 2; i < x; i++) //从2开始循环,每循环一次i就加1 { if (x % i == 0){ //如果余数为零说明x能被除了1和它自己以外的数整除 isPrime = 0; break; //如果已经确定不是素数就跳出循环 } } if (isPrime == 1) { printf("是素数\n"); } else { printf("不是素数\n"); } return 0; }

输出一定范围以内的素数

我们在 判断是否为素数中 实现了对素数的判断,只需要在外面再套一个循环就可以输出在一定范围里的所有素数
#include <stdio.h>int main() { int x; int num; int i; scanf("%d", &num);//输入范围最大值 for (x = 1; x <= num; x++) { int isPrime = 1; for (i = 2; i < x; i++) { if (x % i == 0) { isPrime = 0;//不是素数则输出为0 break;//不是素数就跳出这个循环 } } if (isPrime == 1)//判断是否为素数 { printf("%d ", x);//输出素数 } } return 0; }
 
在这个程序中isPrime 初始化为1,由于在两个循环里变量x=1,i=2所以在判断1和2的时候是不会经过里面的那个循环进行判断,而是直接输出这个两个数
注意一定要把int isPrime = 1; 放在第一个循环里,由于最开始变量的初始化只执行一次,所以如果放在第一个循环开始前,不论你输入的范围多大都只能输出1 2 3,这是因为在判断4是不是素数是,四可以被整除,这时会执行isPrime = 0; ,由于之前的变量初始化只能执行一次,所以在之后的判断中不论值为多少isPrime 都只能为0,进而影响了下面if (isPrime == 1)的判断,所以导致出现只能输出123的情况,当然你也可以在if (x % i == 0)判断中加一个else,就像这样
#include <stdio.h>int main() { int x; int num; int i; int isPrime = 1; scanf("%d", &num); for (x = 1; x <= num; x++) { for (i = 2; i < x; i++) { if (x % i == 0) { isPrime = 0; break; } else { isPrime = 1; } } if (isPrime == 1) { printf("%d ", x); } } return 0; }
 

列举组成一元钱的可能

#include <stdio.h>int main() { int x; int one, two, five; scanf("%d", &x);//输入要换算几元钱 for (one = 1; one < x * 10; one++) { for (two = 1; two < x * 10 / 2; two++) { for (five = 1; five < x * 10 / 5; five++) { if (one + two * 2 + five * 5 == x * 10) { printf("%d个壹角+%d个贰角+%d个五角=%d元\n", one, two, five, x); } } } } return 0; }
 
在for循环需要满足条件才能结束这个循环,不然就会一直执行直至满足,我们就可以利用它的这一特点依次枚举,one = 1two = 1five = 1表示壹角,贰角,五角都从1个开始枚举,它还有一个作用,例如五角的枚举结束后并没有找到答案那就返回到贰角去枚举,贰角从一个变为两个 ,然后再进入到五角的循环里继续枚举,这时候五角就要重新从1个五角开始枚举那么循环中five = 1;就会让变量five重新变回1
one < x * 10two < x * 10 / 2five < x * 10 / 5表示某面值的数量不能超过要换算的总价钱,如果不满足就结束这个循环,继续嵌套外面的循环
假如我们输入1元,以下是程序枚举的过程
壹角 贰角 五角 是否满足 是否输出 1 1 1 否 否 1 1 2 否 否 1 2 1 是 是 1 2 2 否 否 1 3 1 否 否 1 3 2 否 否 1 4 1 否 否 1 4 2 否 否 1 5 否 否 2 1 1 否 否 2 1 2 否 否 2 2 1 否 否 2 2 2 否 否 2 3 1 否 否 2 3 2 否 否 2 4 1 否 否 2 4 2 否 否 2 5 否 否 3 1 1 是 是
如果只需要输出一种结果你可以通过break实现
#include <stdio.h>int main() { int x; int one, two, five; int exit = 0; scanf("%d", &x); for (one = 1; one < x * 10; one++) { for (two = 1; two < x * 10 / 2; two++) { for (five = 1; five < x * 10 / 5; five++) { if (one + two * 2 + five * 5 == x * 10) { printf("%d个壹角+%d个贰角+%d个五角=%d元\n", one, two, five, x); exit = 1; break; } } if (exit == 1) break; } if (exit == 1) break; } return 0; }
 
由于 break;只能跳出它所在的循环,在这种嵌套循环中只能跳到它的上一级循环,这时候我们可以定义一个变量exit,当输出结果后就把exit设为1然后用break,跳出这个循环,当跳到上级循环时,通过判断if (exit == 1)break; 再继续跳,就这样跳出所有循环,我们可以把它叫做接力break
或者使用goto
#include <stdio.h>int main() { int x; int one, two, five; scanf("%d", &x); for (one = 1; one < x * 10; one++) { for (two = 1; two < x * 10 / 2; two++) { for (five = 1; five < x * 10 / 5; five++) { if (one + two * 2 + five * 5 == x * 10) { printf("%d个壹角+%d个贰角+%d个五角=%d元\n", one, two, five, x); goto out; } } } } out: return 0; }

求前n项和

例如表达式
notion image
我们可以通过C语言来计算它
#include <stdio.h>int main() { int n; int i; double sum = 0.0; scanf("%d", &n); for (i = 1; i <= n; i++) { sum += 1.0 / i; } printf("f(%d)=%f\n",n, sum); return 0; }
 
那如果计算的是这个式子该怎么办
notion image
你可以加人一个变量sign = 1;,并让它等于自己的相反数sign = -sign;
#include <stdio.h>int main() { int n; int i; double sum = 0.0; int sign = 1; scanf("%d", &n); for (i = 1; i <= n; i++) { sum += sign*1.0 / i; sign = -sign; } printf("f(%d)=%f\n",n, sum); return 0; }

求最大公约数

枚举法:

#include <stdio.h>int main() { int a, b; int min; scanf("%d %d", &a, &b); if (a < b) { min = a; } else { min = b; } int ret = 0; int i; for (i = 1; i < min; i++) { if (a % i == 0) { if (b % i == 0) { ret = i; } } } printf("%d和%d的最大公约数是%d\n", a, b, ret); return 0; }

算出平均数并输出大于平均数的数

#include <stdio.h>int main() { int x; double sum = 0; int cnt = 0; int number[100];//定义数组 scanf: scanf("%d", &x);//输入数组 while (x != -1) { number[cnt] = x;//对数组中的元素赋值 sum += x; cnt++; goto scanf; } if (cnt > 0) { printf("%f\n", sum / cnt); int i; //遍历数组,并输出大于平均数的值 for (i = 0; i < cnt; i++) { if (number[i] > sum / cnt) { printf("%d\n", number[i]); } } } return 0; }
 
先输入数组
1 2 3 4 5 6 7 8 9 10
 
再输入-1,继续后面平均数的计算和判断并输出
5.500000 6 7 8 9 10

统计每一种整数输入的次数

#include <stdio.h>int main() { const int number = 100;//数组的容量, //const表示在程序运行中不允许改变 int x; int count[number]; int i; for (i = 0; i < number; i++) { count[i] = 0;//给数组的所有元素赋值 } scanf("%d", &x);//输入整数 while (x != -1) { if (x >= 0 && x <= number-1) { count[x]++; } scanf("%d", &x);//这里会跳到块外的scanf,用来输入整数 } for (i = 0; i < number; i++) { //遍历数组并一次输出 printf("%d:%d\n", i, count[i]); } return 0; }
 
上面的是教材原版的示例,在整数输入上不太明确,于是我做了一些修改
#include <stdio.h>int main() { const int number = 10; int x; int count[number]; int i; for (i = 0; i < number; i++) { count[i] = 0; } scanf: scanf("%d", &x); while (x != -1) { if (x >= 0 && x <= number-1) { count[x]++; } goto scanf; } for (i = 0; i < number; i++) { printf("%d出现%d次\n", i, count[i]); } return 0; }
 
在这里我把之前的scanf("%d", &x); 换成了goto scanf; 用于跳转到输入整数的时候,和之前的代码等效,但这样更明确

在数组中查找数字是否存在

#include <stdio.h>//key是要寻找的数字 a是要查找的数组 length是数组a的长度 int search(int key, int a[], int length) { int ret = -1; int i; for (i = 0; i < length; i++) { //遍历数组 if (a[i] == key) { ret = i; //如果找到就返回数组中的位置 break; } } //如果找不到返回-1 return ret; } int main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int x; int loc; scanf("%d", &x); loc = search(x, a, sizeof(a) / sizeof(a[0])); if (loc != -1) { printf("%d在第%d个位置上\n", x, loc); } else { printf("%d不存在\n", x); } return 0; }
 

输出数组中的最大值与最小值

#include <stdio.h>void minmax(int a[], int len, int *min, int *max); int main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int min, max; minmax(a, sizeof(a)/sizeof(a[0]), &min, &max); printf("min=%d,max=%d\n", min, max); return 0; } void minmax(int a[], int len, int *min, int *max) { int i; *min = *max = a[0]; for (i = 1; i < len; i++) { if (a[i] < *min) { *min = a[i]; } if (a[i] > *max) { *max = a[i]; } } }

输出一个数的二进制

#include <stdio.h>int main() { int number = 0; scanf("%d", &number); unsigned mask = 1u << 31; //31是输出值的位数 for (; mask; mask >>= 1) { printf("%d", number & mask ? 1 : 0); } return 0; }
 
  • c语言中1u表示unsigned int类型的1

数的阶乘

#include <stdio.h> double factorial(unsigned int i) { if(i <= 1) { return 1; } return i * factorial(i - 1); } int main() { int i = 15; printf("%d 的阶乘为 %f\n", i, factorial(i)); return 0; }

斐波那契数列

#include <stdio.h> int fibonaci(int i) { if(i == 0) { return 0; } if(i == 1) { return 1; } return fibonaci(i-1) + fibonaci(i-2); } int main() { int i; for (i = 0; i < 10; i++) { printf("%d\t\n", fibonaci(i)); } return 0; }
 
 

参考

C占位符

占位符
说明
%d
整数(十进制)
%ld
long
%lld
long long
%f
float(单精度浮点数)输入输出,double(双精度浮点数)输出
%lf
double(双精度浮点数)输入
%u
unsigned(无符号十进制整数)
%lu
unsigned long
%llu
unsigned long long
%o
八进制整数
%x
十六进制整数
%e
%c
%s
%p
%n
读入/写入的个数

算数运算符

运算符
描述
+
把两个操作数相加
-
从第一个操作数中减去第二个操作数
*
把两个操作数相乘
/
分子除以分母
%
取模运算符,整除后的余数
++
自增运算符,整数值增加 1
--
自减运算符,整数值减少 1

关系运算符

运算符
描述
==
检查两个操作数的值是否相等,如果相等则条件为真。
!=
检查两个操作数的值是否相等,如果不相等则条件为真。
>
检查左操作数的值是否大于右操作数的值,如果是则条件为真。
<
检查左操作数的值是否小于右操作数的值,如果是则条件为真。
>=
检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
<=
检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。

逻辑运算符

运算符
描述
&&
称为逻辑与运算符。如果两个操作数都非零,则条件为真。
||
称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。
!
称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。

赋值运算符

运算符
描述
=
简单的赋值运算符,把右边操作数的值赋给左边操作数
+=
加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数
-=
减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数
*=
乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数
/=
除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数
%=
求模且赋值运算符,求两个操作数的模赋值给左边操作数
<<=
左移且赋值运算符
>>=
右移且赋值运算符
&=
按位与且赋值运算符
^=
按位异或且赋值运算符
|=
按位或且赋值运算符

指针运算符

运算符
说明
&
返回变量的地址
*
指向一个变量

位运算符

运算符
含义
运算符
含义
&
按位与
^
按位异或
|
按位或
<<
左移
~
按位取反
>>
右移
p
q
p | q
p & q
p | q
p ^ q
0
0
0
0
0
0
0
1
0
1
0
1
1
1
1
1
1
1
1
0
1
0
0
1

预定义宏

描述
__DATE__
执行该行代码的日期
__TIME__
执行该行代码的时间
__FILE__
当前文件路径
__LINE__
该行代码所在的行号
__STDC__
当编译器以ANSI标准编译时为1

文件操作模式

二进制
文本
描述
rb
r
文件只读,读取的文件必须存在
wb
w
文件只写,如果文件不存在则新键文件,然后写入;如果文件存在则清空重写
rb+
r+
文件可读可写,读取的文件必须存在
wb+
w+
文件可读可写,如果文件不存在则新键文件,然后写入;如果文件存在则清空重写
ab
a
在文件中追加内容,如果文件不存在则新键文件,然后写入
ab+
a+
文件可读可写,如果文件不存在则新键文件,写入时追加内容

ASCII码

Bin(二进制)
Oct(八进制)
Dec(十进制)
Hex(十六进制)
缩写/字符
解释
0000 0000
00
0
0x00
NUL(null)
空字符
0000 0001
01
1
0x01
SOH(start of headline)
标题开始
0000 0010
02
2
0x02
STX (start of text)
正文开始
0000 0011
03
3
0x03
ETX (end of text)
正文结束
0000 0100
04
4
0x04
EOT (end of transmission)
传输结束
0000 0101
05
5
0x05
ENQ (enquiry)
请求
0000 0110
06
6
0x06
ACK (acknowledge)
收到通知
0000 0111
07
7
0x07
BEL (bell)
响铃
0000 1000
010
8
0x08
BS (backspace)
退格
0000 1001
011
9
0x09
HT (horizontal tab)
水平制表符
0000 1010
012
10
0x0A
LF (NL line feed, new line)
换行键
0000 1011
013
11
0x0B
VT (vertical tab)
垂直制表符
0000 1100
014
12
0x0C
FF (NP form feed, new page)
换页键
0000 1101
015
13
0x0D
CR (carriage return)
回车键
0000 1110
016
14
0x0E
SO (shift out)
不用切换
0000 1111
017
15
0x0F
SI (shift in)
启用切换
0001 0000
020
16
0x10
DLE (data link escape)
数据链路转义
0001 0001
021
17
0x11
DC1 (device control 1)
设备控制1
0001 0010
022
18
0x12
DC2 (device control 2)
设备控制2
0001 0011
023
19
0x13
DC3 (device control 3)
设备控制3
0001 0100
024
20
0x14
DC4 (device control 4)
设备控制4
0001 0101
025
21
0x15
NAK (negative acknowledge)
拒绝接收
0001 0110
026
22
0x16
SYN (synchronous idle)
同步空闲
0001 0111
027
23
0x17
ETB (end of trans. block)
结束传输块
0001 1000
030
24
0x18
CAN (cancel)
取消
0001 1001
031
25
0x19
EM (end of medium)
媒介结束
0001 1010
032
26
0x1A
SUB (substitute)
代替
0001 1011
033
27
0x1B
ESC (escape)
换码(溢出)
0001 1100
034
28
0x1C
FS (file separator)
文件分隔符
0001 1101
035
29
0x1D
GS (group separator)
分组符
0001 1110
036
30
0x1E
RS (record separator)
记录分隔符
0001 1111
037
31
0x1F
US (unit separator)
单元分隔符
0010 0000
040
32
0x20
(space)
空格
0010 0001
041
33
0x21
!
叹号
0010 0010
042
34
0x22
"
双引号
0010 0011
043
35
0x23
#
井号
0010 0100
044
36
0x24
$
美元符
0010 0101
045
37
0x25
%
百分号
0010 0110
046
38
0x26
&
和号
0010 0111
047
39
0x27
'
闭单引号
0010 1000
050
40
0x28
(
开括号
0010 1001
051
41
0x29
)
闭括号
0010 1010
052
42
0x2A
*
星号
0010 1011
053
43
0x2B
+
加号
0010 1100
054
44
0x2C
逗号
0010 1101
055
45
0x2D
-
减号/破折号
0010 1110
056
46
0x2E
.
句号
0010 1111
057
47
0x2F
/
斜杠
0011 0000
060
48
0x30
0
字符0
0011 0001
061
49
0x31
1
字符1
0011 0010
062
50
0x32
2
字符2
0011 0011
063
51
0x33
3
字符3
0011 0100
064
52
0x34
4
字符4
0011 0101
065
53
0x35
5
字符5
0011 0110
066
54
0x36
6
字符6
0011 0111
067
55
0x37
7
字符7
0011 1000
070
56
0x38
8
字符8
0011 1001
071
57
0x39
9
字符9
0011 1010
072
58
0x3A
:
冒号
0011 1011
073
59
0x3B
;
分号
0011 1100
074
60
0x3C
<
小于
0011 1101
075
61
0x3D
=
等号
0011 1110
076
62
0x3E
>
大于
0011 1111
077
63
0x3F
?
问号
0100 0000
0100
64
0x40
@
电子邮件符号
0100 0001
0101
65
0x41
A
大写字母A
0100 0010
0102
66
0x42
B
大写字母B
0100 0011
0103
67
0x43
C
大写字母C
0100 0100
0104
68
0x44
D
大写字母D
0100 0101
0105
69
0x45
E
大写字母E
0100 0110
0106
70
0x46
F
大写字母F
0100 0111
0107
71
0x47
G
大写字母G
0100 1000
0110
72
0x48
H
大写字母H
0100 1001
0111
73
0x49
I
大写字母I
01001010
0112
74
0x4A
J
大写字母J
0100 1011
0113
75
0x4B
K
大写字母K
0100 1100
0114
76
0x4C
L
大写字母L
0100 1101
0115
77
0x4D
M
大写字母M
0100 1110
0116
78
0x4E
N
大写字母N
0100 1111
0117
79
0x4F
O
大写字母O
0101 0000
0120
80
0x50
P
大写字母P
0101 0001
0121
81
0x51
Q
大写字母Q
0101 0010
0122
82
0x52
R
大写字母R
0101 0011
0123
83
0x53
S
大写字母S
0101 0100
0124
84
0x54
T
大写字母T
0101 0101
0125
85
0x55
U
大写字母U
0101 0110
0126
86
0x56
V
大写字母V
0101 0111
0127
87
0x57
W
大写字母W
0101 1000
0130
88
0x58
X
大写字母X
0101 1001
0131
89
0x59
Y
大写字母Y
0101 1010
0132
90
0x5A
Z
大写字母Z
0101 1011
0133
91
0x5B
[
开方括号
0101 1100
0134
92
0x5C
\
反斜杠
0101 1101
0135
93
0x5D
]
闭方括号
0101 1110
0136
94
0x5E
^
脱字符
0101 1111
0137
95
0x5F
_
下划线
0110 0000
0140
96
0x60
`
开单引号
0110 0001
0141
97
0x61
a
小写字母a
0110 0010
0142
98
0x62
b
小写字母b
0110 0011
0143
99
0x63
c
小写字母c
0110 0100
0144
100
0x64
d
小写字母d
0110 0101
0145
101
0x65
e
小写字母e
0110 0110
0146
102
0x66
f
小写字母f
0110 0111
0147
103
0x67
g
小写字母g
0110 1000
0150
104
0x68
h
小写字母h
0110 1001
0151
105
0x69
i
小写字母i
0110 1010
0152
106
0x6A
j
小写字母j
0110 1011
0153
107
0x6B
k
小写字母k
0110 1100
0154
108
0x6C
l
小写字母l
0110 1101
0155
109
0x6D
m
小写字母m
0110 1110
0156
110
0x6E
n
小写字母n
0110 1111
0157
111
0x6F
o
小写字母o
0111 0000
0160
112
0x70
p
小写字母p
0111 0001
0161
113
0x71
q
小写字母q
0111 0010
0162
114
0x72
r
小写字母r
0111 0011
0163
115
0x73
s
小写字母s
0111 0100
0164
116
0x74
t
小写字母t
0111 0101
0165
117
0x75
u
小写字母u
0111 0110
0166
118
0x76
v
小写字母v
0111 0111
0167
119
0x77
w
小写字母w
0111 1000
0170
120
0x78
x
小写字母x
0111 1001
0171
121
0x79
y
小写字母y
0111 1010
0172
122
0x7A
z
小写字母z
0111 1011
0173
123
0x7B
{
开花括号
0111 1100
0174
124
0x7C
0111 1101
0175
125
0x7D
}
闭花括号
0111 1110
0176
126
0x7E
~
波浪号
0111 1111
0177
127
0x7F
DEL (delete)
删除

评论