都需要用到表达式:表达式部分可以是关系表达式,逻辑表达式,以及数值表达式,输入表达式时需要注意逻辑死否清晰,是否表达式的内容与自己想象中的判断一致。
形式1.:(没有else部分)
if (expression)
{
statement;
}
形式2.:(有else子句部分)
if (expression)
{
statement;
}
else
{
statement;
}
形式3.:(在else部分嵌套了多个if语句)
if(expression)
{
statement;
}
else if(expression)
{
statement;
}
else if (expression)
{
statement;
}
else
{
statement;
}
比如下面这个代码:(将= 与== 输出错误)
int main()
{
int a = 10;
if (a = 5)//写成5 == a可以避免很多错误情况
{
printf("hehe\n");
}//仍然会打印hehe,因为把等于符号打成了赋值符号。
return 0;
}
#include
int main()
{
int a = 0;
scanf("%d",&a);//
if(a % 2 != 0)
printf("%d是奇数",a);
else
printf("%d是偶数",a);
return 0;
}
#include
int main()
{
int a = 1;
for (a = 1;a<=100;a++)
{
if (a % 2 != 0)
printf("%d",a);
}
return 0;
}
#include
int main()
{
int day = 0;
scanf("%d",&day);
switch (day)//必须是整形
{
case 1://case后面必须是整形常量表达式
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("周末\n");
break;
default:
printf("输入错误\n");
}
return 0;
}
//#include
int main()
{
int month = 0;
int year = 0;
int day = 0;
printf("请输入年:");
scanf("%d", &year);
printf("请输入月:");
scanf("%d", &month);
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
day = 29;
else
day = 28;
break;
default:
// day = -1;
break;
}
if (-1 == day)
printf("输入错误");
printf("这个月有%d天",day);
return 0;
}
#include
int main()
{
int n = 1;
int m = 2;
switch(n)
{
case 1:m++;
case 2:n++;
case 3:
switch(n)
{
case 1:n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break:
default:
break;
}
printf("m = %d,n = %d ",m,n);//m = 5、n = 3
return 0;
}
先介绍两个语句的作用:
1.break:终止后面所有循环
2.continue:结束后面所有循环,直接跳到判断部分
while(expression)
{
statement;
}//表达式为真就执行循环
#include
int main()
{
int a = 1;
while (a <= 10)
{
if (5 ==a)
{
//continue;//跳过后面的循环,直接开始判断:1234死循环
//break;//终止循环:1234
}
printf("%d",a);
a++;
}
return0;
}
#include
int main()
{
int ch = getchar();//'a'--97 用整形没有问题
//printf("%c\n", ch);
putchar(ch); //输出一个字符
return 0;
}
/*getcahr ———— 获取一个字符 ———— 一次只能操作一个字符
getchar读取失败的时候,返回EOF ———— ( -1 )
putchar ———— 输出一个字符
标准输入————键盘; 标准输出————屏幕;*/
#include
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
//从缓冲区得到的是字符,就会执行循环
//得到的不是字符,就会返回-1,循环终止
putchar(ch);
}
return 0;
}
#include
int main()
{
char input[20] = {
0};//1
printf("请输入密码\n");//
scanf("%c",input);//数组名本来就是地址,所以这里就不用&
//问题一解决:
/*
getchar()//用来读取\n
*/
//问题二解决:
/*
int tmp = 0;
while ((ch = getchar()) != '\n')//可以用来清理缓冲区
//用循环来读取字符,直到读到\n停止
{
;//空语句
}
*/
printf("请确认密码\n");//
int ch = getchar();
if (ch == ' Y')
printf("成功\n");
else
printf("失败\n");
return 0;
}
情况一:输入abcdef然后回车
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUjCicQJ-1635573432073)(D:\typora\相册\密码001.png)]
程序解释:原因:输入的是abcde回车,键盘里面得到的是abcde\n
当scanf读取了abcde时,缓冲区剩下\n,然后执行后面的代码,轮到执行getchar时,getchar发现缓冲区有\n,所以getchar读取了\n,但是\n不等于‘Y’,所以会报失败
改正方法;在scanf函数后面加上一句getchar语句用来读取\n
解决方法见上面————问题一解决
情况二:
如果输入密码是:abcde hehe\n (中间有空格)该怎么办?
已经知道:scanf 读取字符串时遇到空格就结束
后面还有:hehe\n
getchar 每次只能读一个字符,所以不适合用上面的方法,但是可以通过加入一个循环去将一系列不需要的字符读取掉
解决方法件上面————问题二解决
优点:集初始化,循环判断,调整部分于一体
//格式
for (ex1;ex2;ex3)
{
statement;
}
for循环执行流程很重要:
第一步:ex1————整个循环过程中只会执行一次
第二步:ex2
第三步:statement
第四步:ex3————第三部分是在循环执行完后再开始的
注意
1.尽量不在for循环内部改变循环变量=-----可能会改变循环–造成死循环
2.建议左闭右开:可以提高可读性
for(a = 0; a < 10; a++)//循环十次
{
}
//上下效果一样,但是建议使用上面的方法
//可读性更高
for(a = 0; a<= 9; a++)
{
}
不建议省略表达式:可能会导致出错
int main()
{
int a = 0;
int b = 0;
for (a = 0; a < 3; a++)
{
for (b= 0; b < 3; b++)
printf("haha\n");
}
}//九个hehe
int main()
{
int a = 0;
int b = 0;
for (; a < 3; a++)
{
for (; b < 3; b++)
printf("haha\n");
}
}//三个heh
for(a = 1,b = 1;a < 10; a++, b++)//使用逗号可以给a、b都赋值
但是使用逗号表达式时也要有注意的地方:特定时候需要在意顺序
for(a +=b ,b = 1;a < 10; a++, b++)//这里a +=b先进行,再进行b的赋值
for(a = 1;b = 0; b++)//这个循环不会执行
//表达式:b = 0;表达式结果为0;则判断部分也为0-----假
特点:至少要执行一次
表达式:
do
{
;可以是空语句
}
while;
//打印1-10
#include
int main()
{
int a = 1;
do
{
printf("%d ", a);
a++;
} while (a <= 10);//这里这个分号不能漏掉
return 0;
}
#include
int main()
{
int a = 1;
int n = 0;
int num = 1;//不能从0开始
scanf("%d", &n);
for (a = 1; a <=n; a++)//这里要<=
{
num = num * a;
}
printf("%d", num);
return 0;
}
方法一:
#include
int main()
{
int a = 1;
int b = 1;
int n = 0;
scanf("%d", &n);
int sum = 0;
int num = 1;
for (a = 1;a<=n;a++)
{
num = 1;//重新循环时,需要将num重新赋值,否则上一次的计算结果会影响下一次运算
for (b = 1; b <= a; b++)
{
num = num * b;
}
sum +=num;
}
printf("%d", sum);用
return 0;
}
方法二:
#include
int main()
{
int a = 1;
int b = 1;
int n = 0;
scanf("%d",&n);
int num = 1;
int sum = 0;
for (a = 1; a <= n; a++)
{
num *= a;
sum += num;
}
printf("%d", sum);
return 0;
}
#include
int main()
{
int arr[] = {
1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int i = 0;
for (i = 0; i < 10; i++)
{
if (i == k)
printf("找到了,下标时%d\n", i);
}
if (10 == i)
printf("找不到\n");
return 0;
}//效率很低
方法二:
#include
int main()
{
int arr[] = {
1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[1]);
//40/4=10
int right = sz-1;
int left = 0;
while (left <= right)
{
int mid = (right + left) / 2;
if (arr[mid] < k)
left = mid + 1;
else if (arr[mid > k])
right = mid - 1;
else
{
printf("找到了,下标是:%d", mid);
break;
}
}
if(right<left)
printf("找不到")
return 0;
}
#include
#include
#include
int main()
{
char arr1[] = {
"hello world"};//2
char arr2[] = {
"###########"};
int left = 0;
int right = strlen(arr1) - 1;//sizeof要减2
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//单位是毫秒,需要Windows.h的头文件
system("cls");//清空屏幕
left++;
right--;
}
return 0;
}
上面的练习中注意代码的逻辑性,在输入时也要注意不要粗心
总结一下我练习的时候容易犯的错误:
1.在for循环和if分支的后面“自然地”加上分号,导致结果出错
2.用字符串初始化数组时没有加双引号:错误写法:char arr[ ] = { hahaha }
3.在创建字符数组时要用int去创建,报错时才反应过来
4.= 和 == 有时候会输错,陷入死循环时才找到错误
端移动,向中间聚集
#include
#include
#include
int main()
{
char arr1[] = {
"hello world"};//2
char arr2[] = {
"###########"};
int left = 0;
int right = strlen(arr1) - 1;//sizeof要减2
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//单位是毫秒,需要Windows.h的头文件
system("cls");//清空屏幕
left++;
right--;
}
return 0;
}
上面的练习中注意代码的逻辑性,在输入时也要注意不要粗心
总结一下我练习的时候容易犯的错误:
1.在for循环和if分支的后面“自然地”加上分号,导致结果出错
2.用字符串初始化数组时没有加双引号:错误写法:char arr[ ] = { hahaha }
3.在创建字符数组时要用int去创建,报错时才反应过来
4.= 和 == 有时候会输错,陷入死循环时才找到错误