C语言结构体实验报告
本实验报告主要围绕C语言结构体的概念、定义、使用和初始化等方面进行实验和实践。实验目的包括了解结构体的基本概念、掌握结构体类型的定义、结构体变量的定义和使用、掌握结构体变量的初始化等。
一、结构体的基本概念
结构体是一种复杂的数据类型,它可以由多个基本数据类型组成。结构体可以用来描述一个实体的多个属性,例如学生的姓名、学号、年龄、性别、成绩等。
二、结构体的定义
结构体的定义使用struct关键字,例如:
```c
struct student {
char name[20];
char num[20];
int age;
char sex;
int score;
};
```
这定义了一个名为student的结构体,它包含五个成员变量:name、num、age、sex和score。
三、结构体变量的定义和初始化
结构体变量可以使用struct关键字定义,例如:
```c
struct student stu1, stu2;
```
这定义了两个名为stu1和stu2的结构体变量。
结构体变量可以在定义时进行初始化,例如:
```c
struct stu {
char name[20];
char num[20];
int age;
char sex;
int score;
} a = { "Miao ", "01", 20, 'm', 90 };
```
这定义了一个名为a的结构体变量,并对其进行了初始化。
四、结构体变量的引用和赋值
结构体变量可以使用点运算符(.)来访问其成员变量,例如:
```c
struct stu stu1, stu2;
stu1.name = "zhang";
stu1.num = "01";
stu1.age = 20;
stu1.sex = 'm';
stu1.score = 90;
```
这对stu1的成员变量进行了赋值。
五、实验内容
1. 分析以下程序:
```c
#include "stdio.h"
#include "string.h"
struct student {
long num;
char name[8];
float score;
} stu1, stu2;
main() {
int i, j;
stu1.num = 303111;
strcpy(stu1.name, "zhang");
stu1.score = 88.5;
stu2 = stu1;
printf("%ld ,%s, %.2f", stu2.num, stu2.name, stu2.score);
}
```
这个程序定义了一个名为student的结构体,包含三个成员变量:num、name和score。然后,程序对stu1进行了初始化,并将其赋值给stu2。程序输出stu2的信息。
2. 找出以下程序的错误,并改正。
```c
#include<stdio.h>
main() {
struct student {
int num;
char name[10];
char sex;
} stu, *p;
student.name = 120;
stu.name = "Lily ";
scanf("%s", stu.name);
scanf("%c", stu.sex);
p = &stu.sex;
p = stu.name;
p = stu;
}
```
这个程序存在多个错误:
* 结构体定义时忘记加分号。
* 结构体定义时只能跟一个结构体名。
* 应该是结构体变量名.成员名。
* scanf里面要加&。
改正后的程序:
```c
#include<stdio.h>
struct student {
int num;
char name[10];
char sex;
} stu, *p;
main() {
stu.name = "Lily ";
scanf("%s", &stu.name);
scanf("%c", &stu.sex);
p = &stu;
printf("%s, %c", stu.name, stu.sex);
}
```
3. 程序设计
(1)定义一个结构体变量(包括年月日),计算该日是本年中的第几天?注意闰年问题。
```c
#include<stdio.h>
struct data {
int year;
int month;
int day;
};
void main() {
struct data date;
printf("请输入年,月,日: ");
scanf("%d,%d,%d", &date.year, &date.month, &date.day);
int i, t = 0;
int run[13] = {0, 31, 29, 31, 30, 31, 31, 31, 31, 30, 31, 30, 31};
int ping[13] = {0, 31, 28, 31, 30, 31, 31, 31, 31, 30, 31, 30, 31};
if ((date.year % 400 == 0) || (date.year % 100 != 0 && date.year % 4 == 0))
for (i = 0; i < date.month; i++)
t = t + run[i];
else
for (i = 0; i < date.month; i++)
t = t + ping[i];
t = t + date.day;
printf("%d", t);
}
```
(2)写一个函数days,实现上面的计算,由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。
```c
#include<stdio.h>
struct data {
int year;
int month;
int day;
};
int days(struct data date) {
int i, t = 0;
int run[13] = {0, 31, 29, 31, 30, 31, 31, 31, 31, 30, 31, 30, 31};
int ping[13] = {0, 31, 28, 31, 30, 31, 31, 31, 31, 30, 31, 30, 31};
if ((date.year % 400 == 0) || (date.year % 100 != 0 && date.year % 4 == 0))
for (i = 0; i < date.month; i++)
t = t + run[i];
else
for (i = 0; i < date.month; i++)
t = t + ping[i];
t = t + date.day;
return t;
}
int main() {
struct data date;
printf("请输入年,月,日: ");
scanf("%d,%d,%d", &date.year, &date.month, &date.day);
int result = days(date);
printf("%d", result);
return 0;
}
```