switch语句
1、使用switch语句,输入数字显示是星期几
#include<stdio.h>
int main(void)
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入值不在范围内\n");
break;
}
return 0;
}
运行结果:
5
工作日
while循环
1、使用while循环打印10个数字
#include<stdio.h>
int main(void)
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}循环打印10个数字*/
#include<stdio.h>
int main(void)
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
运行结果:
1 2 3 4 5 6 7 8 9 10
2、输入一个正整数,逆序打印这个整数的每一位
分析:
521%10——1
521/10——52
52%10——2
52/10——5
5%10——5
5/10——0
0为假退出循环
#include<stdio.h>
int main(void)
{
int n = 0;
scanf("%d",&n);
while (n)
{
printf("%d", n % 10);
n = n / 10;
}
return 0;
}
运行结果:
123
321
for循环
for循环相比while更优
1、循环打印1-10
#include<stdio.h>
int main(void)
{
int n = 0;
for (n = 1; n <= 10; n++)
{
printf("%d ", n);
}
return 0;
}
运行结果:
1 2 3 4 5 6 7 8 9 10
2、计算1-100之间3的倍数之和
分析:
1.产生1-100的数字 for
2.找出3的倍数 if(%3 == 0)
3.求和 sum+=
#include<stdio.h>
int main(void)
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
{
//每一次循环进入产生i
//判断每个产生的i是否是3的倍数
if (i % 3 == 0)
{
printf("%d ", i);
sum += i;
}
}
printf("\n");
printf("%d\n", sum);
return 0;
}
运行结果:
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
1683
优化:
#include<stdio.h>
int main(void)
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i+=3)
//i+=3可以保证每次输出的都是3的倍数
//省去了if条件判断
{
printf("%d ", i);
sum += i;
}
printf("\n");
printf("%d\n", sum);
return 0;
}
运行结果:
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
1683
do-while循环
循环体至少执行一次
1、打印1-10的值
#include<stdio.h>
int main(void)
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
运行结果:
1 2 3 4 5 6 7 8 9 10
2、输入一个正整数,计算这个整数是几位数
例:
输入:1234 输出:4
输入:12 输出:2
分析:
使用除法去掉位数
1234/10
123/10
12/10
1/10
#include<stdio.h>
int main(void)
{
int num = 0;
scanf("%d", &num);
int cnt = 0;
do
{
cnt++;
num /= 10;
} while (num); //1/10为0即为假跳出循环
//输入0代码也没问题,因为do-while必须循环一次
printf("%d\n", cnt);
return 0;
}
运行结果:
1234
4
continue语句
continue会跳过本次循环后面的代码
1、使用while循环打印1-10
#include<stdio.h>
int main(void)
{
int i = 0;
while (i < 10)
{
i++; //从2开始
if (i == 5)
{
continue; //本次循环后面的代码,即打印函数
}
printf("%d ", i); //不输出5
}
return 0;
}
运行结果:
1 2 3 4 6 7 8 9 10
2、使用for循环打印1-10
#include<stdio.h>
int main(void)
{
int i = 0;
for (i=1; i < 10; i++)
{
if (i == 5)
{
continue; //打印时也会跳过5
}
printf("%d ", i);
}
return 0;
}
运行结果:
1 2 3 4 6 7 8 9 10
for循环中的初始化;判断;循环的三个表达式都可以省略
但是判断部分省略,要注意:如果省略了判断部分则恒为真,就会陷入死循环
for(;;;)
3、以下代码在打印完5之后会陷入死循环,即5之后的数字不会打印
引文continue跳出循环,不会执行后面的i++
#include<stdio.h>
int main(void)
{
int i = 0;
for (i=1; i <= 10; )
{
if (i == 5)
{
continue;
}
i++;
printf("%d ", i);
}
return 0;
}
运行结果:
2 3 4 5
4、找出100-200之间的素数,并打印在屏幕上
注:素数又称为质数,只能被1和本身整除的数字
分析:
1.利用循环产生100-200之间的数。
2.假设要判断i是否为素数,需要用2~i-1之间的数字去试除i,
需要产生2~i-1之间的数字,可以使用循环解决
3.2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数
#include<stdio.h>
int main(void)
{
//产生100-200之间的数
int i = 0;
int count = 0; //用来统计素数个数
for (i = 100; i <= 200; i++)
{
int flag = 1; //假设i是素数
int j = 0;
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0)
{
flag = 0; //表示i不是素数
break;
}
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\n");
printf("count=%d\n", count);
return 0;
}
运行结果:
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
count=21
优化:
n=a*b
16=2*8
16=4*4
a*b中至少有一个数字是小于等于根号n的
#include<math.h> //调用sqrt()开根号函数
#include<stdio.h>
int main(void)
{
//产生100-200之间的数
int i = 0;
int count = 0; //用来统计素数个数
for (i = 101; i <= 200; i += 2) //i+=2产生的数字是奇数
{
int flag = 1; //假设i是素数
int j = 0;
for (j = 2; j <= sqrt(i); j++) //sqrt(i)开根号
{
if (i % j == 0)
{
flag = 0; //表示i不是素数
break;
}
}
if (flag == 1) //是素数的话打印
{
printf("%d ", i);
count++;
}
}
printf("\n");
printf("count=%d\n", count);
return 0;
}
运行结果:
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
count=21
goto语句
C语言提供了一种非常特别的语法,goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。
#include<stdio.h>
int main(void)
{
printf("hehe\n");
goto flag; //下一句语句会被跳过,直接跳转到标号flag:后边的语句
printf("didi\n");
flag:
printf("ss\n");
return 0;
}
运行结果:
hehe
ss
goto语句不仅可以前后跳转,也可以后前跳转(但是可能会进入死循环)
#include<stdio.h>
int main(void)
{
printf("hehe\n");
zhangsan:
printf("didi\n");
goto zhangsan; //进入了死循环,一直往前跳转执行didi输出语句
printf("ss\n");
return 0;
}
goto语句如果使用不当的话,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以尽量不要使用,但是goto语句在多层循环的代码中,如果想快速跳出循环的话,goto语句就非常方便
#include<stdio.h>
int main(void)
{
for()
{
for ()
{
for ()
{
for ()
{
goto error; //可以直接跳出循环
}
}
}
}
error:
return 0;
}
不需要三个break可以直接跳出最内层的循环。
循环尽量不要省略。
#include<stdio.h>
int main(void)
{
int i = 0;
int j = 0;
for (i = 0; i < 5; i++)
{
//0
//01234
//1
//01234
//2
//01234
//3
//01234
//4
//01234
for (j = 0; j < 5; j++)
{
printf("hehe\n"); //打印25个hehe
}
}
return 0;
}
运行结果:
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
#include<stdio.h>
int main(void)
{
int i = 0;
int j = 0;
for (; i < 5; i++)
{
for (; j < 5; j++)
//第一次内循环完j变成5去到第一层循环
//第二次循环开始i++后i变成1,但是再次进入内层的时候j还是5,没有初始化为0
//所以会跳出循环
//剩下的4次循环都是直接跳出循环
//此程序只执行了1一次第二层循环,其余的都直接跳出内循环
{
printf("hehe\n"); //打印25个hehe
}
}
return 0;
}
运行结果:
hehe
hehe
hehe
hehe
hehe
rand()函数
rand函数会返回一个伪随机数,
这个随机数的范围在0 - RAND_MAX之间,
RAND_MAX的大小是以来编译器上实现的,
但大部分的编译器上是32767,
使用rand()函数需要引用头文件stdlib.h,rand()函数生成随机数的默认种子是1
如果要产生不同的随机数,就需要种子是变化的
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
RAND_MAX;
int r = rand();
printf("%d\n",r);
return 0;
}
C语言中又提供一个函数叫srand,用来初始化随机数生成器的,srand的原型如下:
void srand(unsigned int seed);
程序中在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机序列也就会变化。
也就是说srand的种子如果是随机的,rand就能生成随机数;在生成随机数的时候又需要一个随机数,这就矛盾了。
time()函数
在程序中我们一般是使用程序运行的时间作为种子的,因为时间时刻在发生变化的。
在C语言中有一个函数叫time,就可以获得这个时间。
time函数会返回一个time_t时间戳,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,返回的类型是time_t。
time_t time(time_t* timer);
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
srand((unsigned int)time(NULL));
//种子使用的是time函数
//种子需要指定为无符号整型
RAND_MAX;
int r = rand();
printf("%d\n",r);
return 0;
}
猜数字游戏
猜数字游戏*/
#include<stdio.h>
#include<time.h>
void menu() //封装菜单函数
{
printf("**********************\n");
printf("****请选择以下按钮****\n");
printf("******* 1.play *******\n");
printf("******* 0.exit *******\n");
printf("**********************\n");
printf("**********************\n");
}
void game() //猜数字游戏的实现
{
//1、生成随机数(1-100)
int ret = rand()%100+1;
//因为ran()函数的取值范围为0-32767
//任何数字对100取模,就变成了1-100
//2、猜数字
int guess = 0;
int count = 5;
while (count)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了!\n");
}
else if(guess > ret)
{
printf("猜大了!\n");
}
else
{
printf("恭喜你猜对了!\n");
break;
}
count--;
}
if (count == 0)
{
printf("你猜失败了,正确的数字是:%d\n", ret);
}
}
int main(void)
{
int input = 0;
srand((unsigned int)time(NULL));
//要放到主函数中,生成随机数只执行一次
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
生成0~99之间的随机数
rand()%100; //余数的范围是0-99
生成1~100之间的随机数
rand()%100+1;
生成100~200之间的随机数
100 + rand () % (200-100+1)
//余数的范围是0~100,加100之后就是100~200
生成a~b之间的随机数
a + rand () % (b-a+1)