20170417-1
c
同类型的变量可以在一条变量声明语句中声明,可以在声明变量的时候立刻赋值,这叫做初始化
所有变量都应该进行初始化,初始化的实现方式和赋值语句的实现方式很可能是不同的,所以后面可以看到有些变量初始化和赋值的写法不同
可以采用一个存储位置存储多个相关数据
练习:打印
1 X 9 = 9
2 X 8 = 16
3 X 7 = 21
4 X 6 = 24
5 X 5 = 25
1 #include <stdio.h>
2
3 int main() {
4 int i = 1, j = 9;
5 while((i-1)!=(j+1)) {
6 printf("%d X %d = %d\n", i, j, i*j);
7 i++;
8 j--;
9 }
10 return 0;
11 }
练习: 打印
(1)54321
5432
543
54
5
1 #include <stdio.h>
2
3 int main() {
4 int a[] = {1, 2, 3, 4, 5};
5 printf("%d%d%d%d%d\n",a[4], a[3], a[2], a[1], a[0]);
6 printf("%d%d%d%d\n",a[4], a[3], a[2], a[1]);
7 printf("%d%d%d\n",a[4], a[3], a[2]);
8 printf("%d%d\n",a[4], a[3]);
9 printf("%d\n",a[4]);
10 return 0;
11 }或者
1 #include <stdio.h>
2 int main() {
3 int num = 54321;
4 printf("%d\n", num);
5 num = num / 10;
6 printf("%d\n", num);
7 num = num / 10;
8 printf("%d\n", num);
9 num = num / 10;
10 printf("%d\n", num);
11 num = num /10;
12 printf("%d\n", num);
13 return 0;
14 }
(2)54321
4321
321
21
1
如(1)或者
1 #include <stdio.h>
2 int main() {
3 int num = 54321;
4 printf("%d\n", num);
5 num = num % 10000;
6 printf("%d\n", num);
7 num = num % 1000;
8 printf("%d\n", num);
9 num = num % 100;
10 printf("%d\n", num);
11 num = num % 10;
12 printf("%d\n", num);
13 return 0;
14 }
(3)12345
12435
14235
1 /*
2 12345
3 12435
4 14235
5 */
6 #include <stdio.h>
7 int main() {
8 int num = 123, num1 = 4, num2 = 5;
9 printf("%d%d%d\n", num, num1, num2);
10 num2 = (num % 10)*10 + num2;
11 num = num / 10;
12 printf("%d%d%d\n", num, num1, num2);
13 num2 = (num % 10)*100 + num2;
14 num = num / 10;
15 printf("%d%d%d\n", num, num1, num2);
16 return 0;
17 }
一次错误的输入可能导致后面所有读取工作失败,使用如下两条语句可以把输入缓冲区中下一个\n 之前的所有内容(包括这个\n)都丢弃。
scanf("%*[^\n]");
scanf("%*c");
ASCII码表中所有英文字母连续排列
\n 换行字符
\r 回车字符
1 #include <stdio.h>
2 int main() {
3 printf("abcde\n");
4 printf("abc\rde\n");
5 return 0;
6 } 输出:abcde
dec
先打印abc ,然后-r重新回到开头打印,de覆盖了ab,所以输出dec。
\t 制表符
\\ 代表\
数据类型和占位符之间的对应关系
char %c和%hhd
%c用于打印字符身份,%hhd用于打印数字身份
unsigned char %c和%hhu
short %hd
unsigned short %hu
long %ld
unsigned long %lu
int %d
unsigned int %u
float %f和%g
double %lf和%lg
%f和%lf会保留小数点后面无效的0,%g和%lg不会保留
%nd可以打印整数,n是一个数字,表示打印结果一共占多少个位置
%-nd可以让打印结果左对齐
%0nd可以用0填充空位置
%n.mf可以打印单精度浮点数,打印结果一共占n个位置,其中小数点后面占m个位置
sizeof关键字可以用来计算一个数据类型或变量存储位置所包含的字节个数
char(unsigned char) 1个字节
short(unsigned shrot) 2个字节
int(unsigned int) 4个字节
long(unsigned long) 4个字节
float 4
double 8
在c语言中,所有以八进制方式编写的数字必须以0做开头。 %o是一个和八进制表示形式对应的占位符
十六进制缺省认为是无符号整数类型的。 %x和%X都可以作为十六进制的占位符使用
一个字节的内容刚好可以用两个十六进制数位表示,所以经常在程序中使用十六进制表示字节的内容
练习:编程把一个用户给定的0到255之间的数字转换成二进制并把结果打印在窗口中。
1 #include <stdio.h>
2 int main() {
3 void conversion(int i);
4 int i;
5 printf("请输入要转换的数字: ");
6 scanf("%d", &i);
7 conversion(i);
8 return 0;
9 }
10 void conversion(int i) {
11 int a[100] = {0};
12 int j = 0;
13 while(i/2!=0) {
14 a[j] = i % 2;
15 i = i / 2;
16 j++;
17 }
18 a[j] = i % 2;
19 for(j;j>=0;j--) {
20 printf("%d", a[j]);
21 }
22 }
可以用-r覆盖到前面
ctrl + alt + t打开终端
练习1:在屏幕上打印如下内容
*
***
*****
*******
*********
1 #include <stdio.h>
2 int main() {
3 for(int num = 0; num <= 4; num++) {
4 for(int num1 = 0; num1 <= 4+num; num1++) {
5 if(num1 >= 4-num) {
6 printf("*");
7 }
8 else {
9 printf(" ");
10 }
11 }
12 printf("\n");
13 }
14 return 0;
15 }
练习2:现在有一组自行车,三轮车和汽车(每辆汽车有四个轮子和一个座位)
这些车一共有10个座位和28个轮子,编程把所有可能性计算出来并打印在屏幕上。
1 #include <stdio.h>
2 int main() {
3 int bicycle, tricycle, automobile;
4 for(bicycle = 0; bicycle <= 10; bicycle++) {
5 for(tricycle = 0; tricycle <= 10; tricycle++) {
6 for(automobile = 0; automobile <= 10; automobile++) {
7 if((bicycle+tricycle+automobile)==10&&(2*bicycle+3*tricycle+ 4*automobile)==28) {
8 printf("%d, %d, %d\n", bicycle, tricycle, automobile);
9 }
10 }
11 }
12 }
13 return 0;
14 }
2, 8, 0
3, 6, 1
4, 4, 2
5, 2, 3
6, 0, 4
1 #include <stdio.h>
2 int main() {
3 int num = 0,num1 = 0;
4 /*
5 外层for循环猜测汽车的辆数,内层for循环猜测
6 三轮车的辆数
7 */
8 for(num = 0; num <= 7; num++) {
9 for(num1 = 0; num1 <= (28-4*num)/3; num1++) {
10 if(num * 4 + 3 * num1 + 2 * (10 - num - num1) == 28) {
11 printf("%d, %d, %d\n", 10 - num - num1, num1, num);
12 }
13 }
14 }
15 return 0;
16 }
练习3:编写一个猜数游戏
使用一个没有初始化的整数类型变量,得到一个0到99之间的数字
程序中让用户不停的猜,直到猜对为止,每次猜完都要有提示
1 #include <stdio.h>
2 int main() {
3 int x, a = 0;
4 x = rand()%100;
5 printf("请输入您的答案: ");
6 while(scanf("%d", &a)) {
7 if(a!=x) {
8 printf("您输入的答案错误,重新输入!!!");
9 }
10 else {
11 printf("恭喜您答对了!!!");
12 break;
13 }
14 }
15 return 0;
16
17 }
1 #include <stdio.h>
2 int main() {
3 int num, guess = 0;
4 num = num < 0 ? 0 - num : num;
5 num %= 100;
6 do {
7 printf("请猜一个数字:");
8 scanf("%d", &guess);
9 if(guess > num) {
10 printf("对不起,您猜的有点大了!!!\n");
11 }
12 else if(guess < num) {
13 printf("又猜小了");
14 }
15 else {
16 printf("恭喜猜对了!!!");
17 }
18 } while(num != guess);
19 return 0;
20 }
练习4:编程统计一个用户给定数字的数位(例如123有3位数)
1 #include <stdio.h>
2 int main() {
3 int x, t = 0;
4 scanf("%d", &x);
5 while(x) {
6 x = x / 10;
7 t++;
8 if(x==0) {
9 break;
10 }
11 }
12 printf("%d\n", t);
13 return 0;
14 }
数组:使用循环操作数组可以最大限度发挥数组的优势
练习:从键盘上得到一个数字(比如345421),把其中每个数位的数字拆开,
并按顺序打印在屏幕上(打印的时候相邻数字使用空格分开,这个数字的数位不超过5个)
3 4 5 3 2 1
1 #include <stdio.h>
2 int main() {
3 int x = 0, t = 10000, i = 0;
4 int temp[5] = {0};
5 scanf("%d", &x);
6 for(t = 10000; t >= 1; t/=10) {
7 temp[i] = x / t;
8 x = x % t;
9 printf("%d ", temp[i]);
10 i++;
11 }
12 return 0;
13 }
1 #include <stdio.h>
2 int main() {
3 int arr[5], num = 0;
4 printf("请输入一个数字:");
5 scanf("%d", &num);
6 for(int i = 0; i <= 4; i++) {
7 arr[i] = -1;
8 }
9
10 for(int i = 4; i >= 0; i--) {
11 arr[i] = num % 10;
12 num = num / 10;
13 if(!num) {
14 break;
15 }
16 }
17
18 for(num = 0; num <= 4; num++) {
19 if(arr[num] >= 0) {
20 printf("%d ", arr[num]);
21 }
22 }
23 printf("\n");
24 return 0;
25 }
练习:*******
编程从键盘得到7个或0或1的数字,根据这些数字计算出奇偶校验位的数值,
最后把这八个数字都打印在屏幕上。
1 #include <stdio.h>
2 int main() {
3 int a[8] = {0}, sum = 0;
4 for(int i = 0; i <= 6; i++) {
5 scanf("%d", &a[i]);
6 }
7 for(int i = 0; i <= 6; i++) {
8 sum = sum + a[i];
9 }
10 if(sum % 2 == 0) {
11 a[7] = 0;
12 }
13 else {
14 a[7] = 1;
15 }
16
17 for(int i = 0; i <= 7; i++) {
18 printf("%d ", a[i]);
19 }
20 return 0;
21 }
1 #include <stdio.h>
2 int main() {
3 int arr[8] = {}, num = 0;
4 for(num = 0; num <= 6; num++) {
5 printf("请输入一个数字:");
6 scanf("%d", &arr[num]);
7 }
8 for(num = 0; num <= 6; num++) {
9 if(arr[num]) {
10 arr[7] = 1 - arr[7];
11 }
12 }
13 for(num = 0; num <= 7; num++) {
14 printf("%d ", arr[num]);
15 }
16 printf("\n");
17 return 0;
18 }
数组名称不可以被赋值
数组中下标为n的存储位置的地址可以用数组名称加n的方式表示。
&arr[1]与arr+1是一样的
对数组名称进行sizeof计算得到整个数组的大小
数组一旦存在,其中的存储位置个数就不可改变了
随机数:
rand标准函数用来获得随机数
把这个函数的调用语句当数字使用就是得到的随机数
为了使用这个函数,需要包含stdlib.h文件
srand标准函数用来设置随机数种子
这个函数把一个整数作为种子使用
为了使用这个函数也需要包含stdlib.h文件
time标准函数可以用来获得当前的时间,
得到的时间是一个整数。
为了使用这个标准函数,需要包含time.h文件。
任何程序中只使用一次srand标准函数就行了
练习:编写程序检查一个身份证号码是否真实
把身份证前17个数字依次和下面17个数字做乘法(7,9,10,5,8,8,4,2,1,6,3,7,9,10,5,8,4,2),
然后把所有乘法结果求和。最后使用求和结果除以11得到余数,根据余数从
下面11个数字中找到身份证号码中的最后一个数(1,0,X,9,8,7,6,5,4,3,2)。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 int main() {
5 int sum = 0, i = 0, a[18] = {0};
6 for(i = 0; i <= 16; i++) {
7 scanf("%d", &a[i]);
8 }
9 sum = a[0] * 7 + a[1] * 9 + a[2] * 10 + a[3] * 5 + a[4] * 8 + a[5] * 4 + a[6] * 2 + a[7] * 1 + a[8] * 6 + a[9] * 3 + a[10] * 7 + a[11] * 9 + a[12] * 10 + a[13] * 5 + a[14] * 8 + a[15] * 4 + a[16] * 2;
10 switch(sum % 11) {
11 case 0: a[17] = 1; break;
12 case 1: a[17] = 0; break;
13 case 2: a[17] = 'X'; break;
14 case 3: a[17] = 9; break;
15 case 4: a[17] = 8; break;
16 case 5: a[17] = 7; break;
17 case 6: a[17] = 6; break;
18 case 7: a[17] = 5; break;
19 case 8: a[17] = 4; break;
20 case 9: a[17] = 3; break;
21 case 10: a[17] = 2; break;
22 }
23 for(i = 0; i <= 16; i++) {
24 printf("%d ", a[i]);
25 }
26 if(a[17] == 'X') {
27 printf("X");
28 }
29 else {
30 printf("%d ", a[17]);
31 }
32 printf("\n");
33 return 0;
34 }
练习2:编程在一个10行10列的棋盘上随机布置10个地雷,布雷完成后把整个棋盘打印在屏幕上。
不是雷的地方空格,是雷的地方打X。程序每次运行雷的位置不一样。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 int main() {
5 char map[10][10] = {0};
6 int row = 0, col = 0, num = 0;//num记录有多少雷
7 srand(time(0));
8 for(row = 0; row <= 9; row++) {
9 for(col = 0; col <= 9; col++) {
10 map[row][col] = '*';
11 }
12 }
13 while(num < 10) {
14 row = rand() % 10;
15 col = rand() % 10;
16 if(map[row][col] != 'X') {
17 map[row][col] = 'X';
18 num++;
19 }
20 }
21
22 for(row = 0; row <= 9; row ++) {
23 for(col = 0; col <= 9; col++) {
24 printf("%c", map[row][col]);
25 }
26 printf("\n");
27 }
28 printf("\n");
29 return 0;
30 }
练习:下棋:
第一步:把棋盘清空,
第二部:显示棋盘,
第三部:使用循环进行游戏(每次放置一个新棋子)
获得新棋子的行号(行号可能无效),
获得新棋子的列号(列号可能无效)
检查位置是否可用
放置新棋子
显示棋盘,判断输赢
1 /*
2 圈叉棋游戏
3 */
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <time.h>
7 int main() {
8 char map[3][3] = {}, player = 'O';
9 int row = 0, col = 0, num = 0;
10 for(row = 0; row <= 2; row++) {
11 for(col = 0; col <= 2; col++) {
12 map[row][col] = '.';
13 }
14 }
15
16 for(row = 0; row <= 2; row++) {
17 for(col = 0; col <= 2; col++) {
18 printf("%c", map[row][col]);
19 }
20 printf("\n");
21 }
22
23 while(num < 9) {
24 printf("请输入行号:");
25 scanf("%d", &row);
26 if(row < 1 || row > 3) {
27 continue;
28 }
29 printf("请输入列号:");
30 scanf("%d", &col);
31 if(col < 1 || col > 3) {
32 continue;
33 }
34 if(map[row - 1][col - 1] != '.') {
35 continue;
36 }
37 map[row - 1][col - 1] = player;
38 player = 'X' - player + 'O';
39 //player ^= 'X' ^ 'O';
40
41 for(row = 0; row <= 2; row++) {
42 for(col = 0; col <= 2; col++) {
43 printf("%c", map[row][col]);
44 }
45 printf("\n");
46 }
47 if(map[0][0] == map[0][1] && map[0][1] == map[0][2] && m ap[0][0] != '.') {
48 printf("%c赢了\n", map[0][0]);
49 break;
50 }
51
52 if(map[1][0] == map[1][1] && map[1][1] == map[1][2] && m ap[1][0] != '.') {
53 printf("%c赢了\n", map[1][0]);
54 break;
55 }
56 if(map[2][0] == map[2][1] && map[2][1] == map[2][2] && m ap[2][0] != '.') {
57 printf("%c赢了\n", map[2][0]);
58 break;
59 }
60
61 if(map[0][0] == map[1][0] && map[1][0] == map[2][0] && m ap[0][0] != '.') {
62 printf("%c赢了\n", map[0][0]);
63 break;
64 }
65 if(map[0][2] == map[1][2] && map[1][2] == map[2][2] && m ap[2][2] != '.') {
66 printf("%c赢了\n", map[2][2]);
67 break;
68 }
69
70 if(map[0][1] == map[1][1] && map[1][1] == map[2][1] && m ap[0][1] != '.') {
71 printf("%c赢了\n", map[0][1]);
72 break;
73 }
74 if(map[0][0] == map[1][1] && map[1][1] == map[2][2] && m ap[0][0] != '.') {
75 printf("%c赢了\n", map[0][0]);
76 break;
77 }
78 if(map[2][0] == map[1][1] && map[1][1] == map[0][2] && m ap[0][2] != '.') {
79 printf("%c赢了\n", map[0][2]);
80 break;
81 }
82 num++;
83 }
84 if(num == 9) {
85 printf("和棋\n");
86 }
87 return 0;
88 }