前言
对上一步部分的补充
提示:以下是本篇文章正文内容,下面的代码可供参考
一、 常量
什么是常量:程序运行期间数值不能变化的叫常量
100 默认int
100u unsigned int
100lu unsigned long
100llu unsigned long long
100l long
100ll long long
3.14 默认double
3.14f float
3.14l long double
问题:100年有多少秒,忽略润平年问题?
#define sec (3600*24*365*100u)
二、格式化输入输出
%nd 显示n个字符宽度,不够则补空格,右对齐
%-nd 显示n个字符宽度,不够则补空格,左对齐
%0nd 显示n个字符宽度,不够则补0,右对齐
%n.mf 显示n个字符宽度(小数点也算一位),不够则补空格,m是小数点后的位数(四舍五入)
%g 不显示小数点后多余的0
三、运算符
自变运算符:++/-- 使变量的值自动的加一或者减一
前自变:++num --num 立即有效
后自变:num++ num-- 下一行语句生效
注意:不要在同一行内多次使用自变运算符
算术运算符:+ - * / %
整数/整数 结果没有小数点(不四舍五入)
/% 除数不能为0 浮点数例外(核心已转储)
关系运算符 > < >= <= == !=
比较的结果必须是0或者1,比较的结果还能继续参与运算
int num=-5;
if(1<num<10)
永远为真,运算规则与数学不一样
逻辑运算符 && || !
会先把运算对象转换成逻辑值,0转换为假,非0转换为真
A && B 一假即假
A || B 一真即真
!A 求反
&& || 具有短路特性:当左边的运算对象已经能够确定整个表达式的结果时,右边的所有运算对象不再计算。
三目运算符 运算对象有三个部分
A?B:C
判读A的值是否为真,如果为真执行B,负责执行C
改语句不能使用流程控制语句,因为它必须要有运算结果
赋值运算符 = += -=
a+=b;
a-=b
a*=b
a/=b
a%=b ...
位运算符 & | ~ >> <<
sizeof 也是运算符,但是sizeof括号内的表达式不会计算
类型转换
自动类型转换:
只有相同类型的数据才能运算,不同的类型的数据必须转换成相同的类型才能进行计算
转换规则:以不丢失数据为基础,适当地牺牲一些空间
1、字节少的向字节多的转
2、有符号的向无符号的转
3、整型向浮点型转
强制类型转换:
(新类型)数据
有丢失数据的风险,要谨慎使用
四、分支语句
分支语句
if(表达式)//单分支
{
表达式为真时,执行此代码
}
if(表达式)//双分支
{
表达式为真时,执行此代码
}
else
{
表达式为假时,执行此代码
}
if(表达式1)//多分支
{
表达式1为真时,执行此代码
}
else if(表达式2)
{
表达式2为真时,执行此代码
}
else if(表达式3)
{
表达式1为真时,执行此代码
}
else
{
表达式都为假时,执行此代码
}
练习1:输入三个数,排序从大到小;
#include <stdio.h>
int main(int argc,const char* argv[])
{
int a,b,c;
int temp;
printf("请输入三个数值,空格隔开\n");
scanf("%d %d %d",&a,&b,&c);
if(a<b)
{
temp=a;
a=b;
b=temp;
}
if(a<c)
{
temp=a;
a=c;
c=temp;
}
if(b<c)
{
temp=b;
b=c;
c=temp;
}
printf("排序从大到小为:%d %d %d",a,b,c);
}
练习2:输入一个年份,判断是否为闰年;
1 #include <stdio.h>
2
3 int main(int argc,const char* argv[])
4 {
5 printf("输入一个年份:\n");
6 int a;
7 scanf("%d",&a);
8 if((a%4==0&&a%100!=0)||a%400==0)
9 printf("此年份是闰年");
10 else
11 printf("此年份不是闰年");
12 }
练习3:输入一个年份和一个月份,判断该月有多少天
1 #include <stdio.h>
2
3 int main(int argc,const char* argv[])
4 {
5 printf("请输入一个年份和月份,空格隔开:\n");
6 int a,b;
7 scanf("%d %d",&a,&b);
8 int time=((a%4==0&&a%100!=0)||a%400==0);
9 if(b>12 ||b<1)
10 {
11 printf("输入月份无效");
12 }
13 else if(b==2)
14 {
15 printf("%d年%d月有%d天",a,b,28+time);
16 }
17 else if(b==2||b==4||b==6||b==9||b==11)
18 {
19 printf("%d年%d月有30天",a,b);
20 }
21 else
22 printf("%d年%d月有31天",a,b);
23 }
练习4:输入一个三位数,判断是否为水仙花数;
1 #include <stdio.h>
2
3 int main(int argc,const char* argv[])
4 {
5 printf("请输入一个三位数:\n");
6 int a;
7 int b,s,g;
8 scanf("%d",&a);
9 b=a/100;
10 s=(a%100)/10;
11 g=(a%10);
12 if(a==(b*b*b+s*s*s+g*g*g))
13 printf("该数字是水仙花数");
14 else
15 printf("该数字不是水仙花数");
16
17 }
练习5:输入一个成绩,为其划分等级。
1 #include <stdio.h>
2
3 int main(int argc,const char* argv[])
4 {
5 printf("请输入一个成绩:\n");
6 int a;
7 scanf("%d",&a);
8 if(a>=90&&a<=100)
9 printf("此成绩为A");
10 else if(a>=80&&a<90)
11 printf("此成绩为B");
12 else if(a>=70&&a<80)
13 printf("此成绩为C");
14 else if(a>=60&&a<70)
15 printf("此成绩为D");
16 else if(a>=0&&a<60)
17 printf("此成绩为E");
18 else
19 printf("输入的成绩不符合要求");
20 }
五、开关语句
switch(n)//n可以是数值、表达式,运算结果必须是整数
{
case val://val 必须是常量,如果val=n则打开执行开关
break;//关闭执行开关
case val:
break;
default://如果所有的case都没有匹配成功,则打开执行开关,并且放在任何位置都会最后执行
break;
}
注意:如果每个case后都有break,就形成了分支结构
switch 不能与continue配合使用
case n ... m:表示一个范围n~m,只有在gnu编译器下有用,最好别用。
六、循环语句
for循环语句:
for循环是一种比较灵活且比较危险(与其他循环相比)的一种循环
一般用一个变量来引导for循环的运行,这个变量叫做循环变量
for([1];[2];[3])
{
[4];
}
1、给循环变量赋初值,C99标准才可以在此处定义循环变量
2、判断循环条件,一般是判断循环变量是否到达边界
4、条件2为真,则执行此处代码,也叫循环体
3、改变循环变量,防止出现死循环,一般对循环变量自加或者自减
for循环的多种写法:
for(;;)
{
//死循环
}
int i=0;
for(;i<10;i++)
{
}
for (int i = 0; i < count;)
{
...
i++;
}
while 循环
while (条件)//为真时执行循环体,为假时结束循环。
{
//循环体
}
while循环相当于for循环的精简版本
for循环负责解决明确知道循环次数的问题
while负责解决只知道循环条件,而不确定循环次数的问题
do while
do
{
//循环体
} while (/条件/);//先执行循环体,再判断循环条件,该循环至少执行一次
适合先干活,在检查的特殊情况,例如:输入判断密码
问题:for、while、do-while 有什么区别
循环嵌套:
循环语句中包含循环语句
外层循环执行一次,内层循环执行n次
作业1:计算出所有的水仙花数
1 #include <stdio.h>
2
3 int main(int argc,const char* argv[])
4 {
5 for(int i=100;i<1000;i++)
6 {
7 int g,s,b;
8 b=i/100;
9 s=i%100/10;
10 g=i%10;
11 if(i==b*b*b+s*s*s+g*g*g)
12 printf("水仙花数有:%d\n",i);
13 }
14 }
作业2:输入一个正整数,判断是否是素数
1 #include <stdio.h>
2
3 int main(int argc,const char* argv[])
4 {
5 printf("输入一个正整数:");
6 int a,b=0;
7 scanf("%d",&a);
8 for(int i=1;i<=a;i++)
9 {
10 if(a%i==0)
11 b++;
12 }
13 if(b==2)
14 printf("%d是素数",a);
15 else
16 printf("%d不是素数",a);
17 }
作业3:输入一个正整数,判断是否为回文数 123321 12321
1 #include <stdio.h>
2 #include <math.h>
3 int main(int argc,const char* argv[])
4 {
5 printf("输入一个正整数:");
6 int a,con=0;
7 int b=0,c=0,d=0;
8 scanf("%d",&a);
9 d=a;
10 c=a;
11 while(a)
12 {
13 con++;
14 a/=10;
15 }
16 int i;
17 for(i=con;i>0;i--)
18 {
19 if((c/(int)pow(10,i-1))==(d%10))
20 {
21 c%=(int)pow(10,i-1);
22 d/=10;
23 b++;
24 }
25 }
26 if(b==con)
27 {
28 printf("是回文数\n");
29 }
30 else
31 printf("不是回文数\n");
32 }
作业4:输入一个六位密码,输入正确的话,显示登录成功。输入错误,提示还剩几次机会,可以继续输入,最多可以输错三次,否则显示账号已锁定,并结束。
1 #include <stdio.h>
2
3 int main(int argc,const char* argv[])
4 {
5 printf("请输入六位密码");
6 int a,n=4;
7 int b=123456;
8 do
9 {
10 scanf("%d",&a);
11 if(a==b)
12 {
13 printf("登陆成功\n");
14 return 0;
15 }
16 else
17 {
18 n--;
19 if(n==0)
20 {
21 printf("次数已用完,帐号已锁定\n");
22 return 0;
23 }
24 printf("密码错误,请重新输入,还剩%d次机会",n);
25 }
26 }while(1);
27 }
作业5:输入一个整数,分解显示 -1234 - 1 2 3 4
1 #include <stdio.h>
2 #include <math.h>
3 int main(int argc,const char* argv[])
4 {
5 printf("输入一个整数:");
6 int a,con=0,b;
7 scanf("%d",&a);
8 b=a;
9 if(a<0)
10 {
11 a=-a;
12 b=-b;
13 printf("- ");
14 }
15 while(a)
16 {
17 con++;
18 a/=10;
19 }
20 int i;
21 for(i=con;i>0;i--)
22 {
23 printf("%d ",b/(int)pow(10,i-1));
24 b%=(int)pow(10,i-1);
25 }
26 printf("\n");
27 }
总结
上面的代码仅供参考,也不一定是最精简的,一些变量名命名比较随意,望大家不要模仿。