局部变量和全局变量可以重名;作用域遵循就近原则
#include<stdio.h> // 引入标准输入输出库
int a=10; // 全局变量a,初始值为10
void fun(); // 函数声明,fun函数没有参数,返回类型为void
int main(int argc, char const *argv[]) // 主函数,程序的入口点
{
int a=8; // 局部变量a,覆盖全局变量a,初始值为8
fun(); // 调用fun函数
printf("%d",a); // 打印局部变量a的值,输出8
return 0; // 主函数返回0,表示程序正常结束
}
void fun() // fun函数的定义
{
printf("a:%d",a); // 打印全局变量a的值,输出10
}
[1]输入输出
1.1按字符输入输出
getchar 读取字符
man手册查看getchar:
#include <stdio.h> //来自标准库stdio.h
int getchar(void);
功能:向终端输入一个字符
参数:无
返回值:终端输入的字符的ASCII码值
使用示例:
#include <stdio.h>
int main() {
int res=getchar();
printf("%d\n",res);
return 0;
}
putchar 输出字符
#include <stdio.h> //来自标准库stdio.h
int putchar(int c);
功能:终端输出一个字符
参数:字符的ASCII码值
返回值:字符的ASCII码值
使用示例:
#include <stdio.h>
int main() {
int res=getchar();
putchar(res);
int num=putchar('\n');或者putchar(10);
//putchar()
函数的参数是一个整数,表示要输出的字符的ASCII码值
//应该使用单引号来表示一个字符常量,而不是双引号
//'\n'和10表示换行
printf("%d\n",num);//输出
}
1.2按格式输入输出
printf
#include <stdio.h>
int printf(const char *format, ...);
功能:按指定的格式向终端输出
参数:多个
返回值:正确输出字符个数
格式:
%d int
%c char
%f float
%lf double
%s 字符串
%p 指针
%o 八进制 %#o
%x 十六进制 %#x
使用示例:
#include <stdio.h> // 引入标准输入输出库
int main()
{
int a = 0x123; // 定义整型变量a并赋值为十六进制数0x123(十进制数291)
printf("%#x", a); // 以带前缀的十六进制形式输出变量a的值
printf("hello"); // 输出字符串"hello"和一个换行符
int a = 0x123; // 再次定义整型变量a并赋值为十六进制数0x123(十进制数291)
printf("%#x", a); // 再次以带前缀的十六进制形式输出变量a的值
int b = 456; // 定义整型变量b并赋值为十进制数456
printf("a:%d b:%d", a, b); // 输出变量a和b的值,分别用%d格式化为十进制整数
return 0; // 程序正常结束,返回0
}
scanf 输入多个字符时可用空格键隔开或者enter键换行
#include <stdio.h>
int scanf(const char *format, ...);
功能:按指定的格式向终端输入 (输入)
参数:多个
返回值:正确输入的字符个数
第一个字符输入格式错误,直接返回0
scanf不能加'\n'
int a=0;
scanf("%d",&a);
printf("a:%d\n",a);
=====================
int a=0,b=0;
scanf("%d %d",&a,&b);
printf("a:%d b:%d\n",a,b);
[2]垃圾字符回收
2.1 通过空格回收
可以回收一个或多个空格 tab 回车
char c=0,d=0;
scanf("%c %c",&c,&d);
printf("c:%c d:%d\n",&c,&d);
2.2 %*c *抑制符 (了解)
可以回收任意一个字符
char c=0,d=0;
scanf("%c%*c%c",&c,&d);
printf("c:%c d:%c\n",c,d);
2.3 getchar
while(1)
{
char a;
scanf(‘%c’,&a);
printf("%c\n",a);
getchar();
}
[2]分支语句
顺序结构:程序按照代码的顺序逐行执行,从上到下依次执行。
分支结构:根据条件判断,选择不同的执行路径。常见的分支结构有if语句、switch语句等。
循环结构:重复执行一段代码,直到满足特定条件才停止。常见的循环结构有for循环、while循环和do-while循环。
if
基本结构:
if(常量值或表达式)
{
//代码块;
}
=====================
int age=10;
if(age>18)
{
printf("work\n");
}
========================
if(常量值或表达式)
{
//代码块1;
}
else
{
//代码块2;
}
===========================
int age=10;
if(age>18)
{
printf("work\n");
}
else
{
printf("study\n");
}
多层分支
if(表达式1)
{
代码段1;
}
else if(表达式2)
{
}
else
{
}
===========================
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)
终端输入一个年份,判断平年或闰年:
#include <stdio.h>
int main() {
int year=0;
printf("请输入一个年份:");
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
printf("%d是闰年。\n", year);
} else {
printf("%d是平年。\n", year);
}
return 0;
}
终端输入大写,输出小写
终端输入小写,输出大写
输入其他,打印"error"
#include <stdio.h>
int main() {
char input;
printf("请输入一个字符:");
scanf("%c", &input);
if (input >= 'A' && input <= 'Z') {
printf("输出小写字母:%c\n", input + ('a' - 'A'));
} else if (input >= 'a' && input <= 'z') {
printf("输出大写字母:%c\n", input - ('a' - 'A'));
} else {
printf("error\n");
}
return 0;
}
100-90: A
89-80: B
79-70: C
<70: 补考
#include <stdio.h>
int main() {
int score;
printf("请输入分数:");
scanf("%d", &score);
if (score >= 90 && score <= 100) {
printf("等级:A");
} else if (score >= 80 && score < 90) {
printf("等级:B");
} else if (score >= 70 && score < 80) {
printf("等级:C");
} else if (score < 70) {
printf("补考");
} else {
printf("无效分数");
}
return 0;
}
嵌套结构
if(表达式1)
{
if(表达式2)
{
}
}
================
if(s>=0&&s<=100)
{
// if() ABC...
}
else
{
printf("error\n");
}
注意:
1. if后边可以没有else, else前边必须有if
2. 分支语句代码块只有一句时,可以省略{ }
switch
switch(常量值或表达式)
{
case 常量值1:
代码块1;
break;
case 常量值2:
代码块2;
break;
default:
代码块n;
break;
}
============================
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: 补考
注意:
1. case后边的常量值是整型或字符型,不能是浮点型或字符串
2. case分支遇到break结束; 后边可以没有break,会从符合条件的分支开始一直运行到整个switch语句执行完才结束
#include <stdio.h>
int main() {
int score;
char grade;
printf("请输入分数:");
scanf("%d", &score);
if (score >= 90 && score <= 100) {
grade = 'A';
} else if (score >= 80 && score < 90) {
grade = 'B';
} else if (score >= 70 && score < 80) {
grade = 'C';
} else if (score < 70) {
grade = 'D';
} else {
printf("无效分数\n");
return 1;
}
switch (grade) {
case 'A':
printf("等级:A\n");
break;
case 'B':
printf("等级:B\n");
break;
case 'C':
printf("等级:C\n");
break;
case 'D':
printf("补考\n");
break;
default:
break;
}
return 0;
}
2. 终端输入一个日期,判断是这一年的第几天
scanf("%d-%d-%d",&y,&m,&d);
闰年2月29天,平年2月28天
#include <stdio.h>
int main() {
int y, m, d;
while(1){
printf("请输入日期()\n");
printf("例如:2024-1-1\n");
scanf("%d-%d-%d", &y, &m, &d);
if(y==0){
break;
}
int days = 0;
switch (m) {
case 12: days += 30;
case 11: days += 31;
case 10: days += 30;
case 9: days += 31;
case 8: days += 31;
case 7: days += 30;
case 6: days += 31;
case 5: days += 30;
case 4: days += 31;
case 3: days += 28;
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
days++;
}
case 2: days += 31;
case 1: days += d;
}
printf("这是这一年的第%d天\n", days);
}
}