day04
局部变量和全局变量示例:
局部变量和全局变量可以重名;作用域遵循就近原则
#include <stdio.h>
int a=10;
void fun();
int main(int argc, char const * argv[])
{
int a=8;
fun(); //10
printf("%d\n",a); //8
return 0;
}
void fun(){
printf("a:%d\n",a); //10
}
[1]输入输出
1.1按字符输入输出
getchar
手册查看命令:man getchar //q退出
#include <stdio.h>
int getchar(void);
功能:向终端输入一个字符
参数:无
返回值:终端输入的字符的ASCII码值
示例:
#include <stdio.h>
int main(int argc,const char *argv[])
{
int res=getchar(); //输入一个字符
printf("%d\n",res); //输出对应的ASCII码值
return 0;
}
putchar
手册查看命令:man putchar //q退出
#include <stdio.h>
int putchar(int c);
功能:终端输出一个字符
参数:字符的ASCII码值
返回值:字符的ASCII码值
putchar 没有换行的效果,需要额外添加
示例:
#include <stdio.h>
int main(int argc, char const * argv[])
{
int res=getchar();
putchar(res);
int num=putchar(10); //或printf('\n');
printf("%d",num);
return 0;
}
1.2按格式输入输出
printf
#include <stdio.h>
int printf(const char *format, ...); //...代表可以添加多个
功能:按指定的格式向终端输出
参数:多个
返回值:正确输出字符个数
8种输出格式:
%d int
%c char
%f float
%lf double
%s 字符串
%p 指针
%o 八进制 %#o
%x 十六进制 %#x
示例:
#include <stdio.h>
int main(int argc, char const * argv[])
{
printf("hello\n");
int a=0x123;
printf("%#x\n",a);
int b=456;
printf("a:%d b:%d\n",a,b);
return 0;
}
scanf
#include <stdio.h>
int scanf(const char *format, ...);
功能:按指定的格式向终端输入
参数:多个
返回值:正确输入的字符个数
第一个字符输入格式错误,直接返回0
scanf格式必须和终端输入格式一一对应,不能加'\n'
变量名前边加&(取地址符),表示取变量的地址
示例:
#include <stdio.h>
int main(int argc, char const * argv[])
{
int a=0;
scanf("%d",&a); //输入99
printf("%d\n",a); //输出99
return 0;
}
#include <stdio.h>
int main(int argc, char const * argv[])
{
int a=0,b=0;
scanf("%d %d",&a,&b); //输入 12 3
printf("a:%d b:%d\n",a,b); //输出 a:12 b:3
return 0;
}
#include <stdio.h>
int main(int argc, char const * argv[])
{
char c=0,d=0;
scanf("%c%c",&c,&d); //输入 q w 或 qw
printf("c:%c d:%c\n",c,d); //输出 c:q d:' ' 或 c:q d:w
return 0;
}
[2]垃圾字符回收
2.1 通过空格回收
可以回收一个或多个空格 tab 回车
#include <stdio.h>
int main(int argc, char const * argv[])
{
char c=0,d=0;
scanf("%c %c",&c,&d); //输入 q w 或 qw
printf("c:%c d:%c\n",c,d); //输出 c:q d:w
return 0;
}
#include <stdio.h>
int main(int argc, char const * argv[])
{
char c=0,d=0;
scanf("%c %c",&c,&d); //输入 q w 或 q w
printf("c:%c d:%c\n",c,d); //输出 c:q d:w
return 0;
}
2.2 %*c *抑制符 (了解)
可以回收任意一个字符
#include <stdio.h>
int main(int argc, char const * argv[])
{
char c=0,d=0;
scanf("%c%*c%c",&c,&d); //输入 w q或 qwe
printf("c:%c d:%c\n",c,d); //输出 c:w d:q 或 c:q d:e
}
2.3 getchar
scanf输入结束时,会在终端输入'\n';
解决'\n'对程序造成的影响:
#include <stdio.h>
int main(int argc, char const * argv[])
{
while(1){
char a;
scanf("%c",&a);
printf("%c\n",a);
getchar();
}
}
[3]分支语句
顺序结构:
分支结构:
循环结构:
if
单分支基本结构:
if(常量值或表达式)
{
//代码块;
}
示例:
#include <stdio.h>
int main(int argc, char const * argv[])
{
int age=20;
if(age>18)
{
printf("work\n");
}
}
双分支基本结构:
if(常量值或表达式)
{
//代码块1;
}
else
{
//代码块2;
}
示例:
#include <stdio.h>
int main(int argc, char const * argv[])
{
int age=10;
if(age>18)
{
printf("work\n");
}
else
{
printf("study\n");
}
}
多层分支基本结构:
if(表达式1)
{
代码段1;
}
else if(表达式2)
{
}
else
{
}
示例:
#include <stdio.h>
int main(int argc, char const * argv[])
{
int age=70;
if(age>18 && age<60)
{
printf("工作\n");
}
else if(age>60)
{
printf("退休\n");
}
else
{
printf("学习\n");
}
}
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)
终端输入一个年份,判断平年或闰年:
#include <stdio.h>
int main(int argc, char const * argv[])
{
int a=0;
scanf("%d",&a);
if(a%4==0 && a%100 !=0 || a%400==0)
{
printf("%d年是闰年\n",a);
}
else
{
printf("%d年是平年\n",a);
}
}
终端输入大写,输出小写
终端输入小写,输出大写
输入其他,打印"error"
#include <stdio.h>
int main(int argc, char const * argv[])
{
char a=0;
scanf("%c",&a);
if(a>='A' && a<='Z')
{
printf("%c\n",a+32);
}
else if(a>='a' && a<='z')
{
printf("%c\n",a-32);
}
else
{
printf("error\n");
}
return 0;
}
输入输出结果:
嵌套结构:
if(表达式1)
{
if(表达式2)
{
}
}
示例:
100-90: A
89-80: B
79-70: C
<70: 补考
#include <stdio.h>
int main(int argc, char const * argv[])
{
int s=0;
scanf("%d",&s);
if(s>=0&&s<=100)
{
if(s>=90){
printf("A\n");
}
else if(s>=80){
printf("B\n");
}
else if(s>=70){
printf("C\n");
}
else{
printf("补考\n");
}
}
else
{
printf("error\n");
}
}
注意:
1. if后边可以没有else, else前边必须有if
2. 分支语句代码块只有一句时,可以省略{ }
switch
switch基本结构:
switch(常量值或表达式)
{
case 常量值1:
代码块1;
break;
case 常量值2:
代码块2;
break;
default:
代码块n;
break;
}
示例:
#include <stdio.h>
int main(int argc, char const * argv[])
{
int a=4;
switch (a)
{
case 1:
printf("aaaa\n");
break;
case 4:
printf("bbb\n");
break;
case 5:
printf("ccc\n");
break;
default:
break;
}
}
运行结果:
100-90: A
89-80: B
79-70: C
<70: 补考
#include <stdio.h>
int main(int argc, char const * argv[])
{
int a=0,b=0;
scanf("%d",&a);
if(a>100 || a<0){
printf("error\n");
return 0;
}
b=a/10;
switch(b)
{
case 10:
printf("A\n");
break;
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
default:
printf("补考\n");
break;
}
return 0;
}
注意:
1. case后边的常量值是整型或字符型,不能是浮点型或字符串
2. case分支遇到break结束; 后边可以没有break,会从符合条件的分支开始一直运行到整个switch语句执行完才结束
#include <stdio.h>
int main(int argc, char const * argv[])
{
int a=4;
switch (a)
{
case 1:
printf("aaaa\n");
case 4:
printf("bbb\n");
case 5:
printf("ccc\n");
default:
break;
}
}
运行结果:
作业:
1. 梳理笔记(原创)
2. 终端输入一个日期,判断是这一年的第几天
scanf("%d-%d-%d",&y,&m,&d);
闰年2月29天,平年2月28天
#include <stdio.h>
int djt(int y, int m, int d);
int main() {
int y, m, d;
printf("请输入日期:");
scanf("%d-%d-%d",&y,&m,&d);
// 计算并输出结果
printf("%d年%d月%d日是这一年的第%d天。\n", y, m, d, djt(y, m, d));
return 0;
}
// 计算一年中的第几天
int djt(int y, int m, int d) {
int ytsh[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int i, djt = 0;
// 如果是闰年,2月有29天
if ( (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
ytsh[2] = 29;
}
// 累加到目标月份之前的所有月份的天数
for (i = 1; i < m; i++) {
djt += ytsh[i];
}
// 加上目标日期的天数
djt += d;
return djt;
}
运行结果:
设置——控制拆行方式 off 改为 on