学习目标:
学习内容:
2.1局部变量和全局变量
2.2标识符的可见性
2.3static
2.4预处理命令
学习产出:
标识符和预处理命令
1标识符必须先定义再使用。
2同一作用域不得出现同名标识符。
3在没有包含关系的不同作用域中定义的同名标识符互补影响。
4在两个或者多个有包含关系的作用域声明的的同名标识符,外层标识符在内层不可见。
作用1:修饰全局变量(函数),表示该变量(函数)只能被本函数调用。
作用2:修饰局部变量,其变量的生存期是静态生存期,由栈区转到静态区。
预处理命令的本质是只换不算的文本替换。
1宏定义
通常全部由大写字母组成
带参宏会将变量储存在cpu的寄存器中,运行效率更高但复用性较低。并且CPU中的寄存器空间较小,因此不推荐使用带参宏。
2“文件包含处理”
与<>相比" "的范围仅限在本.c文件所在目录。
3条件编译
#ifdef
#endif
4extern
修饰外部函数,说明后面内容算声明不算定义。
输入年份和月份后输出月历
主函数
1 #include
2 #include"sub.h"
3 int main(void)
4{
5 int year = 0;
6 int month = 0;
7 printf("请输入年份:");
8 scanf("%d",&year):
9 printf("请输入月份:");
10 scanf("%d",&month);
11 outputDays(year,month);
12 return 0;
13}
头文件
#ifndef SUB_H
#define SUB_H
int leapyear(int year);
int sumleapyear(int year);
int DaysofThemonth(int year,int month);
int sumDaysofThemonth(int year,int month);
int DaysAfter1900(int year,int month);
int week(int year,int month);
void outputDays(int year,int month);
#endif
子函数文件
#include
int leapyear(int year)
{
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
return 0;
}
return -1;
}
int DaysofThemonth(int year,int month)
{
int Days[12] = {31,0,31,30,31,30,31,31,30,31,30,31};
if(Days[month - 1] == 0)
{
if(leapyear(year) == 0)
{
return 29;
}
return 28;
}
return Days[month - 1];
}
int sumleapyear(int year)
{
int count = 0;
int i = 0;
for( i = 1900;i < year;++i)
{
if(leapyear(i) == 0)
{
++count;
}
}
return count;
}
int sumDaysofThemonth(int year,int month)
{
int count = 0;
int i = 0;
for( i = 1; i < month;++i)
{
count += DaysofThemonth(year,i);
}
if(leapyear(year) == 0 && month > 2)
{
return count + 29;
}
else if(leapyear(year) != 0 && month > 2)
{
return count + 28;
}
return count;
}
int DaysAfter1900(int year,int month)
{
return 366 * sumleapyear(year) + 365 * (year - 1900 - sumleapyear(year)) + sumDaysofThemonth(year,month);
}
int week(int year,int month)
{
return DaysAfter1900(year,month) % 7 + 1;
}
void outputDays(int year,int month)
{
int i = 0;
int j = 0;
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
for(i = 1; i < week(year,month) - 1;++i)
{
printf(" ");
}
for(i = 1; i <=DaysofThemonth(year,month) ;++i)
{
printf("%4d ",i);
if(week(year,month) == 1)
{
if(i % 7 == 0)
{
printf("\n");
}
}
else
{
if(i % 7 == 8 - week(year,month))
{
printf("\n");
}
}
}
printf("\n");
}
输出结果: