目录
----if else只能管下面的一条语句(大括号最好带上)
----Sleep 函数 system("cls")清空屏幕
----随机数 ----------------
只要运行起来,电脑就会在1分钟内关机,如果输入:我是猪,就取消关机
语句
c语言 中用;隔开的就是一条语句
分支与循环
0是假 其他都是真
结构化
c语言是结构化的程序设计语言
顺序结构
选择结构
循环结构
分支语句(选择结构)
if语句语法结构
单分支
if(表达式) //表达式中非0就是真
语句;
------------------------------------------------
if(表达式)
语句;
else (表达式)
语句;
多分支
if(表达式)
语句;
else if(表达式)
语句;
else (表达式)
语句;
----if else只能管下面的一条语句(大括号最好带上)
int main()
{
int age = 20;
if (age > 18)
printf("成年\n");
else
printf("未成年\n");
printf("不能结婚\n");
return 0;
}
----&& 错误写法 2<age<=10
先2<age是真 所以把2<age赋值为1
int main()
{
int age=50;
if (age < 10)
{
printf("童年");
}
else if (age >= 10 && age <= 5)//&&表示并 大于等于10并且 小于等于5
{
printf("青年");
}
else
{
printf("壮年");
}
return 0;
}
----悬空else else默认和距离最近的if匹配
int main()
{
int a = 0;
int b = 1;
if (a > 9)
if (b > 2)
printf("哈哈");
else
printf("呵呵");
return 0;
}
结果是都不打印
if书法格式对比
一样的(return以后代码就停止了)推荐第二种写法
if (5==num)这种书写风格好 (防止写成num=5 少一个=不会提示)
----判断一个数是否是奇数
int main()
{
printf("请输入一个数-->");
int a = 0;
scanf("%d", &a);
if (a % 2==0)
{
printf("是个偶数");
}
else
{
printf("是个奇数");
}
return 0;
}
scanf里除了%之外不要写别的
----输出1~100的奇数
int main()
{
int a = 1;
while (a <= 100)
{
if (a % 2 == 1)
{
printf("%d ", a);
a++;
}
else
{
a++;
}
}
}
switch语句
适合多分支
语法
switch(整形表达式)
{
语句项
}
语句项 case 整形常量表达式(字符也可,对应Asall码值)
语句;
int main()
{
int sel = 0;
scanf("%d", &sel);
switch (sel)
{
case 1:
printf("星期1");
case 2:
printf("星期2");
case 3:
printf("星期3");
case 4:
printf("星期4");
break;
}
return 0;
}
整形表达式结果是几就从几进,遇到break停止 没有break的话 def也执行
defalut:case后的都没有,则输出defalut的 (defalut无问题顺序)
switch可以嵌套使用
int main()//1~5工作日 6,7休息日
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
}
return 0;
}
循环结构 循环语句
while
for
do while
while循环
while(表达式)
循环语句;
break跳出当前循环,continue跳出本次循环,进入下次循环
int main()
{
int a = 0;
while (a < 500)
{
if (a == 5)
{
a++;
continue;//跳出本次循环,进入下一次循环
}
else if (a == 100)
{
break;//跳出当前循环
}
printf(" %d", a);
a++;
}
return 0;
}
----getchar() putchar()
从键盘输入一个字符 ,读取正确返回的是ASALL码值,读取错误返回EOF
EOF end of file文件结束标志 本质上是-1
int main()
{
int a = getchar();//从键盘输入一个字符
putchar(a);//输出一个字符
return 0;
}
putchar()输出一个字符
int main()
{
int a = 0;
while ((a = getchar()) != EOF)
{
printf("%c", a);
}
return 0;
}
会自动换行,因为每次输入时都会回车,相当于字符/n
----getchar()运用 拿走\n
int main()
{
char passwd[20] = { 0 };
printf("请输入密码->");
scanf("%s",passwd);//passwd前面不用加&取地址符号,因为passwd数组名本来就是数组第一个元素的地址
printf("请确认密码->Y/N");
int a = getchar();
if (a == 'Y')
{
printf("确认成功");
}
else
{
printf("确认失败");
}
return 0;
}
scanf 数组名不用取地址 数组名本来就是首个元素的地址
不拿转义字符,不拿空格后的
从缓冲区拿数据
(键盘:快递员 缓冲区:驿站 输入函数:你)
再写一个getchar()拿走\n
int main()
{
char passwd[20] = { 0 };
printf("请输入密码->");
scanf("%s",passwd);//passwd前面不用加&取地址符号,因为passwd数组名本来就是数组第一个元素的地址
printf("请确认密码->Y/N");
getchar();//再写一个
int a = getchar();
if (a == 'Y')
{
printf("确认成功");
}
else
{
printf("确认失败");
}
return 0;
}
但是输入 123 456(有空格仍会失败)
--------清理缓冲区中的字符
清理缓冲区剩下来的字符
int tmp = 0;
while ((tmp = getchar()) != '\n')
{
; //用来清理缓冲区字符
}
--------只打印数字
int main()
{
int a = 0;
while ((a = getchar()) != EOF)
{
if (a < '0' || a>'9')//看对应的ASCALL码值
{
continue;
}
putchar(a);
}
return 0;
}
for循环
(初始化部分只执行一次)
初始化 判断 调整
for(表达式1;表达式2;表达式3)
循环语句;
int main()
{
int a;
for (a = 1; a <= 10; a++)
{
printf("%d", a);
}
return 0;
}
break
continue(跳到调整部分)
三个部分可以不写(最好写,判断部分省略恒为真)
建议
最好别在for循环修改循环变量
----省略初始化
int main()
{
int a = 0;
int b = 0;
for (; a < 3; a++)
{
for (; b < 3; b++)
{
printf("hehe\n");
}
}
return 0;
}//最后打印了三次
第一次循环b加到3,下一次循环b不重新初始化到0
----两个循环变量
int main()
{
int a, b;
for (a = 0, b = 0; b < 4; b++, a++)
{
printf("%d", b);
}
return 0;
}
这是赋值!
do while语句
先执行后判断,至少执行一次
do
循环语句;
while(表达式)
int main()
{
int a = 1;
do
{
printf("%d", a);
a++;
} while (a <= 5);
return 0;
}
continue跳到判断
练习题
1.计算n的阶乘
int main()
{
int n;
int j;
int sum=1;
printf("请输入n,计算n!->");
scanf("%d", &n);
for (j = 1; j <= n; j++)
{
sum = sum * j;
}
printf("%d", sum);
return 0;
}
2.计算1!+2!+........10!
int main()
{
int i;
int n;
int sum=1;
int he=0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
sum = sum * i;
he = he + sum;
}
printf("%d", he);
return 0;
}
----错误
ret不能复原
时间复杂度高,效率低
3.在一个有序数组中查找某个数字n 二分法
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d",&k);//要查找的数
int left = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int right = sz - 1;
int mid;//中间指针
while (left<=right)
{
mid = (left + right) / 2;
if (arr[mid]<k)
{
left = mid + 1;//要加1,因为k大于arr[mid],所以也排除掉他
}
else if (arr[mid]>k)
{
right = right - 1;//同上,不过要减去
}
else if (arr[mid] = k)
{
printf("找到了,索引是[%d]", mid);
break;
}
}
if (left>right)
{
printf("没有这个数");
}
return 0;
}
4.打印逐渐显现的文字
例如:
#####
w###!
we#t!
west!
int main()
{
char arr[] = "helloworld";
char arr2[] = "##########";
int left = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int right = sz - 1;
while (left <= right)
{
arr2[left] = arr[left];
arr2[right] = arr[right];
printf("%s\n", arr2);
left++;
right--;
}
return 0;
}
----Sleep 函数 system("cls")清空屏幕
#include <Windows.h>
Sleep(数字)休息几毫秒
S要大写
Sleep(1000);
system("cls");
5.模拟用户登录 两个字符串比较strcmp
两个字符串比较不能使用等号(字符串名字就是首字母地址,比较这个没意义)
strcmp(字符串1,字符串2)返回值为0证明相等
要引入头文件
#include <string.h>
int main()
{
char passwd[20] = { 0 };//密码
int i = 0;
for (i = 0; i <3; i++)
{
printf("请输入密码->");
scanf("%s", passwd);//密码
if (strcmp(passwd,"123456")==0)
{
printf("密码正确");
break;
}
else
{
printf("输入错误\n");
}
}
if (i==3)
{
printf("三次机会已经用光");
}
return 0;
}
6.猜数字
----随机数
#include <stdlib.h>
rand()返回一个随机数 0-32767 生成的随机数顺序固定
srand设置随机数 strand(中间输入输入数字后rand()生成固定的随机数)种子 中放一个随机值
时间戳随机 放时间戳(相较于计算机起始时间的差 秒数)
time(NULL)返回一个时间戳
不想输入参数
#include <time.h>
#include <stdlib.h>
void num()
{
srand((unsigned int)time(NULL));
int com_guess = rand() % 100 + 1;//题目要求0到99的数字 %100取余 余数一定小于100 0~99 加一就是0~100
printf("%d",com_guess);
int you_guess = 0;
while (1)
{
scanf("%d", &you_guess);
if (you_guess > com_guess)
{
printf("猜大了");
}
else if (you_guess < com_guess)
{
printf("猜小了");
}
else if (you_guess == com_guess)
{
system("cls");
printf("猜对了\n");
break;
}
}
}
int main()
{
int sel = 0;
do
{
printf("* * * * * * * * * * * * * * * *\n");
printf(" * * * * * 1.开始游戏 * * * * *\n");
printf(" * * * * * 2.退出游戏 * * * * *\n");
printf("* * * * * * * * * * * * * * * *\n");
printf("是否开始游戏->");
scanf("%d", &sel);
switch (sel)
{
case 1:
num();
break;
case 2:
printf("退出");
break;
default:
system("cls");
printf("只能输入1或2,请重新输入\n");
break;
}
} while (sel!=2);
return 0;
}
----强制类型转换
(int) a
三个整数从大到小输出*
输入 5 6 3
输出 6 5 3
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d", &a, &b, &c);
if (a<b)
{
int tmp = 0;
tmp = a;
a = b;
b = tmp;
}
if (a < c)
{
int tmp1 = 0;
tmp1 = a;
a = c;
c = tmp1;
}
if (b < c)
{
int tmp2 = 0;
tmp2 = b;
b = c;
c = tmp2;
}
printf("%d %d %d", a, b, c);
return 0;
}
注意这几个if是并列关系
两个数的最大公约数
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int min = 0;
if (a>b)
{
min = b;
}
else
{
min = a;
}
while (1)
{
if (a % min == 0 && b%min==0 )// ||是或 &&才是且
{
printf("最小公约数%d",min );
break;
}
min--;
}
return 0;
}
----辗转相除法
24 18
24%18=6(取余)
18%6=0(直到余数为0,除数就是最大公因数)
int main()
{
int m = 0;
int n = 0;
int t = 0;
scanf("%d %d", &m, &n);
while (m % n != 0)
{
t = m % n;
m = n;
n = t;
}
printf("最大公因数是%d", n);
return 0;
}
打印1000到2000的闰年
能被4整除 不能被100整除
能被400整除 是闰年
int main()
{
int year = 0;
for (year = 1000; year <= 2000; year++)
{
if (year%4==0&&year%100!=0)
{
printf("%d是闰年\n", year);
}
if (year % 400 == 0)
{
printf("%d是闰年\n", year);
}
}
return 0;
}
打印素数100~200
质数=素数 只能被1和其本身整除的数
int main()
{
int a = 0;
for (a = 100; a <= 200; a++)
{
int i = 0;
for (i = 2; i < a; i++)
{
if (a % i == 0)
{
break;
}
}
if (i == a)
{
printf("%d是素数\n", a);
}
}
return 0;
}
----sqrt()计算根
#include <math.h>
如果 a=m*n
那么m和n之间一定有一个<= a开根号
即: 在2~根号m之间,没有a的因数 就说明a没有2~a-1的因数
所以只用计算2~根号m之间的(优化代码)
#include <math.h>
int main()
{
int a = 0;
for (a = 100; a <= 200; a++)
{
int i = 0;
int flag = 1;
for (i = 2; i <= sqrt(a); i++)
{
if (a % i == 0)
{
flag = 0;
break;
}
}
if (flag==1)
{
printf("%d是素数\n", a);
}
}
return 0;
}
goto语句
理论上没有goto语句也可以写出代码
相当于传送
int main()
{
aaa:
printf("11111\n");
printf("22222\n");
goto aaa;//传送到aaa哪里
}
只要运行起来,电脑就会在1分钟内关机,如果输入:我是猪,就取消关机
跳出多重循环方便
goto只能在一个函数范围内,不能跨函数
dos(cmd)
shutdown -s -t 60 60秒后关机
shutdown -a 取消关机
#include <string.h>
#include <stdlib.h>
int main()
{
char arr[20] = { 0 };
printf("输入我是猪,否则电脑100秒关机->");
system("shutdown -s -t 100");
flag: scanf("%s", arr);
if (strcmp("我是猪", arr) == 0)
{
system("shutdown -a");
}
else
{
printf("请重新输入->");
goto flag;
}
return 0;
}
----可发行
debug改为release
多了个release
里面的是可发行版本(可发到别人的电脑上执行)