首页 > 其他分享 >实验六 周天意 202383290417

实验六 周天意 202383290417

时间:2023-12-11 17:33:19浏览次数:39  
标签:head 202383290417 int void 链表 实验 天意 printf Film

实验六

实验内容

1. 实验任务1
验证性实验。输入代码,结合运行结果,观察、理解以下用法:
结构体类型的定义
结构体数组的输入、输出、元素访问
结构体数组作为函数参数
结构体类型作为函数返回值类型
问题场景描述:
学生成绩包括:学号、姓名、课程名称、平时成绩、期中成绩、期末成绩、总评成绩、等级。
其中:
总评成绩 = 平时成绩 × 20% + 期中成绩 × 20% + 期末成绩 × 60%
等级:优(90~100)、良(80~89)、中(70~79)、及格(60~69)、不及格(<60)
要求:
编写函数模块input()实现学生信息录入
编写函数模块output()实现输出n个学生信息
编写函数模块calc()计算学生总评成绩和等级
编写函数模块sort()对学生成绩按总评进行排序
编写函数模块fail()统计不及格学生信息,将不及格学生信息保存在数组中,同时,返回不及
格学生人数
2. 实验任务2
验证性实验。输入代码,观察、理解以下用法:
结构体指针变量的定义
使用结构体指针变量间接访问结构体数组的用法
字符串比较操作
问题场景描述:
使用结构体类型保存图书信息。使用指结构体遍历数组,输出所有图书信息。
输入作者名,查找该作者的所有图书并输出。

3. 实验任务3
验证性实验。输入代码,体验、理解链表的创建、插入结点、遍历操作。
问题场景描述:
已知电影信息如表所示。
编写C程序,用链表对电影信息进行存储和遍历。具体要求如下:
初始时,链表为空。
对于表格中的电影信息,依次将每部电影作为一个结点插入单链表的表头。(即当前插入的
结点将成为第1个结点。)
所有电影信息都插入链表后,从链表头开始,依次遍历输出链表中每部电影完整信息。

4. 实验任务4
问题场景描述:
年终,某书店做纸质图书销量统计。已知图书信息保存在结构体数组中,要求统计信息如下:
将所有图书按销售数量由高到低打印输出。
打印输出这一组图书总的销售金额。

5. 实验任务5
问题场景描述:
定义一个结构体类型 Date 用于描述日期。
编写函数返回一个日期是这一年的第多少天。函数原型为: int day_of_year(Date d) ;
编写函数比较两个日期的先后。函数原型为: int compare_dates(Date d1, Date d2);
如果d1在d2前面,返回-1
如果d1在d2后面,返回1
如果d1和d2相同,返回0
在main()函数中,编写测试模块,分别测试两个函数功能是否正确实现。

6. 实验任务6
问题场景描述:
在用户名密码系统中,定义一个枚举类型 enum Role ,用于描述账户角色信息;
定义一个结构体类型 Account ,用于描述账户信息,包括:用户名、密码、账户类型
编写函数实现遍历输出账户信息。函数原型为: void output(Account x[], int n)
要求输出时,用户密码字段用与原密码长度相同的*替代显示。

7. 实验任务7(选做*)
问题场景描述:
定义一个结构体类型 Contact 用于描述手机通讯录里联系人信息,包含:联系人姓名、手机号,
以及标志其是否是紧急联系人的字段。
编写函数设置某个人为紧急联系人。函数原型如下: void set_vip_contact(Contact x[],
int n, char name[]);
编写函数打印输出通讯录中所有联系人信息。函数原型如下: void output(Contact x[], int
n);
如果是紧急联系人,打印输出时,最后一列显示*
编写函数按照指定要求显示通讯录所有联系人信息。函数原型如下: void display(Contact
x[], int n);
指定要求为:按联系人姓名字典序升序显示信息,紧急联系人最先显示

实验结论

1. 实验任务1
验证性实验。无需写入实验博客文档。
请亲自动手实践,确保能独立编写该程序。

#include <stdio.h>
#include <string.h> 
#define N 10        // 运行程序输入测试时,可以把这个数组改小一些输入测试 

typedef struct student {
    int id;             // 学号 
    char name[20];         // 姓名 
    char subject[20];     // 考试科目
    double perf;         // 平时成绩 
    double mid;         // 期中成绩 
    double final;         // 期末成绩
    double total;         // 总评成绩 
    char level[10];     // 成绩等级
} STU;

