struct Student { // 结构体Student int id; //学号 float gpa; //平均分 }; //定义类模板及函数,函数在类体外定义 template class Store //类模板:实现对任意类型数据进行存取 裁判测试程序样例: int main() { try { Store<int> s1, s2; //定义两个Store<int>类对象,其中数据成员item为int类型 s1.putElem(3); //向对象S1中存入数据(初始化对象S1) s2.putElem(-7); //向对象S2中存入数据(初始化对象S2) cout << s1.getElem() << " " << s2.getElem() << endl; //输出对象S1和S2的数据成员 Student g = { 1000, 23 }; //定义Student类型结构体变量的同时赋以初值 Store<Student> s3; //定义Store<Student>类对象s3,其中数据成员item为Student类型 s3.putElem(g); //向对象D中存入数据(初始化对象D) cout << "The student id is " << s3.getElem().id << endl; //输出对象s3的数据成员 Store<double> d; //定义Store<double>类对象s4,其中数据成员item为double类型 cout << "Retrieving object d... "; cout << d.getElem() << endl; //输出对象D的数据成员 //由于d未经初始化,在执行函数D.getElement()过程中导致程序终止 } catch (...) { cout << "get item error!"; } return 0; }
时间: 2024-04-03 18:30:39 浏览: 42
这段代码定义了一个类模板 `Store`,用于实现对任意类型数据进行存取。其数据成员为 `item`,可以存储任意类型的数据。其中,`putElem` 函数用于向对象中存储数据,`getElem` 函数用于获取对象中存储的数据。
在主函数中,先定义了两个 `Store<int>` 类对象 `s1` 和 `s2`,并分别使用 `putElem` 函数向其中存储数据。然后输出两个对象中存储的数据成员。
接着定义了一个 `Student` 类型的结构体变量 `g`,其中包含了学号和平均分两个数据成员。然后定义了一个 `Store<Student>` 类对象 `s3`,并使用 `putElem` 函数向其中存储 `g` 变量。最后输出了对象 `s3` 中存储的学号数据成员。
最后定义了一个 `Store<double>` 类对象 `d`,并在调用 `getElem` 函数时由于 `d` 未经初始化而导致程序终止。在 `main` 函数最后使用 `try-catch` 语句捕获了异常并输出错误信息。
相关问题
学生档案管理程序c语言2.根据所要保存的学生档案记录内容(学号、姓名、性别、年龄和总绩点),设计结构体数据类型,结合结构体数组的运用实现文件记录的读写访问 3.将以上各功能都设计成独立的函数,在main函数中显示一个菜单,让用户选择要执行的功能,然后转而执行相应的函数
好的,以下是一个基本的学生档案管理程序的C语言代码,包括了结构体数据类型和文件读写功能,以及菜单功能:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_STUDENTS 1000 //最大学生数量
//学生结构体数据类型
typedef struct {
int id; //学号
char name[20]; //姓名
char gender; //性别
int age; //年龄
float gpa; //总绩点
} Student;
//文件读写函数
void saveStudents(Student students[], int count) {
FILE *fp = fopen("students.dat", "wb"); //以二进制写入方式打开文件
fwrite(students, sizeof(Student), count, fp); //将学生数组写入文件中
fclose(fp); //关闭文件
}
void loadStudents(Student students[], int *count) {
FILE *fp = fopen("students.dat", "rb"); //以二进制读取方式打开文件
if (fp != NULL) {
*count = fread(students, sizeof(Student), MAX_STUDENTS, fp); //从文件中读取学生数组
fclose(fp); //关闭文件
}
}
//添加学生函数
void addStudent(Student students[], int *count) {
if (*count < MAX_STUDENTS) { //判断学生数量是否已满
printf("请输入学生学号:");
scanf("%d", &students[*count].id);
printf("请输入学生姓名:");
scanf("%s", students[*count].name);
printf("请输入学生性别(男/女):");
scanf("%s", &students[*count].gender);
printf("请输入学生年龄:");
scanf("%d", &students[*count].age);
printf("请输入学生总绩点:");
scanf("%f", &students[*count].gpa);
(*count)++;
printf("添加成功!\n");
} else {
printf("学生数量已满,无法添加!\n");
}
}
//删除学生函数
void deleteStudent(Student students[], int *count) {
int id;
printf("请输入要删除的学生学号:");
scanf("%d", &id);
int i;
for (i = 0; i < *count; i++) {
if (students[i].id == id) { //找到要删除的学生
int j;
for (j = i; j < *count - 1; j++) {
students[j] = students[j + 1]; //将后面的学生往前移动
}
(*count)--;
printf("删除成功!\n");
return;
}
}
printf("未找到该学生,删除失败!\n");
}
//修改学生函数
void modifyStudent(Student students[], int count) {
int id;
printf("请输入要修改的学生学号:");
scanf("%d", &id);
int i;
for (i = 0; i < count; i++) {
if (students[i].id == id) { //找到要修改的学生
printf("请输入新的学生姓名:");
scanf("%s", students[i].name);
printf("请输入新的学生性别(男/女):");
scanf("%s", &students[i].gender);
printf("请输入新的学生年龄:");
scanf("%d", &students[i].age);
printf("请输入新的学生总绩点:");
scanf("%f", &students[i].gpa);
printf("修改成功!\n");
return;
}
}
printf("未找到该学生,修改失败!\n");
}
//显示所有学生函数
void showAllStudents(Student students[], int count) {
printf("学号\t姓名\t性别\t年龄\t总绩点\n");
int i;
for (i = 0; i < count; i++) {
printf("%d\t%s\t%c\t%d\t%.2f\n", students[i].id, students[i].name, students[i].gender, students[i].age, students[i].gpa);
}
}
//菜单函数
void menu() {
printf("欢迎使用学生档案管理程序!\n");
printf("1. 添加学生\n");
printf("2. 删除学生\n");
printf("3. 修改学生\n");
printf("4. 显示所有学生\n");
printf("5. 退出\n");
}
int main() {
Student students[MAX_STUDENTS]; //学生数组
int count = 0; //学生数量
loadStudents(students, &count); //从文件中读取学生数组
int choice;
do {
menu(); //显示菜单
printf("请输入你的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
addStudent(students, &count);
saveStudents(students, count); //保存学生数组到文件中
break;
case 2:
deleteStudent(students, &count);
saveStudents(students, count);
break;
case 3:
modifyStudent(students, count);
saveStudents(students, count);
break;
case 4:
showAllStudents(students, count);
break;
case 5:
printf("谢谢使用!\n");
break;
default:
printf("无效的选择,请重新输入!\n");
break;
}
} while (choice != 5);
return 0;
}
```
注意:在运行该程序之前,需要先创建一个名为“students.dat”的文件,用于保存学生档案记录。
用c语言编写1. 学生档案记录录入:录入学生的学号、姓名、性别、年龄和总绩点,以记录形式保存在 文件末尾。注意:录入第一个学生的记录时要创建文件,录入其他学生的记录时只需要 打开已经创建的文件就可以 2. 学生档案记录修改:允许用户选择并从文件中读取要修改的学生记录,修改指定的记录 后,能将改记录写回文件中原来的位置 3. 学生档案记录删除:允许用户选择要删除的学生记录,告诉用户准备删除哪个记录,获 得用户确认后从文件中删除这个记录。注意:删除一个记录后,后面的记录都得往前挪! 4. 学生记录排序:对保存在文件中的记录按学号排序,排序后的记录仍写回原来的文件 5. 其他功能:其他您以为适当的功能,比如按姓名、绩点排序,统计平均年龄和绩点,按 姓名、年龄查找并显示学生档案资料 程序设计提示: 1. 设计文件数据结构:设计文件的存储结构,将每个学生的学号、姓名、性别、年龄和总 绩点保存为一个记录,以便进行随机存取。例如:学号 12 个字节,姓名 8 个字节,性 别 2 个字节,年龄 2 个字节,总绩点 3 个字节,记起来一个学生的记录总共需要 27 个 字节,记录的长度就是 27 个字节 2. 根据所要保存的学生档案记录内容(学号、姓名、性别、年龄和总绩点),设计结构体 数据类型,结合结构体数组的运用实现文件记录的读写访问 3. 将以上各功能都设计成独立的函数,在 main 函数中显示一个菜单,让用户选择要执行 的功能,然后转而执行相应的函数 4. 如果可能,在学生记录中增加若干需要登记的资料,例如:住址、专业、班级号等
这是一个比较复杂的程序设计,需要考虑文件的读写、数据结构、函数设计等方面。以下是一个简单的参考实现,仅供参考。
```c
#include <stdio.h>
#include <string.h>
// 定义学生档案记录结构体
struct student {
char id[13]; // 学号,12 个字节,最后一个字节为 '\0'
char name[9]; // 姓名,8 个字节,最后一个字节为 '\0'
char gender; // 性别,1 个字节
int age; // 年龄,2 个字节
float gpa; // 总绩点,4 个字节
};
// 定义全局变量
struct student students[1000]; // 最多存储 1000 个学生记录
int count = 0; // 实际存储的学生记录数
// 声明函数
void show_menu();
void add_student();
void modify_student();
void delete_student();
void sort_students();
void search_students();
void print_students();
void save_students();
int main() {
// 读取文件中已有的学生记录
FILE* fp = fopen("students.dat", "rb");
if(fp != NULL) {
// 文件存在,读取数据
while(!feof(fp)) {
fread(&students[count], sizeof(struct student), 1, fp);
if(strlen(students[count].id) > 0) {
count++;
}
}
fclose(fp);
}
// 显示菜单
int choice;
do {
show_menu();
scanf("%d", &choice);
switch(choice) {
case 1:
add_student();
break;
case 2:
modify_student();
break;
case 3:
delete_student();
break;
case 4:
sort_students();
break;
case 5:
search_students();
break;
case 6:
print_students();
break;
case 7:
save_students();
break;
case 0:
printf("谢谢使用!\n");
break;
default:
printf("无效的选项,请重新输入!\n");
break;
}
} while(choice != 0);
return 0;
}
// 显示菜单
void show_menu() {
printf("\n");
printf("1. 添加学生记录\n");
printf("2. 修改学生记录\n");
printf("3. 删除学生记录\n");
printf("4. 排序学生记录\n");
printf("5. 查找学生记录\n");
printf("6. 显示所有学生记录\n");
printf("7. 保存学生记录到文件中\n");
printf("0. 退出程序\n");
printf("请选择要执行的操作:");
}
// 添加学生记录
void add_student() {
if(count >= 1000) {
printf("学生记录已满,无法添加新记录!\n");
return;
}
printf("请输入学生的学号、姓名、性别、年龄和总绩点(用空格分隔):");
scanf("%s %s %c %d %f", students[count].id, students[count].name, &students[count].gender, &students[count].age, &students[count].gpa);
count++;
}
// 修改学生记录
void modify_student() {
printf("请输入要修改的学生的学号:");
char id[13];
scanf("%s", id);
int index = -1;
for(int i = 0; i < count; i++) {
if(strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if(index == -1) {
printf("找不到指定的学生记录!\n");
return;
}
printf("该学生的记录为:%s %s %c %d %f\n", students[index].id, students[index].name, students[index].gender, students[index].age, students[index].gpa);
printf("请输入修改后的学号、姓名、性别、年龄和总绩点(用空格分隔):");
scanf("%s %s %c %d %f", students[index].id, students[index].name, &students[index].gender, &students[index].age, &students[index].gpa);
printf("修改成功!\n");
}
// 删除学生记录
void delete_student() {
printf("请输入要删除的学生的学号:");
char id[13];
scanf("%s", id);
int index = -1;
for(int i = 0; i < count; i++) {
if(strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if(index == -1) {
printf("找不到指定的学生记录!\n");
return;
}
printf("您确定要删除以下学生的记录吗?\n");
printf("%s %s %c %d %f\n", students[index].id, students[index].name, students[index].gender, students[index].age, students[index].gpa);
printf("请输入 Y 或 N 确认或取消:");
char choice;
scanf(" %c", &choice);
if(choice == 'Y' || choice == 'y') {
for(int i = index; i < count - 1; i++) {
students[i] = students[i + 1];
}
count--;
printf("删除成功!\n");
} else {
printf("操作已取消!\n");
}
}
// 排序学生记录
void sort_students() {
printf("请选择排序方式(1. 按学号升序 2. 按姓名升序 3. 按绩点降序):");
int choice;
scanf("%d", &choice);
switch(choice) {
case 1:
for(int i = 0; i < count - 1; i++) {
for(int j = i + 1; j < count; j++) {
if(strcmp(students[i].id, students[j].id) > 0) {
struct student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
printf("按学号升序排序成功!\n");
break;
case 2:
for(int i = 0; i < count - 1; i++) {
for(int j = i + 1; j < count; j++) {
if(strcmp(students[i].name, students[j].name) > 0) {
struct student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
printf("按姓名升序排序成功!\n");
break;
case 3:
for(int i = 0; i < count - 1; i++) {
for(int j = i + 1; j < count; j++) {
if(students[i].gpa < students[j].gpa) {
struct student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
printf("按绩点降序排序成功!\n");
break;
default:
printf("无效的选项,请重新输入!\n");
break;
}
}
// 查找学生记录
void search_students() {
printf("请选择查找方式(1. 按姓名查找 2. 按年龄查找 3. 按绩点查找):");
int choice;
scanf("%d", &choice);
switch(choice) {
case 1:
printf("请输入要查找的学生姓名:");
char name[9];
scanf("%s", name);
for(int i = 0; i < count; i++) {
if(strcmp(students[i].name, name) == 0) {
printf("%s %s %c %d %f\n", students[i].id, students[i].name, students[i].gender, students[i].age, students[i].gpa);
}
}
break;
case 2:
printf("请输入要查找的学生年龄:");
int age;
scanf("%d", &age);
for(int i = 0; i < count; i++) {
if(students[i].age == age) {
printf("%s %s %c %d %f\n", students[i].id, students[i].name, students[i].gender, students[i].age, students[i].gpa);
}
}
break;
case 3:
printf("请输入要查找的学生绩点范围(用空格分隔):");
float min_gpa, max_gpa;
scanf("%f %f", &min_gpa, &max_gpa);
for(int i = 0; i < count; i++) {
if(students[i].gpa >= min_gpa && students[i].gpa <= max_gpa) {
printf("%s %s %c %d %f\n", students[i].id, students[i].name, students[i].gender, students[i].age, students[i].gpa);
}
}
break;
default:
printf("无效的选项,请重新输入!\n");
break;
}
}
// 显示所有学生记录
void print_students() {
for(int i = 0; i < count; i++) {
printf("%s %s %c %d %f\n", students[i].id, students[i].name, students[i].gender, students[i].age, students[i].gpa);
}
}
// 保存学生记录到文件中
void save_students() {
FILE* fp = fopen("students.dat", "wb");
if(fp == NULL) {
printf("无法创建文件!\n");
return;
}
for(int i = 0; i < count; i++) {
fwrite(&students[i], sizeof(struct student), 1, fp);
}
fclose(fp);
printf("保存成功!\n");
}
```
该程序使用了一个结构体数组存储学生档案记录,每个学生的信息包括学号、姓名、性别、年龄和总绩点。在主函数中,通过显示菜单让用户选择要执行的操作,然后调用相应的函数实现相应功能。具体实现细节请参考注释。
阅读全文