无法预知的数字叫做随机数
rand标准函数可以用来获得伪随机数
为了使用这个标准函数需要包含stdlib.h头文件
srand标准函数用来设置随机数种子
这个函数需要一个整数作为种子使用
不同的种子产生的随机数不同
任何程序只要设置一次随机数种子
为了使用srand标准函数,需要包含stdlib,h头文件
time标准函数用来获得当前时间,这个函数用一个整数表示获得的时间,一秒之内用这个函数获得的代表时间的整数不会变化
使用这个函数需要包含time.h头文件
1#include<stdio.h>
2#include<stdlib.h>
3#include<time.h>
4int main(){
5 srand(time(0));
6 printf("%d\n",rand());
7 printf("%d\n",rand());
8 printf("%d\n",rand());
9 return 0;
10 }
练习:随机产生0-99的随机数;猜大小
1#include<stdio.h>
2#include<stdlib.h>
3#include<time.h>
4int main(){
5 int guess,random,i;
6 srand(time(0));
7 random=rand()%100;
8 for(;;){
9 printf("请猜数:");
10 scanf("%d",&guess);
11 if(guess>random){
12 printf("猜大了\n");
13 continue;
14 }
15 else if(guess<random){
16 printf("猜小了\n");
17 continue;
18 }
19 else {
20 printf("猜对了");
21 break;
22 }
23 }
24 printf("\n");
25 return 0;
26 }
分支和循环都可以让程序中的语句不再从上到下执行,具有这种特征的语句叫做流程控制语句
goto语句也是这种语句,它可以把任何一条语句指定成下一条语句
循环里面还可以包含其它循环,这种结构叫多重循环
如果一个问题可以分解成几个小问题,每个小问题可以采用类似的循环解决,这种问题就可以采用多重循环编写。
(分成几个小问题,为每一个问题找到一个代表数字,用外循环处理每个小数字)
54321
5432
543
54
5 问题分解为 1 2 3 4 5
1#include<stdio.h>
2int main(){
3 int i,j;
4 for(i=1;i<=5;i++){
5 for(j=5;j>=i;j--){
6 printf("%d",j);
7 }
8 printf("\n");
9 }
10 /* for(i=54321;i>=5;i/=10)
11 printf("%d\n",i); */
12 return 0;
13 }
假设有一种货币包含三种面值,分别是1元,2元,和5元
找到组合成10元的所有可能性,显示出来
1#include<stdio.h>
2int main(){
3 int one,two,five,n;
4/* for(five=0;five<=2;five++){
5 for(two=0;two<=(10-five*5)/2;two++){
6 printf("五元有%d个,两元有%d个,一元有%d个,\n",five,two,10-5*five-2*two) ;
7 }
8 }*/
9 for(five=0;five<=2;five++){
10 for(two=0;two<=5;two++){
11 if(5*five+2*two<=10){
12
13 printf("五元有%d个,两元有%d个,一元有%d个,\n",five,two,10-5*five-2*two) ;
14 }
15 }
16 }
17 return 0;
18 }
while 关键字是另外一种循环,通常用来解决不知道次数的循环
while循环格式如下
while (逻辑表达式) {
反复执行的语句
}
程序反复执行大括号里的语句,直到逻辑表达式为假
1#include<stdio.h>
2int main(){
3 int num=1;
4 while(num<=5){
5 printf("%d",num);
6 num++;
7 }
8 printf("\n");
9 return 0;
10 }
while循环可以实现死循环,这个时候要提供一个永远为真的逻辑表达式
while循环里也可以使用break ; 和continue ; 语句
while循环交替执行逻辑表达式和大括号里的语句,第一步计算逻辑表达式的结果,如果不满足逻辑表达式,则不执行大括号里的语句
例:用while循环实现猜数游戏
1#include<stdio.h>
2#include<stdlib.h>
3#include<time.h>
4int main(){
5 int guess=0,random=0;
6 srand(time(0));
7 random=rand()%100;
8 while(guess!=random){
9 printf("请猜数:");
10 scanf("%d",&guess);
11 if(random>guess){
12 printf("猜小了\n");
13 }
14 else if(random<guess){
15 printf("猜大了\n");
16 }
17 else {
18 printf("猜对了\n");
19 }
20 }
21 return 0;
22}
do…..while格式也可以用来编写循环
do{
执行内容;
} while ( 逻辑表达式 ) ;
do…while循环必须在小括号后面用分号;结束
do…while循环也是交替执行逻辑表达式的计算和大括号里面的语句,第一步执行大括号里面的语句。 (先执行,再判断逻辑)
do…while循环能保证大括号里面的语句至少会执行一次
1#include<stdio.h>
2#include<stdlib.h>
3#include<time.h>
4int main(){
5 int guess=0,random=0;
6 srand(time(0));
7 // random=rand()%100;
8 do{printf("请猜数:");
9 scanf("%d",&guess);
10 if(random>guess){
11 printf("猜小了\n");
12 }
13 else if(random<guess){
14 printf("猜大了\n");
15 }
16 else {
17 printf("猜对了\n");
18 }
19 }while(guess!=random);
20 return 0;
21 }
例:编写程序从键盘得到两个非负数,计算它们的最大公约数,并把结果显示在屏幕上
54 66 66%54得12,54不变
12 54 54%12得6,12不变
6 12 12%6=0,即6就是最大公约数
1#include<stdio.h>
2int main(){
3 int num=0,num1=0,tmp=0;
4 printf("请输入两个非负整数(小的放前面):");
5 scanf("%d%d",&num,&num1);
6 while(num1%num){
7 tmp=num1%num;
8 num1=num;
9 num=tmp;
10 }
11 printf("最大公约数是%d",num);
12 return 0;
13 }
scanf 标准函数工作的时候需要使用输入缓冲区
用户在键盘上输入的内容首先进入输入缓冲区,然后才能进入内存中的存储区
先进入输入缓冲区的数字必须首先被处理
如果用户输入数据的格式和计算机要求的格式不一样则后面输入的数字就没机会处理
1#include<stdio.h>
2int main(){
3 int num=0,num1=0;
4 printf("请输入一个数字");
5 scanf("%d",&num);
6 printf("数字是%d\n",num);
7 printf("请输入一个数字");
8 scanf("%d",&num1);
9 printf("数字是%d\n",num1);
10 return 0;
11 }
若输入一个小数,1.1,则第二条语句不处理
以下两条语句可以把输入缓冲区里的第一个 ’ \ n之前的内容和这个 ‘ \ n 字符一起删除
scanf ( %*[ ^ \ n ] ) ;
scanf ( % * c ) ; 这两句是清空缓冲区
例:
1 #include<stdio.h>
2 int main(){
3 int num=0,num1=0;
4 printf("请输入一个数字");
5 scanf("%d",&num);
6 scanf("%*[^\n]");
7 scanf("%*c");
8 printf("数字是%d\n",num);
9 printf("请输入一个数字");
10 scanf("%d",&num1);
11 printf("数字是%d\n",num1);
12 return 0;
13 }
请输入一个数字1.1 (隐形转换成%d)
数字是1
请输入一个数字2
数字是2
printf标准函数工作的时候需要使用输出缓冲区
在下面四种情况下输出缓冲区里的内容才会出现在屏幕上
1. 如果输出缓冲区里包含‘\n’字符,则前面的内容会出现在屏幕上
2. 程序结束后它放在输出缓冲区里的内容会显示在屏幕上
3. 如果输出缓冲区被充满了,则里面的内容也会显示在屏幕上
4. 在程序中使用fflush(stdout)语句可以把输出缓冲区里的内容显示在屏幕上
数组
数组可以代表内存中一组连续相同的同类型存储区
数组需要先声明才能使用
声明数组时需要提供类型名称,数组名称和一个整数代表数组里的个数
数组一旦创建成功,它里面包含的存储区个数就不可以改变
数组通常不作为整体使用,一次只能使用其中的某个存储区
数组里每个存储区有一个编号,这个编号叫做存储区的下标
第一个存储区的下标是0,向后依次递增
有效下标从0开始到存储区个数减一为止,超过范围的下标不能使用
数组名称结合下标就可以表示数组里的存储区
可以编写for循环依次处理数组里的每个存储区,在这个for循环里让循环变量依次代表数组中每个存储区的下标
1 #include<stdio.h>
2 int main(){
3 int arr[5];
4 int num=0;
5 for(num=0;num<=4;num++){
6 arr[num]=num;
7 }
8 for(num=4;num>=0;num--){
9 printf("%d",arr[num]);
10 }
11 printf("\n");
12 return 0;
13 }
数组也应该初始化
数组初始化的时候需要提供多个初始化数据,每个初始化数据用来初始化一个存储区。
所有初始化数据写在一对大括号里面,相邻数据之间用逗号分隔
如果初始化数据比存储区个数多,就把多余的数据丢掉
如果初始化数据比存储区个数少,就把后面多余的存储区初始化成0
如果初始化数据个数和存储区个数一样,就可以省略数据声明里的存储区个数
练习:编写程序从键盘得到多个整数(整数的数量不超过5个),把这些整数按照反序显示在屏幕上,计算这些整数的和并显示
1 #include<stdio.h>
2 int main(){
3 int num=0,n=0,sum=0;
4 int arr[10]={0};
5 printf("请输入数字个数?\n");
6 scanf("%d",&n);
7 for(num=0;num<=n-1;num++){
8 scanf("%d",&arr[num]);
9 }
10 printf("反序是 ");
11 for(num=n-1;num>=0;num--){
12 printf("%d ",arr[num]);
13 }
14 printf("\n");
15 for(num=0;num<n;num++){
16 sum+=arr[num];
17 }
18 printf("the sum is %d\n",sum);
19 }
用可变长数组方法:
1 #include<stdio.h>
2 int main(){
3 int n=0,num=0,sum=0;
4 printf("输入数字的个数: ");
5 scanf("%d",&n);
6 int arr[n];
7 for(num=0;num<=n-1;num++){
8 scanf("%d",&arr[num]);
9 }
10 printf("反序是:");
11 for(num=n-1;num>=0;num--){
12 printf("%d ",arr[num]);
13 }
14 printf("\n");
15 for(num=0;num<n;num++){
16 sum+=arr[num];
17 }
18 printf("总和是:%d\n",sum);
19 return 0;
20 }
判断一个数是不是素数:
1 #include<stdio.h>
2 #include<math.h>
3 int main(){
4 int num=0,i;
5 printf("请输入一个数: ");
6 scanf("%d",&num);
7 for(i=2;i<=sqrt(num);i++){
8 if(num%i==0){
9 printf("该数不是素数\n");
10 break;
11 }
12 else continue;
13 }
14 if (i>sqrt(num)){
15 printf("该数是素数\n");
16 }
17 return 0;
18 }
输入man sqrt 查看 调用sqrt 函数的要求
需要math.h头文件,以及编译指令 gcc sushu.c –lm
练习:输出100—200之间所有的素数:
1 #include<stdio.h>
2 #include<math.h>
3 int main(){
4 int i,j;
5 for(j=100;j<=200;j++){
6 for(i=2;i<=sqrt(j);i++){
7 if(j%i==0){
8 break;
9 }
10 else continue;
11 }
12 if (i>sqrt(j)){
13 printf("%d\n",j);
14 }
15 }
16 return 0;
17 }