void input(STU [], int);            // 录入学生信息
void output(STU [], int);            // 输出学生信息
void calc(STU [], int);                // 计算总评和等级 
int fail(STU [], STU [], int);        // 统计不及格学生信息
void sort(STU [], int);                // 排序 

int main() {
    STU st[N], fst[N];   // 数组st记录学生信息,fst记录不及格学生信息 
    int k;  // 用于记录不及格学生个数 
    
    printf("录入学生成绩信息:\n");
    input(st, N);
    
    printf("\n成绩处理...\n");
    calc(st, N);
    
    k = fail(st, fst, N);
    sort(st, N);
    printf("\n学生成绩排名情况:\n");
    output(st, N);
    
    printf("\n不及格学生信息:\n");
    output(fst, k);
    
    return 0;
} 

void input(STU s[], int n) {
    int i;
    
    for(i = 0; i < n; i++)
        scanf("%d %s %s %lf %lf %lf", &s[i].id, s[i].name, s[i].subject,
                                      &s[i].perf, &s[i].mid, &s[i].final);
}

void output(STU s[], int n) {
       int i;
   
      printf("-----------------\n");
      printf("学号   姓名     科目   平时   期中   期末   总评   等级\n");
       for(i = 0; i<n; i++)
          printf("%d   %-6s   %-4s   %-4.0f   %-4.0f   %-4.0f   %-4.1f   %s\n",s[i].id,s[i].name,s[i].subject,s[i].perf,s[i].mid,s[i].final,s[i].total,s[i].level);
}


void calc(STU s[],int n) {
    int i;

    for(i = 0; i < n; i++) {    
        s[i].total = s[i].perf * 0.2 + 
                     s[i].mid * 0.2 +
                     s[i].final * 0.6;
        
        if(s[i].total >= 90)
          strcpy(s[i].level, "优");
        else if(s[i].total >= 80 && s[i].total < 90)
          strcpy(s[i].level, "良");
        else if(s[i].total >= 70 && s[i].total < 80)
          strcpy(s[i].level, "中"); 
        else if(s[i].total >= 60 && s[i].total < 70)
          strcpy(s[i].level, "及格");
        else
          strcpy(s[i].level, "不及格");         
    }
}

int fail(STU s[], STU t[], int n) {
      int i, cnt = 0;
      
      for(i = 0; i < n; i++)
          if(s[i].total < 60)
            t[cnt++] = s[i];
            
    return cnt;
}

void sort(STU s[], int n) {
    int i, j;
    STU t;
    
    for(i = 0; i < n-1; i++)
      for(j = 0; j < n-1-i; j++)
        if(s[j].total < s[j+1].total) {
            t = s[j];
            s[j] = s[j+1];
            s[j+1] = t;
        }
}

2. 实验任务2
验证性实验。无需写入实验博客文档。
请亲自动手实践,确保会使用结构体指针遍历结构体数组,以及,使用 strcmp() 比较字符串。

#include <stdio.h>
#include <string.h>
#define N 10
#define M 80

typedef struct {
    char name[M];       // 书名
    char author[M];     // 作者
} Book;

int main() {
    Book x[N] = { {"《一九八四》", "乔治.奥威尔"},
                  {"《美丽新世界》", "赫胥黎"},
                  {"《昨日的世界》", "斯蒂芬.茨威格"}, 
                  {"《万历十五年》", "黄仁宇"},
                  {"《一只特立独行的猪》", "王小波"},
                  {"《百年孤独》", "马尔克斯"},
                  {"《查令十字街84号》", "海莲.汉芙"},
                  {"《只是孩子》", "帕蒂.史密斯"}, 
                  {"《刀锋》", "毛姆"},
                  {"《沉默的大多数》", "王小波"} };
    Book *ptr;
    int i;
    char author[M];

    // 使用指针遍历结构体数组
    printf("所有图书信息: \n");
    for(ptr = x; ptr < x + N; ++ptr)
        printf("%-30s%-30s\n", ptr->name, ptr->author);

    // 查找指定作者的图书
    printf("\n输入作者名: ");
    gets(author);
    for(ptr = x; ptr < x + N; ++ptr)
        if(strcmp(ptr->author, author) == 0) {
            printf("%-30s%-30s\n", ptr->name, ptr->author);
        }

    return 0;
}

3. 实验任务3
验证性实验。无需写入实验博客文档。
请亲自动手实践,体验链表的创建、遍历,及插入结点(本例中,是从链表表头插入)的操作。

#include <stdio.h>
#include <stdlib.h>
#define N 80

