if_else_else if
int main()
{
int age = 60;
if (age < 18)
printf("青年\n");
else if (age >= 18 && age < 60)//&&且
printf("中年\n");
else if (age >= 60 && age < 100)
printf("老年\n");
else
printf("长寿\n");
return 0;
}
错误:18<=age<60。逻辑:18<=age为1,1<60。
玄空else:else和最近的if匹配
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else//else和最近的if匹配
printf("haha\n");
return 0;
}//结果:什么都没输出
更正:明确匹配{ }
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
判断一个数是不是奇数
int main()
{
int num = 15;
if (num % 2 == 1);
printf("奇数");
return 0;
}
输出1~100的所有奇数
int main()
{
int i = 1;
while (i < 100)
{
if (i % 2 == 1)
printf("%d ", i);
i++;
}
return 0;
}
int main()
{
int i = 0;//C++,C99才支持
for (i = 1; i < 100; i++)
{
if (i % 2 == 1)
printf("%d ", i);
}
return 0;
}
switch case default
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)//switch(整形)
{
case 1://case决定入口
printf("一");
break;//break决定出口
case 2://case 整形常量:
printf("二");
break;//不加break就会执行后续的case
case 3:
printf("三");
break;
default:
printf("warning");//输入其他值返回结果
}
return 0;
}
while(判断)
int main()
{
int i = 1;//初始化
while (i <= 10)//判断
{
if (5 == i)
break;//while循环中,break永久终止循环
//continue;//while中,continue跳过后续代码
//直接去判断部分,是否进行下一次循环
//1234_然后死循环
printf("%d ", i);
i++;//调整
}
return 0;
}
getchar();
putchar();
//getchar读取字符,读取错误返回EOF,即-1
//EOF - end of flie - 文件结束标志
int main()
{
int ch = getchar();
//printf("%c\n", ch);
putchar(ch);//输出一个字符
return 0;
}
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}//ctrl+z - getchar读取一个EOF,读取结束
return 0;
}
输入密码: > 123
确认密码(Y / N) :> 失败
int main()
{
int password[20] = { 0 };
printf("输入密码:>");//输入123,缓冲区内是123\n
scanf("%s", password);//password本身就是地址,不需要取地址
printf("确认密码(Y/N):>");//scanf从缓冲区取走了123
int ch = getchar();//由于缓冲区还有值,不需要输入,getchar取走了\n
if (ch == 'Y')
printf("成功\n");
else
printf("失败\n");
return 0;
}
更改:加入 getchar();//清理缓冲区,处理\n
int main()
{
int password[20] = { 0 };
printf("输入密码:>");//输入123,缓冲区内是123\n
scanf("%s", password);//password本身就是地址,不需要取地址
printf("确认密码(Y/N):>");//scanf从缓冲区取走了123
//清理缓冲区
getchar();//处理\n
int ch = getchar();//由于缓冲区还有值,不需要输入,getchar取走了\n
if (ch == 'Y')
printf("成功\n");
else
printf("失败\n");
return 0;
}
//输入密码: > 123
//确认密码(Y / N) :> Y
//成功
输入密码:>123 abc
确认密码(Y/N):>失败
int main()
{
int password[20] = { 0 };
printf("输入密码:>");//输入123 abc,缓冲区内是123 abc\n
scanf("%s", password);
printf("确认密码(Y/N):>");//scanf从缓冲区取走了123,缓冲区还有 acb\n
//清理缓冲区
getchar();//处理 abc
int ch = getchar();//由于缓冲区还有值,不需要输入,getchar取走了
if (ch == 'Y')
printf("成功\n");
else
printf("失败\n");
return 0;
}
更改:循环getchar(),清空缓冲区中多个字符
int main()
{
int password[20] = { 0 };
printf("输入密码:>");//输入123 abc,缓冲区内是123 abc\n
scanf("%s", password);
printf("确认密码(Y/N):>");//scanf从缓冲区取走了123,缓冲区还有 acb\n
//清理缓冲区
//getchar();//处理 abc
//清除缓冲区多个字符
int tmp = 0;
while ((tmp = getchar()) != '\n')
{
;
}
int ch = getchar();//由于缓冲区还有值,不需要输入,getchar取走了
if (ch == 'Y')
printf("成功\n");
else
printf("失败\n");
return 0;
}
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')//||or,'0'是指字符0和9
continue;
putchar(ch);
}
return 0;
}
for(初始化;判断;调整)
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)//(初始化;判断;调整)
{
if (i == 3)
continue;//跳过3
if (i == 8)
break;//到8停止
printf("%d", i);
}
return 0;
}
建议:
- 不要在循环体内改变循环变量
- 采取左闭右开区间(i = 0; i < 10; i++)//循环10次
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)//判断部分k=0是赋值,0为假,不进行循环
k++;
return 0;
}
do 循环语句; while(判断);
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
continue;
break;
int main()
{
int i = 1;
do
{
if (i == 5)
//break;//1 2 3 4
continue;//1 2 3 4__死循环,会跳过后面的i++
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
practice
1.计算n的阶乘
int main()
{
int n = 0;
int i = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret *= i//ret = ret * i
}
printf("%d!= %d", n, ret);
return 0;
}
2.计算1!+2!+3!+…+10!
int main()
{
int n = 0;
int i = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++)//1!+2!+3!=1+2+6=9,这个输出是15
{
//改进:计算之前重置ret
ret = 1;
for (i = 1; i <= n; i++)
{
ret *= i;//因为到这里ret没有重置
}
sum += ret;
}
printf("%d", sum);
return 0;
}
优化:3!=32!,n!=n(n-1)!
int main()
{
int n = 0;
int i = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++)
{
ret *= n;
sum += ret;
}
printf("%d", sum);
return 0;
}
3.在一个有序数组中査找具体的某个数字n。
编写int binsearch(intx,int v[],int n);
功能:在v[0]<=v[1]<=v[2]<= ….<=v[n-1]的数组中查找x
二分查找法:前后下标均值
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;//需要查找的数字
int sz = sizeof(arr)/sizeof(arr[0]);//数组元素个数:数组大小/一个元素大小
int left = 0;
int right = sz-1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] > k)
right = mid - 1;
else if (arr[mid] < k)
left = mid + 1;
else
{
printf("找到了,下标为%d\n", mid);
break;
}
}
if (left > right)
printf("找不到\n");
return 0;
}
4.编写代码,演示多个字符(welcome to china!)从两端移动,向中间汇聚。__25-1-4
#include <stdio.h>
#include <string.h>//strlen()
#include <Windows.h>//sleep()
//welcome to china!
//#################
int main()
{
char arr1[] = "welcome to china!";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//睡眠1秒
system("cls");//清空屏幕
left++;
right--;
}
printf("%s", arr2);
return 0;
}
5.编写代码实现,模拟用户登录情景,并且只能登录三次。
只允许输入三次密码,如果密码正确则提示登录成功。
如果三次均输入错误,则退出程序。
int main()
{
char password[20] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s", password);//数组名本身就是地址
if ( )
{
printf("登录成功。\n");
break;
}
else
{
printf("登录失败,重新输入密码:\n");
}
}
if (i == 3)
printf("三次输入错误,退出程序。\n");
return 0;
}
6.写一个猜数字游戏
1.自动产生一个1-100之间的随机数
2.猜数字
a. 猜对了,就恭喜你,游戏结束
b. 你猜错了,会告诉猜大了,还是猜小了,继续猜,直到猜对
3.一直猜,猜对推出
#include <time.h>//time()
#include <stdlib.h>//rand();srand()
void menu()
{
printf("****1.play****\n");
printf("****0.exit****\n");
}
void game()//1、生成随机数;2、猜数字
{
//rand()函数前需要使用srand()进行随机起点设置
//rand()返回0--32767的数字
int ret = rand()%100+1;//%100余数为0--99
int guess = 0;
while(1)
{
printf("猜数字\n");
scanf("%d", &guess);
if (guess < ret)
printf("猜小了\n");
else if (guess > ret)
printf("猜大了\n");
else
{
printf("正确!\n");
break;
}
}
}
7.求两个数的最大公约数
int main()
{
int m = 0;
int n = 0;
int t = 0;
scanf("%d %d", &m, &n);
while (t = m % n)
//m=18,n=24-->
//t=18%24=18,m=n=24,n=t=18;
//t=24%18=6,m=n=18,n=t=6;
//t=18%6=0结束循环
{
m = n;
n = t;
}
printf("%d", n);
return 0;
}
8.打印1000–2000之间的闰年
闰年:被4整除&&不能被100整除。||能被400整除。
int main()
{
int y = 0;
for (y = 1000; y <= 2000; y++)
{
if (y % 4 == 0 && y % 100 != 0)//1. 被4整除,不能被100整除。
printf("%d ", y);
if (y % 400 == 0)//2. 能被400整除。
printf("%d ", y);
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))//简单优化
//被4整除 && 不能被100整除 || 能被400整除。
printf("%d ", y);
}
return 0;
}
9.打印100–200的素数
素数(质数):只能被自己和1整除
int main()
{
int i = 0;
int j = 0;
for (i = 100; i <= 200; i++)
{
for (j = 2; j < i; j++)//i%j==0即i能被2--i-1的数字整除,则不是素数
{
if (i % j == 0)
break;
}
if (i == j)//i=j即i能被自己整除,i是素数
printf("%d ", i);
}
return 0;
}
优化:i=m*n;m,n一定小于 i 的开方sqrt(i)
#include <math.h>//sqrt()
int main()
{
int i = 0;
//int flag = 1;//错误代码:flag定义在循环外
//在每次开始判断一个新的数 i 是否为素数时,都应该先将 flag 重置为 1(假设它是素数)
for (i = 100; i <= 200; i++)
{
int j = 0;
int flag = 1;
for (j = 2; j <= sqrt(i); j++)
{
//if (i % j == 0)//错误代码:break 语句的作用范围遵循代码块规则
// flag = 0;
// break;//break 语句实际只跳出了 if 语句块,而没有跳出内层的 for 循环,导致逻辑错误。
if (i % j == 0)//i%j==0即i能被2--sqrt(i)的数字整除
{
flag = 0;//i不是素数
break;
}
}
if (flag == 1)//i是素数
printf("%d ", i);
}
return 0;
}
goto
goto不能跨函数,只能在一个函数范围跳转
//一个goto的练习关机程序
#include <string.h>//strcmp()
#include <stdlib.h>//system()
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");//关机命令systme()-stdlib.h
again:
printf("电脑一分钟后关机,\n输入“我是猪”取消关机。\n");
scanf("%s", input);//s是字符串,c是字符
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}