一、for
问:以下程序循环多少次?
答:0次。
因为for循环的判断条件是k=0,而非k==0,=是赋值符号,而且,k=0,0为假,既该判断条件为假,则不进入循环。
二、do while——先执行后判断
do
循环语句
while(表达式);
三、题目
题1——打印1!+2!+。。。+n!:
//1!+2!+3!+..n!
int n = 0,i,cont=0,j;
int ret = 1;
scanf("%d", &n);
for (i = 1; i < n + 1; i++) {
ret = 1;
for (j = 1; j < i + 1; j++) {
ret *= j;
}
cont += ret;
}
printf("%d\n", cont);
这个做法没有错误,但是用了嵌套循环,时间复杂度高。
通过观察,我们可以看到,1!+2!+3!就是
1
1*2
1*2*3
三项相加,其实一层循环就可以完成,因为在计算3!的时候,2!和1!都已经计算出来了
可以把代码改为
for (i = 1; i <= n; i++) {
ret = ret * i;
cont += ret;
}
设n=3.
i=1,ret=1*1=1,cont=0+1=1
i=2,ret=1*2=2,cont=1+2=3
i=3,ret=2*3=6,cont=3+6=9
题2——实现字符从两边到中间逐步打印的过程:
//welcome to bit!!!!
//实现字符从两边到中间逐步打印的过程
//w################!
//we##############!!
//wel############!!!
//welc##########!!!!
. . . . .
. . . . .
. . . . .
///welcome to bit!!!!
#include <Windows.h>
#include <stdlib.h>
int main() {
char c[] = "welcome to bit!!!!";
char b[] = "##################";
int left = 0, right =0;
right = strlen(c) - 1;
while (left <= right) {
b[left] = c[left];
b[right] = c[right];
printf("%s\n", b);
Sleep(1000);//实现一行行动态打印有一个缓冲时间,需引用#include <Windows.h>
system("cls");//清空屏幕,需引用#include <stdlib.h>
left++;
right--;
}
printf("%s\n", b);
return 0;
}
题3——登陆系统:
//登陆系统,输入错误超过三次,自动退出系统
#include <string.h>
int main()
{
char pwd[] = "abcdef";
char p2[20] = "";
int i = 0;
for (i = 0; i < 3; i++) {
scanf("%s", p2);
if (strcmp(p2, pwd)==0) {
printf("登陆成功\n");
break;
}
else {
printf("输入错误,请重新输入:\n");
}
}
if (i == 3) {
printf("输入错误超过三次,退出系统");
}
return 0;
}
题4——猜数字:
//猜数字游戏
#include <time.h>
#include <stdlib.h>
void run()
{
printf("##################\n");
printf("#####1.猜数字 #####\n");
printf("#####0.退出系统#####\n");
printf("##################\n");
}
void guess()
{
//rand()是c语言中的随机数生成函数,返回0-RAND_MAX(32767)之间的整数
//为了实现1-100之间的随机数,可以%100,得到的余数是0-99,因此需要再+1
int ret = rand()%100+1;
int n = 0;
printf("请输入一个0-100之间的数字:\n");
while (1) {
scanf("%d", &n);
if (n > ret) {
printf("猜大了\n");
}
else if (n < ret) {
printf("猜小了\n");
}
else {
printf("猜中了\n");
break;
}
}
}
int main()
{
//srand()函数是c语言中的种子函数,用于控制随机数生成器的核心函数,功能是为
//随机数生成器设置一个种子。需要引用#include <stdlib.h>
//time()返回一个系统时间,即时间戳,需要引用#include <time.h>
//将时间戳作为srand的种子参数,是为了不同时候运行程序时所产生的随机数不同。
//为什么srand()不放在guess()中执行?
//因为多次调用srand,并传入相同的种子值(如果输入数字比较快,可能会传入的时间相同),rand每次都会从相同的起点开始生成随机数,导致得到的随机数是重复的。
//因此将srand放到主函数中执行,以确保每次生成的随机数不同。
srand((unsigned int)time(NULL));//为随机数生成器设置一个起点
int r = 34;
int num = 0;
do {
run();
scanf("%d", &num);
switch (num) {
case 0:
printf("退出系统\n");
break;
case 1:
guess();
printf("猜数字\n");
break;
default:
printf("输错了\n");
}
} while (num != 0);
}
四、goto
again:
printf("hehe\n");
goto again;
以上代码将会循环打印hehe,形成死循环。
goto语句适合于一次跳出多层循环。
for(...){
for(....){
for(...){
if(...)
goto error;
}
}
}
error:
if(...)
//处理错误情况
题5——恶作剧——关机程序
//关机程序
//电脑60秒自动关机//shutdown -s -t 60
//如果输入我是猪,取消关机//shutdown -a
//system()可以执行系统命令//#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
int main() {
char c[20] = "0";
system("shutdown -s -t 60");
again:
printf("请输入我是猪,否则电脑将会在60秒内关闭\n");
scanf("%s", c);
if (strcmp(c, "我是猪")==0) {
system("shutdown -a");
}
else {
goto again;
}
return 0;
}