typedef struct FilmInfo {
    char name[N];
    char director[N];
    char region[N];
    int year;
    struct FilmInfo *next;
} Film;


void output(Film *head);   // 遍历输出链表信息
Film *insert(Film *head, int n);   // 向链表中插入n个结点,返回头指针


int main() {
    int n;          // 结点数
    Film *head;     // 头指针变量,存放链表中第一个节点的地址

    head = NULL;
    printf("输入影片数目: ");
    scanf("%d", &n);

    // 向链表中插入n部影片信息
    head = insert(head, n);

    // 遍历输出链表中所有影片信息
    printf("\n所有影片信息如下: \n");
    output(head);

    return 0;
}

// 向链表中插入n个结点,从表头插入,返回头指针变量
Film *insert(Film *head, int n) {
    int i;
    Film *p;

    for(i = 1; i <= n; ++i) {
        p = (Film *)malloc(sizeof(Film));
        printf("请输入第%d部影片信息: ", i);
        scanf("%s %s %s %d", p->name, p->director, p->region, &p->year);
        
        // 把结点从表头插入到链表中
        p->next = head;
        head = p;   // 更新头指针变量
    }

    return head;
}

// 遍历输出链表信息
void output(Film *head) {
    Film *p;

    p = head;
    while(p != NULL) {
        printf("%-20s %-20s %-20s %d\n", p->name, p->director, p->region, p->year);
        p = p -> next;
    }
}

 

#include <stdio.h>
#include <stdlib.h>
#define N 80

typedef struct FilmInfo {
    char name[N];
    char director[N];
    char region[N];
    int year;
    struct FilmInfo *next;
} Film;


void output(Film *head);   // 遍历输出链表信息
Film *insert(Film *head, int n);   // 向链表中插入n个结点,返回头指针


int main() {
    int n;          // 结点数
    Film *head;     // 头指针变量,存放链表中第一个节点的地址
    Film *p;        // 存放新申请的Film节点内存空间地址

    // 创建头结点
    p = (Film *)malloc(sizeof(Film));
    p->next = NULL;
    head = p;       // 头指针变量存放头节点的地址

    printf("输入影片数目: ");
    scanf("%d", &n);

    // 向链表中插入n部影片信息
    head = insert(head, n);

    // 遍历输出链表中所有影片信息
    printf("\n所有影片信息如下: \n");
    output(head);

    return 0;
}

// 向链表中插入n个结点,从表头插入,返回头指针变量
Film *insert(Film *head, int n) {
    int i;
    Film *p;

    for(i = 1; i <= n; ++i) {
        p = (Film *)malloc(sizeof(Film));
        printf("请输入第%d部影片信息: ", i);
        scanf("%s %s %s %d", p->name, p->director, p->region, &p->year);
        
        // 把结点从表头插入到链表中
        p->next = head->next;
        head->next = p;
    }

    return head;
}

// 遍历输出链表信息
void output(Film *head) {
    Film *p;

    p = head->next;
    while(p != NULL) {
        printf("%-20s %-20s %-20s %d\n", p->name, p->director, p->region, p->year);
        p = p -> next;
    }
}

 

4. 实验任务4
此部分书写内容:
正确补足后完整的task4.c源码,及,运行结果截图

#include <stdio.h>
#define N 10

typedef struct {
    char isbn[20];          // isbn号
    char name[80];          // 书名
    char author[80];        // 作者
    double sales_price;     // 售价
    int  sales_count;       // 销售册数
} Book;

void output(Book x[], int n);
void sort(Book x[], int n);
double sales_amount(Book x[], int n);

int main() {
    Book x[N] = {{"978-7-229-14156-1", "源泉", "安.兰德", 84, 59},
                 {"978-7-5133-5261-1", "李白来到旧金山", "谭夏阳", 48, 16},
                 {"978-7-5617-4347-8", "陌生人日记", "周怡芳", 72.6, 27},
                 {"978-7-5722-5475-8", "芯片简史", "汪波", 74.9, 49},
                 {"978-7-5046-9568-0", "数据化决策", "道格拉斯·W·哈伯德", 49, 42},
                 {"978-7-5133-4388-6", "美好时代的背后", "凯瑟琳.布", 34.5, 39},
                 {"978-7-1155-0509-5", "无穷的开始:世界进步的本源", "戴维·多伊奇", 37.5, 55},
                 {"978-7-5321-5691-7", "何为良好生活", "陈嘉映", 29.5 , 31},
                 {"978-7-5133-5109-6", "你好外星人", "英国未来出版集团", 118, 42},
                 {"978-7-2011-4617-1", "世界尽头的咖啡馆", "约翰·史崔勒基", 22.5, 44}};
    
    printf("图书销量排名: \n");
    sort(x, N);
    output(x, N);

    printf("\n图书销售总额: %.2f\n", sales_amount(x, N));
    
    return 0;
}

