一、笔记梳理
ps:局部变量和全局变量可以重名;作用域遵循就近原则
#include<stdio.h>
int a=10;//全局变量
void fun();
int main(int argc, char const *argv[])
{
int a=8;
fun();//全局变量
printf("%d\n",a);//局部变量
return 0;
}
void fun()
{
printf("a:%d\n",a);//全局变量
}
tip:引用其他函数时,该函数在执行时会使用全局变量而非局部变量
1. 输入输出
1.1按字符输入输出
tip:在linux环境下可通过终端使用man命令查看函数手册,了解函数相关信息及其使用方法。
1.1.1getchar()函数
C标准库 | <stdio.h> |
声 明 | int getchar(void) |
功 能 | 向终端输入一个字符 |
参 数 | NA |
返 回 值 | 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,即返回向终端输入的字符的ASCII值 |
1.1.2putchar()函数
C标准库 | <stdio.h> |
声 明 | int puttchar(int c) |
功 能 | 从终端输出一个字符 |
参 数 | 将输出字符的ASCII值传递 |
返 回 值 | 返回字符的ASCII值 |
ps:putchar()无法在函数内部通过"\n"换行
1.2按格式输入输出
1.2.1printf()函数
C标准库 | <stdio.h> |
声 明 | int printf(const char *format, ...) |
功 能 |
按指定的格式向终端输出值
|
参 数 | 多个字符串(数、数组) |
返 回 值 | 正确输出的字符个数 |
%d | int | |
%c | char | |
%f | float | |
%lf | double | |
%s | 字符串 | |
%p | 指针 | |
%o | 八进制 | %#o |
%x | 十六进制 | %#x |
1.2.2scanf()函数
C标准库 | <stdio.h> |
声 明 |
int scanf(const char *format, ...)
|
功 能 |
按指定的格式向终端输入值(以回车键结束输入)
|
参 数 | 多个字符串(数、数组) |
返 回 值 | 正确输出的字符个数,若第一个字符输入错误,则直接返回0 |
%d | int | |
%c | char | |
%f | float | |
%lf | double | |
%s | 字符串 | |
%p | 指针 | |
%o | 八进制 | %#o |
%x | 十六进制 | %#x |
ps:scanf格式必须和终端输入格式一一对应,不能加'\n' ,变量名前边加&(取地址符),表示取变量的地址
例:
printf("请输入一个日期:年 月 日\n");
scanf("%d-%d-%d",&y, &m, &d);
代码中各字符以'-'号隔开,在终端输入时也须用'-'隔开
2.垃圾字符回收
2.1通过空格回收
只需要在使用scanf()函数时,控制格式的%c等字符前加上空格,即可实现垃圾字符的回收
该方法可回收一个或多个空格、Tab、回车
2.2通过%*c回收
只需要在使用scanf()函数时,控制格式的%c等字符前加上%*c,即可实现垃圾字符的回收
该方法可回收任意一个字符
2.3通过getchar()函数回收
因为scanf()函数在输入结束时,会在终端输入'\n',在scanf()函数后使用getchar()函数可消除
'\n'对程序造成的影响:
#include<stdio.h>
int main(int argc, char const *argv[])
{
char en = 0;
printf("请输入一个字母:\n");
scanf("%c",&en);
getchar();
while ((en < 'A' || en > 'Z') && (en < 'a' || en > 'z'))
{
printf("字母输入错误,请重新输入:\n");
scanf("%c",&en);
getchar();
}
if(en >= 'A' && en <= 'Z')
{
printf("这是一个大写字母,他的小写字母是:%c\n",(en+32));
}
else if(en >= 'a' && en <= 'z')
{
printf("这是一个小写字母,他的大写字母是:%c\n",(en-32));
}
return 0;
}
3.分支语句
3.1if分支语句
基本结构:
if(常量值或表达式)
{
//代码块;
}
=====================
if(常量值或表达式)
{
//代码块1;
}
else
{
//代码块2;
}
=====================
if(常量值或表达式)
{
//代码块1;
}
else if
{
//代码块2;
}
else
{
//代码块3;
}
代码示例
#include<stdio.h>
int main(int argc, char const *argv[])
{
int num = 0;
printf("请输入您的成绩:\n");
scanf("%d",&num);
if(num >= 0 && num <= 100)
{
if(num >= 90 && num <= 100)
{
printf("您的成绩等级为:A\n");
}
else if(num >= 80 && num <= 89)
{
printf("您的成绩等级为:B\n");
}
else if(num >= 70 && num <= 79)
{
printf("您的成绩等级为:C\n");
}
else
{
printf("你需要补考!\n");
}
}
else
{
printf("成绩输入错误!");
}
return 0;
}
3.2switch分支语句
基本结构:
switch(常量值或表达式)
{
case 常量值1:
代码块1;
break;
case 常量值2:
代码块2;
break;
default:
代码块n;
break;
}
代码示例:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int num = 0;
printf("请输入您的成绩:\n");
scanf("%d",&num);
if(num > 100 || num < 0)
printf("成绩输入错误!\n");
else
{
switch (num / 10)
{
case 10:
case 9:
printf("您的成绩等级为:A\n");
break;
case 8:
printf("您的成绩等级为:B\n");
break;
case 7:
printf("您的成绩等级为:C\n");
break;
default:
printf("你需要补考!:\n");
break;
}
}
return 0;
}
ps:
- case后边的常量值是整型或字符型,不能是浮点型或字符串
- case分支遇到break结束; 后边可以没有break,会从符合条件的分支开始一直运行到整个switch语句执行完才结束
二、终端输入一个日期,判断是这一年的第几天
#include<stdio.h>
int main(int argc, char const *argv[])
{
int y=0, m=0, d=0, d2=0;
printf("请输入一个日期:年 月 日\n");
scanf("%d %d %d",&y, &m, &d);
if(m>2)
{
if(y%400==0||(y%4==0&&y%100!=0)) d2+=29;
else d2+=28;
}
while (m--)
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12) d2+=31;
else if(m==4||m==6||m==9||m==11) d2+=30;
}
printf("这个日期是今年的第%d天\n",d2+d);
return 0;
}
运行效果: