无法预知的数字叫随机数,rand标准函数可以用来获得随机数,为了使用这个标准函数需要包含stdlib.h头文件
srand标准函数用来设置随机数种子,这个函数把一个整数作为种子使用不同的种子可以得到不同的随机数,为了使用这个标准函数也需要包含stdlib.h头文件
time标准函数可以用来获得现在的时间,这个函数用一个整数表示得到的时间在一秒钟之内这个代表时间的整数不会改变,为了使用这个函数需要包含time.h头文件
任何程序里srand标准函数应该只使用一次
/* * 猜数游戏练习 * */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int guess = 0, num = 0; srand(time(0)); guess = rand() % 100; for (;;) { printf("请猜一个数字:"); scanf("%d", &num); if (num > guess) { printf("猜大了 "); } else if (num < guess) { printf("猜小了 "); } else { printf("猜对了 "); break; } } return 0; }
分支和循环都是流程控制语句,它们都可以让程序中的语句不再从上到下顺序执行
goto语句也是流程控制语句,它可以把任何一条语句指定成下一条语句,一般不要使用goto语句
如果一个问题的解决步骤是以多组数字的变化过程为基础的就可以采用多重循环的结构解决(循环里包含另外的循环),外部的循环对应变化慢的数字,内部的循环对应变化快的数字
/* * 多重循环演示 * */ #include <stdio.h> int main() { int num = 0, num1 = 0; for (num = 1;num <= 5;num++) { for (num1 = 5;num1 >= num;num1--) { printf("%d", num1); } printf(" "); } return 0; }
while关键字也可以用来编写循环,不容易使用for关键字实现的循环就可以考虑采用while关键字编写,while循环格式如下
while (逻辑表达式) {
反复执行的语句
}
这个格式表示反复执行大括号里面的语句,直到逻辑表达式为假
while循环会交替执行逻辑表达式的判断和大括号里面的语句,while循环首先进行逻辑表达式的计算,如果逻辑表达式结果为假就立刻结束循环,while循环有可能不执行大括号里面的语句
/* * while循环演示 * */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int guess = 0, num = 0; srand(time(0)); guess = rand() % 100; while (num != guess) { printf("请猜一个数字:"); scanf("%d", &num); if (num > guess) { printf("猜大了 "); } else if (num < guess) { printf("猜小了 "); } else { printf("猜对了 "); } } return 0; }
while循环的逻辑表达式如果永远为真就成为了死循环
while循环里也可以使用break;和continue;语句
do...while也可以用来实现循环
do...while循环的格式如下
do {
反复执行的语句
} while (逻辑表达式);
do...while的小括号后面必须用分号结束,do...while循环也是交替执行逻辑表达式的计算和大括号里面的语句,do...while循环首先执行大括号里面的语句,do...while循环至少会执行一次大括号里面的语句
/* * while循环演示 * */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int guess = 0, num = 0; srand(time(0)); do { printf("请猜一个数字:"); scanf("%d", &num); if (num > guess) { printf("猜大了 "); } else if (num < guess) { printf("猜小了 "); } else { printf("猜对了 "); } } while (num != guess); return 0; }
scanf函数不是直接从键盘得到数字而是从输入,缓冲区里获得数字然后记录到存储区里,用户在键盘上输入的数字需要首先进入输入缓冲区,然后程序才可能获得这个数字,程序必须首先把先进入输入缓冲区的数字拿走然后才可能获得后进入输入缓冲区的数字,如果用户输入的格式和程序里要求的格式不同就无法获得需要的数字
/* * 输入缓冲区演示 * */ #include <stdio.h> int main() { int num = 0, num1 = 0; printf("请输入一个数字:"); scanf("%d", &num); scanf("%*[^ ]"); scanf("%*c"); printf("num是%d ", num); printf("请输入一个数字:"); scanf("%d", &num1); printf("num1是%d ", num1); return 0; }
可以使用如下两条语句把输入缓冲区里不能处理的内容都丢掉
scanf("%*[^
]");
scanf("%*c");
printf函数把数字放到输出缓冲区里,计算机在合适的时候把输出缓冲区里的内容显示在屏幕上,在以下四种情况下计算机才会把输出缓冲区里的内容显示在屏幕上
1.如果输出缓冲区里包含'
'换行字符就把这个字符前面的所有字符显示在屏幕上
2.程序结束后它放在输出缓冲区里的内容会显示在屏幕上
3.当输出缓冲区被充满的时候它里面的所有内容会显示在屏幕上
4.在程序里使用fflush(stdout)语句强制把输出缓冲区里的内容显示在屏幕上
/* * 输出缓冲区演示 * */ #include <stdio.h> int main() { int num = 0; printf("1"); scanf("%d", &num); while (1) { } return 0; }
数组可以用来表示内存里一组连续的同类型存储区,这些存储区叫做数组的元素.数组也需要先声明然后才能使用声明数组的时候除了要提供类型名称,数组名称以外还需要提供一个整数用来表示数组里的存储区个数,数组里包含的存储区个数不可以改变,通常不会把数组作为整体使用,一般一次只使用其中的某个存储区,数组里每个存储区有一个唯一的编号,这个编号叫做数组的下标,第一个存储区的下标是0,向后依次递增,有效下标范围从0开始到存储区个数减一为止,超过这个范围的整数不能作为下标使用数组名称和下标一起就可以用来表示数组里的存储区
可以使用for循环依次处理数组里的每个存储区循环变量依次代表所有有效下标
/* * 数组练习 * */ #include <stdio.h> int main() { int arr[5] = {0}, num = 0, sum = 0; for (num = 0;num <= 4;num++) { printf("请输入一个数字:"); scanf("%d", &arr[num]); } for (num = 4;num >= 0;num--) { printf("%d ", arr[num]); } printf(" "); for (num = 0;num <= 4;num++) { sum += arr[num]; } printf("求和结果是%d ", sum); return 0; }
数组应该进行初始化放在一对大括号中间,相邻数字之间用逗号分开,如果初始化数据个数多于数组里存储区个数就忽略多余的初始化数据,如果初始化数据个数少于数组里的存储区个数就把后面的存储区初始化成0,如果初始化数据个数和存储区个数一样多就可以省略数组声明里的存储区个数