// 待补足:函数output()实现
// ×××
void output(Book x[], int n){
    int i;
    for(i = 0;i < n;i++){
        printf("%s %s %s %lf %d",x[i].isbn,x[i].name,x[i].author,x[i].sales_price,x[i].sales_count);
        printf("\n");
    }
    printf("\n");
}


// 待补足:函数sort()实现
// ×××
void sort(Book x[], int n){
    Book temp;
    int i,j;
    for(i = 0;i <n - 1;i++){
        for(j = 0;j < n- 1 -i;j++){
            if(x[j].sales_count < x[j+1].sales_count){
                temp = x[j];
                x[j] = x[j + 1];
                x[j + 1] = temp;
            }
        }
    }
}

// 待补足:函数sales_count()实现
// ×××
double sales_amount(Book x[], int n){
    double sum;
    int i;
    for(i = 0;i < n;i ++){
        sum += x[i].sales_price * x[i].sales_count;
    }
    return sum;
}

 

 

5. 实验任务5
此部分书写内容:
正确补足后完整的task5.c源码,及,运行结果截图

#include <stdio.h>

typedef struct {
    int year;
    int month;
    int day;
} Date;

// 函数声明
void input(Date *pd);                   // 输入日期给pd指向的Date变量
int day_of_year(Date d);                // 返回日期d是这一年的第多少天
int compare_dates(Date d1, Date d2);    // 比较两个日期: 
                                        // 如果d1在d2之前,返回-1;
                                        // 如果d1在d2之后,返回1
                                        // 如果d1和d2相同,返回0

void test1() {
    Date d;
    int i;

    printf("输入日期:(以形如2023-12-11这样的形式输入)\n");
    for(i = 0; i < 3; ++i) {
        input(&d);
        printf("%d-%02d-%02d是这一年中第%d天\n\n", d.year, d.month, d.day, day_of_year(d));
    }
}

void test2() {
    Date Alice_birth, Bob_birth;
    int i;
    int ans;

    printf("输入Alice和Bob出生日期:(以形如2023-12-11这样的形式输入)\n");
    for(i = 0; i < 3; ++i) {
        input(&Alice_birth);
        input(&Bob_birth);
        ans = compare_dates(Alice_birth, Bob_birth);
        
        if(ans == 0)
            printf("Alice和Bob一样大\n\n");
        else if(ans == -1)
            printf("Alice比Bob大\n\n");
        else
            printf("Alice比Bob小\n\n");
    }
}

int main() {
    printf("测试1: 输入日期, 打印输出这是一年中第多少天\n");
    test1();

    printf("\n测试2: 两个人年龄大小关系\n");
    test2();
}

// 补足函数input实现
// 功能: 输入日期给pd指向的Date变量
void input(Date *pd) {
    scanf("%d-%d-%d",&pd->year,&pd->month,&pd->day);
}

