c语言程序设计案例教程(第2版)笔记(三)—变量、结构体
零散知识点:
- 变量 :C语言中,每个变量必须先定义后引用。所谓变量存在是指系统为这个变量分配一块存储空间,此时对变量的操作,就是对变量所对应的存储空间中存放的数据进行操作。人们将变量占据存储空间的时间称为变量的生存期,将变量可以引用的区域称为变量的作用域。变量的作用域依赖于变量定义的位置。
- 全局变量:在函数外部定义的变量称为全局变量。全局变量的生命期是定义这个变量的程序文件,作用域是从定义处开始到程序文件的结束处为止。如果程序文件中的某些局部变量与之同名,则全局变量的作用域应该减去这部分区域。
- 局部变量:在函数内部定义的变量,包括参数表中定义的形式参数被称为局部变量。局部变量的生存期和作用域是定义这些变量的函数。如果函数中出现与局部变量同名的块变量,局部变量的作用域将是减去块变量存在的区域,但它的生命周期并没有结束。(不同函数之间可以相同名字的变量)
- 块变量 :在复合语句中定义的变量称为块变量。块变量的生命期仅为定义它的复合语句块。优点:可以提高存储空间的利用率。
- 静态变量:变量在程序开始运行时系统就为其分配存储空间,等到程序结束时才将为其分配的所有存储空间回收。
- 格式: static 数据类型 变量名;
- 说明:
- 全局变量都具有静态变量的性质
- 在默认情况下,函数内部定义的变量属于自动变量
- 定义为静态变量的变量,只有在首次使用的时候进行初始化,随后的调用不再进行初始化
- 函数的形式参数必须是自动变量。因此在C语言中,不允许在定义形式参数时使用存储类别说明符
- 具有自动(auto)存储类别的变量与函数共存亡;具有静态(static)存储类别的变量与程序共存亡。
-
结构体 :是一种可以将若干个不同数据类型的变量组合在一起的复合型数据类型。常借助于它将表示同一对象的不同属性封装在一起。
- 优点:可以提高程序的清晰度,降低程序的复杂度,改善程序的可维护性。
- 结构体的变量称为“成员”,(在结构体中,“成员”可以属于任何一种数据类型)。其类型声明的语法格式:
struct <结构体类型名> {
<数据类型> <成员1>;
<数据类型> <成员2>;
……
<数据类型> <成员n>
};
- 在C语言中,允许用户为已经存在的数据类型起一个别名,格式为:typedef 原数据类型名 新数据类型名;
- 例如:typedef int INTEGER;
- 优点:可以提高程序的清晰度、增加程序的可读性
- 结合后:
typedef struct point_type {
Int x;
Int y;
} POINT
POINT p1, p2
等价于:
struct point_type p1, p2;
等价于:
struct point_type{
Int x;
Int y;
} p1, p2;
- 结构体类型变量的初始化:struct point_type p1 = {10,20};
- 结构体类型变量的引用:p1.x; p1.y
- 结构体类型变量的输入:scanf(“%d%d”,&p1.x,&p1.y);
- 结构体类型变量的输出:printf(“%d %d”,p1.x,p1.y);
- 结构体类型变量的赋值:p1.x=6; p1.y=8;
- 结构体代码实例:
功能描述:通过键盘输入30名学生的基本信息,并在上输出。然后,通过键盘输入一个月份和日期,查找并输出本年度在这个给定日期之后过生日的学生信息。
代码实例:
1 #include<stdio.h> 2 #pragma warning(disable:4996) 3 #define NUM 20 4 typedef struct{ 5 int year; /*年*/ 6 int month; /*月*/ 7 int day; /*日*/ 8 } DATE; 9 10 typedef struct{ 11 int num; /*学号*/ 12 char name[24]; /*姓名*/ 13 DATE birthday; /*出生日期*/ 14 char department[48]; /*所属院系*/ 15 char major[32]; /*主修专业*/ 16 } STUDENTINFO; 17 void inputINFO(STUDENTINFO s[]); 18 void outINFO(STUDENTINFO s[]); 19 void searchInfo(STUDENTINFO s[], DATE date); 20 21 main() 22 { 23 STUDENTINFO s[NUM]; 24 DATE date; 25 inputINFO(s); 26 outINFO(s); 27 printf("\n Enter a date(month,day):\n"); 28 scanf("%d%d", &date.month, &date.day); 29 searchInfo(s, date); 30 } 31 32 void inputINFO(STUDENTINFO s[]) 33 { 34 int i; 35 printf("Enter %d studennts information (name,birthday,department,major):\n", NUM); 36 for (i = 0; i < NUM; i++){ 37 s[i].num = i + 1; 38 scanf("%s", s[i].name); 39 scanf("%d%d%d", &s[i].birthday.year, &s[i].birthday.month, &s[i].birthday.day); 40 scanf("%s", s[i].department); 41 scanf("%s", s[i].major); 42 putchar('\n'); 43 } 44 } 45 46 void outINFO(STUDENTINFO s[]) 47 { 48 int i; 49 printf("\n Num Name Birthday Department Major\n"); 50 for (i = 0; i < NUM; i++){ 51 printf("%4d %14s %4d/%2d/%2d %16s %16s", 52 s[i].num, s[i].name, s[i].birthday.year, s[i].birthday.month, s[i].birthday.day, 53 s[i].department, s[i].major); 54 putchar('\n'); 55 } 56 } 57 58 void searchInfo(STUDENTINFO s[], DATE date) 59 { 60 int i; 61 for (i = 0; i < NUM; i++){ 62 if (s[i].birthday.month>date.month){ 63 printf("\n%4d %16s %2d/%2d", s[i].num,s[i].name, s[i].birthday.month, 64 s[i].birthday.day); 65 continue; 66 } 67 if (s[i].birthday.month == date.month && s[i].birthday.day>date.day){ 68 printf("\n%4d %16s %2d/%2d", s[i].num, s[i].name, s[i].birthday.month, 69 s[i].birthday.day); 70 } 71 } 72 }
本博客内容为原创,版权所有违者必究,转载请注明来源 http://www.cnblogs.com/sunshine-blog/