一、常量 什么是常量: 程序在运行期间数值不能变化的叫常量 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
三、运算符 自变运算符:++/-- 使变量的值自动的+1/-1 前自变:++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 = a + b
a -= b <-> a = a - b
a *= b <-> ...
a /= b
...
位运算符: & | ~ << >>
sizeof 也是运算符,但是sizeof括号内的表达式不会计算
四、类型转换 自动类型转换: 只有相同类型的数据才能运算,不同类型的数据必须转换成相同的类型才能进行计算 转换规则:(以不丢失数据为基础,适当地牺牲一些空间) 1.字节少的向字节多的转 2.有符号的向无符号的转 3.整型向浮点型转 强制类型转换: (新类型)数据 有丢失数据的风险,要慎重使用
五、分支语句 if(表达式) //单分支 { 当表达式为真时,执行此处代码 }
if(表达式) //双分支
{
当表达式为真时,执行此处代码
}
else
{
当表达式为假时,执行此处代码
}
if(表达式1) //多分支
{
当表达式1为真时,执行此处代码
}
else if(表达式2)
{
当表达式2为真时,执行此处代码
}
else
{
当表达式都为假时,最后执行此处代码
}
注意:大括号建议上下对齐
当分支语句只有一条时,大括号可以省略但不建议省略
练习1:输入三个整数,从大到小输出。
(1) #include <stdio.h>
int main(int arhc,const char* argv[]) { int num1 = 0;int num2 = 0;int num3 = 0;int temp = 0; printf(“请输入三个正整数(a b c):”); scanf("%d %d %d",&num1,&num2,&num3); if(num1 <= num2) { temp = num1; num1 = num2; num2 = temp; } if(num1 <= num3) { temp = num1; num1 = num3; num3 = temp; } if(num2 <= num3) { temp = num2; num2 = num3; num3 = temp; } printf(“从大到小依次是:%d %d %d\n”,num1,num2,num3); } (2) #include <stdio.h>
int main(int arhc,const char* argv[]) { int a = 0;int b = 0;int c = 0;int t = 0; printf(“请输入三个正整数(a b c):”); scanf("%d %d %d",&a,&b,&c);
if(a > b)
{
if(b > c)
{
printf("%d %d %d\n",a,b,c);
}
else if(a > c)
{
printf("%d %d %d\n",a,c,b);
}
else
{
printf("%d %d %d\n",c,a,b);
}
}
else
{
if(a > c)
{
printf("%d %d %d\n",b,a,c);
}
else if(b > c)
{
printf("%d %d %d\n",b,c,a);
}
else
{
printf("%d %d %d\n",c,b,a);
}
}
} 练习2:输入一个年份,判断是闰年还是平年? 四闰百不闰,四百闰 //练习2:输入一个年份,判断是闰年还是平年?
#include <stdio.h>
int main(int arhc,const char* argv[]) { int year = 0; printf(“请输入一个年份:”); scanf("%d",&year); if(0 == year%4 && 0 != year%100 || 0 == year%400) { printf("%d是闰年。",year); } else { printf("%d是平年。",year);
}
} 练习3:输入一个年份和月份,判断该月有多少天? //练习3:输入一个年份和月份,判断该月有多少天?
#include <stdio.h>
int main(int arhc,const char* argv[]) { int year = 0;int month = 0; int day1[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; int day2[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; printf(“请输入年份 月份:”); scanf("%d %d",&year,&month); if(0 == year%400) { printf("%d年%d月有%d天\n",year,month,day1[month-1]); } else if(0 == year%100) { printf("%d年%d月有%d天\n",year,month,day2[month-1]); } else if(0 == year%4) { printf("%d年%d月有%d天\n",year,month,day1[month-1]); } else { printf("%d年%d月有%d天\n",year,month,day2[month-1]); } return 0; } 练习4:输入一个三位整数,判断是否是水仙花数? abc == aaa +bbb + ccc //练习4:输入一个三位整数,判断是否是水仙花数?
#include <stdio.h>
int main(int arhc,const char* argv[]) { int i = 0;int a = 0;int b = 0;int c = 0; printf(“请输入一个三位整数:”); scanf("%d",&i); c = i/100; b = (i/10)%10; a = i%10; if(aaa+bbb+ccc == i) { printf("%d是一个水仙花数\n",i); } else { printf("%d不是一个水仙花数\n",i); } return 0; } 练习5:输入一个成绩,判断等级? [100,90] A ;(90,80] B ;(80,70] C ;(70,60] D ;(60,0] E; outer 输入程序有误 //练习5:输入一个成绩,判断等级? //[100,90] A ;(90,80] B ;(80,70] C ;(70,60] D ;(60,0] E;
#include <stdio.h>
int main(int arhc,const char* argv[]) { float grade = 0; printf(“请输入一个成绩:”); scanf("%f",&grade); if(grade >= 0 && grade < 60) { printf(“成绩为E等\n”); } else if(grade >= 60 && grade < 70) { printf(“成绩为D等\n”); } else if(grade >= 70 && grade < 80) { printf(“成绩为C等\n”); } else if(grade >= 80 && grade < 90) { printf(“成绩为B等\n”); } else if(grade >= 90 && grade <=100) { printf(“成绩为A等\n”); } else { printf(“输入程序有误!\n”); } } 六、开关语句 Switch(n) //n可以使数值、表达式,运算结果必须是整数 { case val: //val必须是整数常量,如果val等于n,则打开执行开关 … break; //关闭执行开关 case val: … default: … //如果所有的case都没有匹配成功,则打开执行开关,并放在任何位置都会最后执行 } 注意:如果每个case后都有break,就形成了分支结构。 Switch不能与continue配合使用
注意:
case a ... b:可以表示范围a~b,但是属于GNU编译器独有的语法,不建议使用
练习6:输入一个月份,判断季节:
123 春天;456 夏天;789 秋天;10 11 12 冬天
#include <stdio.h>
int main(int arhc,const char* argv[]) { char month = 0; printf(“输入一个月份:”); scanf("%hhd",&month); switch((month+2)/3) { case 1:printf(“春天\n”);break; case 2:printf(“夏天\n”);break; case 3:printf(“秋天\n”);break; case 4:printf(“冬天\n”);break; default :printf(“输入月份有误\n”);break; } return 0; } 七、循环语句 循环就是让一段代码反复执行,达到想要的效果 1. for 循环语句 for是一种比较灵活且较危险(与其他循环相比)的一种循环 一般用一个变量来引导for循环的运行,这个变量叫做循环变量 i(index) for([1];[2];[3]) { [4]; } []中可有可无。 1.为循环变量赋初值,只有c99的标准才可以在此处定义循环变量 2.判断循环条件,一般是判断循环变量是否到达了边界 4.如果2为真,则执行此处代码,此处也叫循环体 3.改变循环变量,防止出现死循环,一般对循环变量自加或自减 12432432…
for 循环的多种写法:
for(;;)
{
//死循环
}ll
int i = 0;
for(; i < 10; i++)
{
}
for(int i = 0; i < 10;)
{
...
i++;
}
2. while 循环:
while(条件) //当条件为真时,执行循环体,为假时结束循环体
{
//循环体
}
while循环相当于for循环的精简版本
for循环负责解决明确循环知道循环次数的问题
while循环负责解决只知道结束条件,而不确定循环次数的问题
3. do while 循环:
do{
//循环体
}while(条件); //分号不能少
先执行循环体,才判断循环条件是否为真,该循环至少循环一次
适合先干活,再检查的特殊情况
例如:输入判断密码
问题:for、while、do-while 有什么区别?
(个人总结)
4.循环嵌套
循环语句中包含循环语句
外层循环执行一次,内层循环执行n次
作业1:计算出所有的水仙花数
作业2:输入一个正整数,判断是否为素数?2 3 5
作业3:输入一个正整数,判断是否为回文数 12321 123321
作业4:输入一个6位密码,输入正确显示"登录成功",输入错误提示"还剩几次机会",可以继续输入,最多输入3次,超过3次,显示"账号已锁定",并结束。
作业5:输入一个整数,分解显示 1234 1 2 3 4
|