// 补足函数day_of_year实现
// 功能:返回日期d是这一年的第多少天
int day_of_year(Date d) {
    int month_days_pin[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
        int month_days_run[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
       int i,day = 0;
       if(d.year %400 == 0){
           for(i = 0;i <= d.month - 2;i++){
               day +=  month_days_run[i]; 
           }
           day += d.day;
           return day;
       }else{
       for(i = 0;i <= d.month - 2;i++){
               day +=  month_days_pin[i]; 
           }
               day += d.day;
               return day;
           
       }
       
}

// 补足函数compare_dates实现
// 功能:比较两个日期: 
// 如果d1在d2之前,返回-1;
// 如果d1在d2之后,返回1
// 如果d1和d2相同,返回0
int compare_dates(Date d1, Date d2) {
    if(d1.year < d2.year){
        return -1;
    }else if(d1.year > d2.year){
        return 1;
    }else{
        if(d1.month < d2.month){
            return -1;
        }else if(d1.month > d2.month){
            return 1;
        }else{
            if(d1.day < d2.day){
                return -1;
            }else if(d1.day > d2.day){
                return 1;
            }else{
                return 0;
            }
        }
    }
}

6. 实验任务6
此部分书写内容:
正确补足后完整的task6.c源码,及,运行结果截图

#include <stdio.h>
#include <string.h>

enum Role {admin, student, teacher};

typedef struct {
    char username[20];  // 用户名
    char password[20];  // 密码
    enum Role type;     // 账户类型
} Account;


// 函数声明
void output(Account x[], int n);    // 输出账户数组x中n个账户信息,其中,密码用*替代显示

int main() {
    Account x[] = {{"A1001", "123456", student},
                    {"A1002", "123abcdef", student},
                    {"A1009", "xyz12121", student}, 
                    {"X1009", "9213071x", admin},
                    {"C11553", "129dfg32k", teacher},
                    {"X3005", "921kfmg917", student}};
    int n;
    n = sizeof(x)/sizeof(Account);
    output(x, n);

    return 0;
}

// 待补足的函数output()实现
// 功能:遍历输出账户数组x中n个账户信息
//      显示时,密码字段以与原密码相同字段长度的*替代显示
void output(Account x[], int n) {
    int i,count = 0,j;
    enum Role a;
    char role[20];
    for(i = 0;i < n;i++){
        count = strlen(x[i].password);
        char password02[count];
        for(j = 0;j < count;j++){
            password02[i] = '*';
        }
        a = x[i].type;
        switch(a){
            case 0:
                strcpy(role,"admin");
            case 1:
                strcpy(role,"student");
            case 2:
                strcpy(role,"teacher");
        }
        printf("%s %s %",x[i].username ,password02,role);
    }
}

 

 

 

标签:head,202383290417,int,void,链表,实验,天意,printf,Film
From: https://www.cnblogs.com/zty170703/p/17894986.html

相关文章

  • 实验6_c语言结构体、枚举应用编程
    task4#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#defineN10typedefstruct{charisbn[20];charname[80];charauthor[80];doublesales_price;intsales_count;}Book;voidoutput(Bookx[],intn);voidsort(Bookx[],......
  • 实验六
    实验4#include<stdio.h>#defineN10typedefstruct{charisbn[20];//isbn号charname[80];//书名charauthor[80];//作者doublesales_price;//售价intsales_count;//销售册数}Book;voidou......
  • 实验六
    task41#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];//isbn号6charname[80];//书名7charauthor[80];//作者8doublesales_price;//售价9intsales_count;......
  • 实验6 C语言结构体、枚举应用编程
    实验任务4代码task4.c1#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];//isbn号6charname[80];//书名7charauthor[80];//作者8doublesales_price;//售价9intsale......
  • 实验六
    任务1//P286例8.17//对教材上的程序作了微调整,把输出学生信息单独编写成一个函数模块//打印不及格学生信息和所有学生信息程分别调用#include<stdio.h>#include<string.h>#defineN10//运行程序输入测试时,可以把这个数组改小一些输入测试typedefstructstudent{......
  • 实验6
    四、实验结论4.实验任务4此部分书写内容:正确补足后完整的task4.c源码,及,运行结果截图1#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];//isbn号6charname[80];//书名7charauthor[80];/......
  • 实验6
    task41#include<stdio.h>2#include<string.h>3#defineN104typedefstruct{5charisbn[20];6charname[80];7charauthor[80];8doublesales_price;9intsales_count;10}Book;11voidoutput(Book......
  • 实验三-电子公文传输系统1-个人贡献
    实验三-电子公文传输系统1-个人贡献1简述你完成的工作身为组长,组织组员相互配合,合理高效完成任务。参与组内文档的撰写工作。参与后端设计的代码编写以及前端设计的代码编写2你们小组总共的代码行数,你贡献的代码行数?相关代码链接?总共代码行数为55352行,其中大部分是gite......
  • 逻辑视图实验分析及其问题思考
    四实验分析及问题思考对于会员管理系统的实现视图模型实验,以下是对实验过程的分析及问题思考:实验过程分析:在会员管理系统的实现视图模型实验中,我们首先对会员信息、会员关系和会员积分三个子系统进行了独立的设计和开发。然后,通过接口和数据交互将这三个子系统集成在一起,形成......
  • 小学生教学辅助系统C语言实验报告
    一、实验目的(1)  掌握变量、函数的使用(2)  掌握选择结构、循环结构的使用(3)  熟悉模块化程序设计的方法二、实验仪器或设备微型计算机三、总体设计(设计原理、设计方案及流程等)设计一个简单的小学生计算机辅助教学系统,帮助小学生学习四则运算。使用模块化程序设计方法......