示例:
char password[100] = { 0 }; //初始化密码//空间不够的话,会报错stack around the variable was corrupted
printf("please entry the password:\n");
scanf("%s", password);
printf("please confirm your password,please entry Y or N\n ");
//getchar();//清理缓存区只能清除一个
int temp;
while ((temp = getchar()) != '\n') //可以清楚\n回车键之前的
{
;
}
//char m;
//scanf("%c", &m);
int m = getchar(); //都是会出现scanf读取回车键的情况
if (m == 'Y')
printf("correct");
else
printf("error");
return 0;
注意:
1
if(65=='A'){} //这个条件是正确的
2
清楚缓存区的数据的时候,可以只读取不输出;
清楚缓存区的字符,加一个循环结构,包括 \n;
int temp;
while ((temp = getchar()) != '\n') //可以清楚\n回车键之前的
{
;
}
3
scanf读到空格就不读了;
代码示例:输出一段字符中的数字部分
int m = 0;
while ((m = getchar()) != EOF) //如果是数字,直接打印,如果不是数字,相当于跳过了
{
if (m < '0' || m>'9')
{
continue;
}
putchar(m);
printf(" ");
}
return 0;
for语句
for(expression one;expression two;expression three)
{statements;}
expression one:初始化—初始化循环变量
expression one:条件判断部分—判断循环是否终止–判断部分省略恒为真,可能会陷入死循环;
expression one:调整部分—循环条件的调整
break在for语句中是直接终止for循环语句;
continue在for语句中跳过本次循环,但不会导致死循环,因为有expression three的存在;
int m = 1;
for (m=1; m <= 10; m ++)
{
if (m == 5) //总是加;,这是错误的
{
continue;
}
printf("%d ", m);
}
一些建议:
-
不建议在循环体里面修改循环变量,防止for循环失去控制;
-
建议for循环语句循环控制变量的取值采用前闭合后开区间的写法;
m=1; m <= 10; //左右都闭区间的写法
m=1;m<11;//这是前闭合后开区间的写法
尽量不要省略,尽量写成前闭后开的形式
int i = 0;
int m = 0;
for (i = 0; i < 3; i += 1) //写成前闭后开的形式,3的意义是循环的次数
{
for (m = 0; m < 3; m++) //如果把m=3省略的话,那么m=3就不会变化了,当i=1时,也无法进入循环
{
printf("%d %d", i, m);
printf("\t");
}
printf("\n");
}
return 0;
do while 循环语句
do
{
语句; //循环体至少执行一次
}
while(条件) //先执行再判断
break、continue与while语句是一样的,可能会陷入死循环;
int i = 1;
do
{
printf("%d ", i);
i++;
}
while (i <11);
return 0;
示例:求1!+2!+…+10!
int e = 1; //1-10循环用的那个数
int num2 = 0;
for (e = 1; e < 11; e++)
{
int d = 1; //阶乘循环里面循环条件用的那个数
int num1 = 1;
while (d <= e)
{
num1 = num1 * d;
d++;
}
num2 += num1;
}
printf("1!+2!+...+10!的值为:%d", num2);
return 0;
注意:这是一个循环嵌套,逻辑理明白就可以了
示例:1!+2!+…+%d!的值为:
int i = 1;
int n = 0;
long int num2 = 0;
printf("请输入 n 的值:\n");
scanf("%d", &n); //n是阶乘到几
for (i = 1; i <= n; i++)
{
int j = 1; //求阶乘循环的内层循环条件的数
int num1 = 1; //处方阶乘的数 同样地初始化num1,因为后续还得算其他数的阶乘
for (j = 1; j <= i; j++)//求i的阶乘 i是上面的数
{
num1 *= j;
}
num2 += num1; //结果是i的阶乘 i是从1-n的
}
printf("1!+2!+...+%d!的值为:%ld\n", n,num2);
return 0;
这个比较冗余、复杂,可以多思考思考;
下面是一个优秀的示例:
int i = 1; //循环控制变量
int n = 10; //目标参数
int fact = 1; //存储阶乘的参数
int num = 0; //存储阶乘相加的参数
for (i = 1; i <= n; i++)
{
fact *= i; //巧妙之处就是节省了一个循环,因为n+1的阶乘=n的阶乘*(n+1)
num += fact;
}
return 0;
二分法\折半法:时间复杂度=log2(n) 向上取整;
示例:查找有序数组的某个数:
int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //目标数组
int goal = 7; //目标查找的数据
int left = 0; //左数据的下标
//printf("The length of arr is %d\n", sizeof(arr));
int sz = sizeof(arr)/sizeof(arr[0]); //确定数组的个数
int right = sz - 1; //右数据的下标
int mid = (left + right) / 2; //中间下标
while (left<=right) //合理选择循环语句
{
int mid = (left + right) / 2; //中间下标
if (goal < arr[mid])
{
right = mid - 1;
}
else if (goal > arr[mid]) //if语句别忘了怎么写的
{
left = mid + 1;
}
else //记得加上一个终止语句
{
printf("找到了您要查找的数据%d,下标为:%d\n", goal, mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
注意:
1.选对方法,二分法也就是折半法,效率更高
2.不要忘记用break语句终止循环,记得把求 mid 新值放在循环里面;
示例:两端字符向中间移动
//两段字符向中间移动
char arr1[] = "weclome to bit !!!!!!";
char arr2[] = "#####################";
int leftt = 0; //左下标
int rightt = strlen(arr1) - 1; //右下标 strlen函数的类型时size_t,以后再了解吧
//printf("%d %d", strlen(arr1), strlen(arr2));
while (leftt <= rightt)
{
arr2[leftt] = arr1[leftt];
arr2[rightt] = arr1[rightt];
printf("%s\n", arr2);
Sleep(500);
system("cls"); //cls清空函数
leftt+=1;
rightt-=1;
}
printf("%s\n", arr2);
return 0;
Sleep函数:使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态,需要引入头文件windows.h才可以使用;
strlen函数 :用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符),需要引入头文件string.h才可以使用;
示例:模拟用户登录情景,只能输入三次,超过次数则退出程序
char password[] = "17047lhsk";
char your_password[9] = { 0 };
int i = 0;
printf("请输入密码:");
for (i = 1; i <= 3; i++)
{
scanf("%s", your_password);
if (strcmp(password, your_password) == 0)
{
printf("密码输入正确,正在进入系统...");
break;
}
else if(i<3 && strcmp(password, your_password) != 0)
{
printf("密码输入错误!请重新输入:");
}
else if(i=3)
{
printf("三次密码均输入错误,正在退出系统...");
}
}
return 0;
strcmp函数—strcmp(字符串1,字符串2):
比较两个字符串的大小,比较的是相应位置字符的ASCII值的大小;输出为int类型,相等的话,返回值是0;字符串1大于字符串2的话,返回值大于0,反之则小于0;调用函数时,需引入头文件string.h才可以使用;
代码:
if(password == "123456);
这个写法比较的是两个字符串首字符的地址;
示例:写一个猜数游戏
1.随机产生一个数字
2.猜数,如果猜的数比那个数大,就提示大,反之相反;
3.玩完一把之后不直接结束,选择是否再玩;
代码实现如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("********菜 单 页*********\n");
printf("******************************\n");
printf("********1--->开始游戏*********\n");
printf("******************************\n");
printf("********0--->退出游戏*********\n");
printf("******************************\n");
printf("******************************\n");
//printf("******************************\n");
}
void game()
{
//1.产生一个1-100之间的随机数
int num = 0; //产生的一个数字
//num = rand((unsigned int)time(NULL));
num = rand()%100+1;
//printf("生成的随机数字为:%d\n\n",num);
//利用时间戳生成一个随机数,但是这个随机数每一次运行程序都一样,同样适用time函数前应调用另外一个函数
//2.输入你猜的数字,然后比较
int guess = 0; //存储你输入的那个数
printf("请输入您猜的数字:");
while (1)
{
scanf("%d", &guess);
if (guess > num)
{
printf("偏大\t");
printf("\n");
printf("\n");
Sleep(1500);
system("cls");
printf("请重新输入:");
}
else if (guess < num)
{
printf("偏小\t");
printf("\n");
printf("\n");
Sleep(1500);
system("cls");
printf("请重新输入:\n");
}
else
{
printf("恭喜你猜对了!\n");
printf("\n");
break;
}
}
}
int main()
{
//首先写一个循环函数,可以循环函数
int input = 0;//你输入的数字
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入数字选择:");
scanf("%d", &input);
switch (input) //一种分支选择语句
{
case 1:
printf("猜数字游戏\n\n\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default: //默认类型
printf("输入有误!请重新输入\n\n\n");
}
}
while (input); //当输入0时,结束程序; do while的用法,很神奇
return 0;
}
1.rand函数每次运行程序产生的数据一样重复!—解决方案:调用rand函数前,调用srand函数
2.srand函数可以设置随机数种子
如果srand(常数)—随机数生成总是一样的值—解决方案:时间戳
使用的话,需要引入stdlib.h头文件
3.time函数,里面有参数,设置成NULL,并且把返回值类型有time_t强制转化为 int 型;
使用的话,需要引入time.h头文件
4.生成的随机数会非常接近!—解决方案:srand函数在循环前就引用一次就可以了;
5.将生成的随机数%100(取余数)+1,使其保证在1-100之间;
6.Sleep函数需要引用头文件windows.h
代码如下:
#include <stdlib.h>
#include <time.h>
...
srand((unsigned int)time(NULL));
num = rand()%100+1;
...
示例:三个整数从大到小排列:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int com(int a, int b, int c)
{
if (a > b)
{
if (c > a)
{
printf("%d--%d--%d", c, a, b);
}
else
{
if (c > b)
{
printf("%d--%d--%d", a, c, b);
}
else
printf("%d--%d--%d", a, b, c);
}
}
else //a<b
{
if (c < a)
{
printf("%d--%d--%d", b, a, c);
}
else
{
if (c > b)
{
printf("%d--%d--%d", c, b, a);
}
else
printf("%d--%d--%d", b, c, a);
}
}
}
int main()
{
int x = 0;
int y = 0;
int z = 0;
printf("请输入三个数据:");
scanf("%d %d %d",&x,&y,&z);
//三个数的排序代码
printf("输出结果为:\t");
com(x, y, z);
return 0;
}
算是遍历方法,比较笨蛋;
示例:两个数的最大公约数:
int m = 0,n = 0;
int max = 0;//两者之间小的数,因为最大公约数最大为两者之间的那个最小数,然后遍历
printf("输入两个数:");
scanf("%d %d", &m, &n);
if (m > n)
max = n;
else
max = m;
while (1) //一直执行,满足某个条件退出
{
if (m % max == 0 && n % max == 0)
{
printf("最大公约数为: %d\n", max);
break;
}
max--;
}
return 0;
辗转相除法:求解最大公约数
代码实现:
int m = 0;
int n = 0;
int temp = 0; //中间变量
printf("输入两个数:");
scanf("%d %d", &m, &n);
while (1)
{
if (m % n == 0)
{
printf("最大公约数为: %d", n);
break;
}
temp = m % n;
m = n;
n = temp;
}
return 0;
或者:
while(m % n ) //更妙
{
temp = m % n;
m = n;
n = temp;
}
printf("%d", n);
两种循环函数的特点;
打印1000-2000年的闰年:
int year = 0;
int count = 0;
for (year = 1000; year <= 2000; year++)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
printf("%d\t", year);
count++;
}
}
printf("\n");
printf("%d", count);
return 0;
代码示例:打印100-200之间的素数
int i = 0;
int count = 0; //存储计数
for (i = 100; i <= 200; i++)
{
//判断i是否为素数
int j = 0; //每次循环都可以更新一下
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
break;
}
}
if (i == j)
{
printf("%d\t",i);
count++;
}
}
printf("\n");
printf("%d", count);
return 0;
代码:
int i = 0;
int temp = 1;
int count =0;
for (i = 100; i <=200; i++)
{
int j = 0;
for (j = 2; j < sqrt(i); j++)
{
if (i % j == 0) //if不是循环语句,会跳出for这个循环
{
temp = 0;
break; //直接结束for循环
}
else
temp = 1;
}
if (temp)
{
printf("%d\t", i);
count++;
}
}
printf("%d", count);
return 0;
其中我出错的一个地方在于temp的值的设定;
判断一个数是不是素数
1.用2-(n-1)之间的数除;
2.用2-sqrt(n)之间的数除
goto语句
1.C语言提供了可以随意滥用的goto语句和标记跳转的符号;
2.理论上goto语句没有必要,但某些情况下还是很有必要的,比如一次跳出所有循环;
3.可以打乱程序正常进行的次序;
代码示例:
flag:
printf("1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2\n");
Sleep(10);
printf("2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1\n");
Sleep(10);
goto flag;
return 0;
这个可以营造一个循环的效果;
示例:
关机命令:shut down -s -t 60
停止关机:shut down -a
system()函数:C语言中执行系统命令的函数,需引用stdlib.h头文件
sizeof与strlen的区别:sizeof会将空字符0计算在内,而strlen不会将空字符
0计算在内; sizeof会计算到字符串最后一个空字符0并结束,而strlen如果遇
到第一个空字符0的话就会停止并计算遇到的第一个空字符0前面的长度
代码示例:一段关机代码
char input[20] = { 0 };
//char num[] = "hello world";
//char num1[] = "你好世界"; //汉字占用两个字节
//printf("%d %d",sizeof(num), sizeof(num1));
system("shutdown -s -t 600"); //要输入双引号
again: //用的是冒号
printf("您的电脑即将在十分钟内关机!取消请输入“取消关机”\n");
scanf("%s", input);
if (strcmp(input, "取消关机") == 0)
{
system("shutdown -a");
printf("取消关机成功!");
}
else
{
goto again;
}
return 0;
也可以用这样的循环代码实现:
while (1)
{
printf("您的电脑即将在十分钟内关机!取消请输入“取消关机”\n");
scanf("%s", input);
if (strcmp(input, "取消关机") == 0)
{
system("shutdown -a");
printf("取消关机成功!");
break;
}
}
goto语句只能在一个函数范围内跳转;
本文详细介绍了C++和C语言中的for、do while循环语句的使用,强调了避免在循环体中修改循环变量的重要性。同时,讨论了二分查找法的应用及注意事项,并给出了模拟用户登录、猜数游戏的代码示例。还探讨了goto语句的使用场景及其潜在问题。此外,文章提到了字符串处理函数如strlen、strcmp的用法,并讲解了随机数生成和判断素数的方法。
1934

被折叠的 条评论
为什么被折叠?



