HNU-计算机系统-讨论课7

news2024/11/15 13:37:43
选题三 、我们自己来写,太“库”啦 ~
1 ) 在 Linux 里用 C 语言进行代码设计,能对某一个班级、某一门 课程、某一名学生的分数进行分析,比如分数段、最高分、最低 分、排名、优势课程等,具体涉及分析内容尽量丰富,请各位同学根据个人对学校教务系统实际体感和期待来完成;
(2) 根据在第 7 章所学,请将这些功能,在 Linux 下分别编译形成相应的静态库/ 共享库,本组内为确保所设计的库功能,应测试确保本组所设计库可用,并提交库使用说明;
(3) 务必在 组间 进行库使用测评,根据同题组提供的库及库使用说明,编写测试代码,以评估同题组所设计的库功能的可用性与完整性( 以发现同题组所设计库的缺陷为主要目标)
(4) 从库的调用者角度, 比较分析 静态库 / 共享库对最终可执行文件的影响;
(5) 并据此,尝试解析 PIC (与位置无关代码) ,GOT (全局偏移量表),PLT (过程链表)等经典概念。
(Tips:具体分析代码的实现可由各组发挥,尽可能 完整 ——完整度是重要评估指标之一。要求报告中,要讲述库生成的具体方法(库设计组负责)与链接过程(库测试组负责),最终达到人人都理解 linux 下库的生成与调用方法
必做要求 本题至少需要 2 组交叉互测共同完成 ,例如 A 组设计静态库,B 组则设计共享库,然后进行交叉测评——A 组测试 B 组的共享库,B 组测试 A 组的静态库;如果有 3 组选择本题,则第 3 组的库设计不受静态库或共享库限制,可自定,那么三组之间则进行循环测评——A 组测 B 组所设计的库,B 组测 C 组所设计的库,C 组测 A 组所设计的库,进行互评。
{请各班选择本题时,即明确角色——静态库设计组与对应测试组, 共享库设计组与对应测试组,不受限库类型设计组与对应测试组}
我将先展示我们组的PPT,再展示我们组的静态库代码。
同题组的代码未经过他们允许,我不便展示。
(虽然他们肯定会同意的,纯粹是我懒,不想再弄了)
我们组的静态库代码编写由@Eliack和@DragonKing完成。向他们致以谢意。

 

 

 

 

 

 

 

 

         

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 附上我们组静态库的代码如下

//main.c
#include<stdio.h>
#include"STRUCT.h"
#include<stdlib.h>
struct Class temp;
int main(){
    int i;
    struct Class *two=&temp;
	for(i=0;i<=29;i++){
	two->stu[i].name=i+1;
	two->stu[i].Chinese=rand()%100;
	two->stu[i].Math=rand()%100; 
	}	 
	 
	stuaverage(two);
    stusubgrade(two);
    sturank(two);
    submaxmin(two);
    subaverage(two);
    classadvan(two);
   
    int select=0,n=0;   
    while(1){
    printf("Do you want to query the student's performance information?yes-1,no-0\n");
    scanf("%d",&select);
    switch(select){
    	case 1:
    printf("please scanf student name:");
        search(two,n);
        break;
        default:
        return;
    }
    } 
} 
//classadvan.c
#include<stdio.h>
#include"STRUCT.h"
void classadvan(struct Class *c){
	 if(c->sub[0].average>c->sub[1].average)
	 c->advansub=0;
	 else if(c->sub[0].average<c->sub[1].average)
	 c->advansub=1;
	 else  c->advansub=2;
	 if(c->advansub==0)
	 printf("The Class's advantage subject:Chinese\n"); 
	 else if(c->advansub==1)
	 printf("The Class's advantage subject:Math\n"); 
	 else printf("The strength of the two subjects in the class is the same\n");
}

 

//search.c
#include<stdio.h>
#include"STRUCT.h"
void search(struct Class *c,int n){
	 scanf("%d",&n);
	 int i;
	 for(i=0;i<30;i++){
	  if(c->stu[i].name==n){
      printf("student%d Chinese score:%d\n",c->stu[i].name,c->stu[i].Chinese);
      printf("student%d Chinese rank:%d\n",c->stu[i].name,c->stu[i].Chineserank);
      
	  if(c->stu[i].Chinesegrade==1) 
	  printf("student%d Chinese grade:execllent\n",c->stu[i].name); 
	  else if(c->stu[i].Chinesegrade==2)
	  printf("student%d Chinese grade:good\n",c->stu[i].name); 
	  else printf("student%d Chinese grade:fail\n",c->stu[i].name);
	  
	  printf("student%d Math score:%d\n",c->stu[i].name,c->stu[i].Math);
	  printf("student%d Math rank:%d\n",c->stu[i].name,c->stu[i].Mathrank);
	  if(c->stu[i].Mathgrade==1) 
	  printf("student%d Math grade:execllent\n",c->stu[i].name); 
	  else if(c->stu[i].Mathgrade==2)
	  printf("student%d Math grade:good\n",c->stu[i].name); 
   	  else printf("student%d Math grade:fail\n",c->stu[i].name);
	  
      printf("student%d weighted average score for each subject:%lf\n",c->stu[i].name,c->stu[i].average);
	  printf("student%d rank:%d\n",c->stu[i].name,c->stu[i].rank); 
	 	}
	 }
} 

 

//STRUCT.h
#include<stdio.h>
struct student{
       int name; 
       int Chinese;
       int Chineserank;
       int Chinesegrade;
       int Math;
       int Mathrank;
       int Mathgrade;
       int rank;
       double average;
};
struct subject{
       int max;
       int min;
       double average;
};
struct Class{
       struct student stu[30];
       struct subject sub[2];//0->Chinese 1->Math
       int advansub;
};

//stuaverage.c
#include<stdio.h>
#include"STRUCT.h"
void stuaverage(struct Class *c){
	int i;
	for(i=0;i<=29;i++){
	c->stu[i].average=c->stu[i].Chinese*0.7+c->stu[i].Math*0.3;
//	printf("学生%d的语文分数为:%d\n",c->stu[i].name,c->stu[i].Chinese);
//	printf("学生%d的数学分数为:%d\n",c->stu[i].name,c->stu[i].Math);
//	printf("学生%d的各科目的加权平均分为:%lf\n",c->stu[i].name,c->stu[i].average);
	}	 
}
//sturank.c
#include<stdio.h>
#include"STRUCT.h"

void sturank(struct Class *c){
   
    int i,j; 
    struct student t;

    for(i=0;i<30;i++){
    	for(j=0;j<30-i;j++)
    	{
    		if(c->stu[j].average<c->stu[j+1].average){
    		t=c->stu[j];
    		c->stu[j]=c->stu[j+1];
    		c->stu[j+1]=t;
    		} 
    	}
	}
    for(i=0;i<30;i++){
		c->stu[i].rank=i+1;
		//printf("学生%d的排名为%d,分数为%lf\n",c->stu[i].name,c->stu[i].rank,c->stu[i].average); 
	}
	
}
//stusubgrade.c
#include<stdio.h>
#include"STRUCT.h"
void stusubgrade(struct Class *c){
	int i;
	for(i=0;i<30;i++)
	{
		if(c->stu[i].Chinese>=80&&c->stu[i].Chinese<=100)
	    c->stu[i].Chinesegrade=1;
	    else if(c->stu[i].Chinese>=60&&c->stu[i].Chinese<80)
	    c->stu[i].Chinesegrade=2;
	    else c->stu[i].Chinesegrade=3;
	}
   for(i=0;i<30;i++)
	{
		if(c->stu[i].Math>=80&&c->stu[i].Math<=100)
	    c->stu[i].Mathgrade=1;
	    else if(c->stu[i].Math>=60&&c->stu[i].Math<80)
	    c->stu[i].Mathgrade=2;
	    else c->stu[i].Mathgrade=3;
	}
	 
//	 for(i=0;i<30;i++)
//	{
//	 if(c->stu[i].Chinesegrade==1) 
//	 printf("学生%d的语文科目的等级为:优秀\n",c->stu[i].name); 
//	 else if(c->stu[i].Chinesegrade==2)
//	 printf("学生%d的语文科目的等级为:良好\n",c->stu[i].name); 
//	 else printf("学生%d的语文科目的等级为:不及格\n",c->stu[i].name);
//	 
//	 if(c->stu[i].Mathgrade==1) 
//	 printf("学生%d的数学科目的等级为:优秀\n",c->stu[i].name); 
//	 else if(c->stu[i].Mathgrade==2)
//	 printf("学生%d的数学科目的等级为:良好\n",c->stu[i].name); 
//	 else printf("学生%d的数学科目的等级为:不及格\n",c->stu[i].name);
//    }
}

//subaverage.c
#include<stdio.h>
#include"STRUCT.h"
void subaverage(struct Class *c){
   int i; 
   int sum=0;
   for(i=0;i<30;i++){
   	 
   	  sum+=c->stu[i].Chinese;
   }
   c->sub[0].average=sum/30;
   printf("Chinese average score:%lf\n",c->sub[0].average); 
   sum=0;
   for(i=0;i<30;i++){
   	  sum+=c->stu[i].Math;
   }
   c->sub[1].average=sum/30;
   printf("Math average score:%lf\n",c->sub[1].average); 
}
//submaxmin.c
#include<stdio.h>
#include"STRUCT.h"
void submaxmin(struct Class *c){
    int i,j; 
    struct student t;
    for(i=1;i<30;i++){
    	for(j=0;j<30-i;j++)
    	{
    		if(c->stu[j].Chinese<c->stu[j+1].Chinese){
    		t=c->stu[j];
    		c->stu[j]=c->stu[j+1];
    		c->stu[j+1]=t;
    		} 
    	}
	}
    
	for(i=0;i<30;i++){
		c->stu[i].Chineserank=i+1;
	}

    c->sub[0].min=c->stu[29].Chinese;
    c->sub[0].max=c->stu[0].Chinese;
    printf("Chinese highese score:%d,lowese score:%d\n",c->sub[0].max,c->sub[0].min); 
        for(i=1;i<30;i++){
    	    for(j=0;j<30-i;j++)
    	    {
    		    if(c->stu[j].Math<c->stu[j+1].Math){
    		    t=c->stu[j];
    	     	c->stu[j]=c->stu[j+1];
    	    	c->stu[j+1]=t;
    		    } 
    	    }
	    }
    for(i=0;i<30;i++){
		c->stu[i].Mathrank=i+1;
	}
	
    c->sub[1].min=c->stu[29].Math;
    c->sub[1].max=c->stu[0].Math;
    printf("Math highest score:%d,lowest score:%d\n",c->sub[1].max,c->sub[1].min); 
}

说明文档

#第三组静态库说明

在此库中,我们组完成了如下设计:

```
struct student{
       int name; 
       int Chinese;
       int Chineserank;
       int Chinesegrade;
       int Math;
       int Mathrank;
       int Mathgrade;
       int rank;
       double average;
};
此结构体代表一个学生,包含了他的两类科目成绩:Chinese,Math。这里特别说明,我们给到这两门课的权重分别70%,30%,以便计算后续的核心加权分数average。Chineserank,Mathrank代表该学生的科目的排名。Chinesegrade,Mathgrade代表该学生的科目的等级。rank代表学生的加权平均分的排名。

struct subject{
       int max;
       int min;
       double average;
};
此结构体代表一门科目,包含了一个班级该科目的最高分和最低分以及平均分。

struct Class{
       struct student stu[30];
       struct subject sub[2];//0->Chinese 1->Math
       int advansub;
};
此结构体代表一个班级,包含了两个数组,学生类数组有30个元素代表一个班有30人。科目类数组有两个元素,代表两个科目。advansub代表该班的优势科目。

```

```

在我们的main中只定义了一个班级指针:two,它指向一个Class结构体。

```

我们一共实现了如下七个功能:

计算每个学生的加权平均分;(stuaverage(),一个参数,是Class结构体指针c)
计算每个学生每门科目的等级; (stusubgrade(),一个参数,是Class结构体指针c)
计算每个学生的加权平均分排名;(sturank(),一个参数,是Class结构体指针c)
计算该班级每个科目的最高分和最低分,以及为每个科目的成绩进行排名;(submaxmin(),一个参数,是Class结构体指针c)
计算该班级每门科目的平均分;(subaverage(),一个参数,是Class结构体指针c)
计算该班级的优势科目;(classadvan(),一个参数,是Class结构体指针c)
根据输入的学生名字查询该学生成绩信息;(search(),两个参数,一个是Class结构体指针c,另一个是输入的学生姓名n)



将八个函数分别写入各自的.c文件,后用gcc -c生成各自的.o文件 
再用ar rcs taicoolla.a +.o文件生成静态库
最后gcc -static -o test1 main.o ./taicoolla.a生成可执行文件test1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机系统基础bomb lab】CSAPP实验:Bomb Lab

CSAPP 实验&#xff1a;Bomb Lab 实验内容简述 作为实验目标的二进制炸弹 “Bomb Lab” Linux可执行程序包含了多个阶段(或关卡)&#xff0c;在每个阶段程序要求输入一-个特定字符串&#xff0c;如果输入满足程序代码所定义的要求&#xff0c;该阶段的炸弹就被拆除了&#xf…

基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(二)硬件设计

3.1 引言 采集卡的硬件设计是实现采集功能的基础&#xff0c;良好的硬件设计可以使采集功能更容 易实现&#xff0c;方便软件开发。本章基于第二章的硬件设计方案来详细介绍采集卡硬件设计。 包括载卡和子卡的芯片的选型、配置和具体电路的设计。载卡和子卡的硬件设计总体 …

美联储内部分歧不断加大 妥协方案:6月“跳过”,7月再加

在周五举行的托马斯劳巴赫研究会议上&#xff0c;美联储主席鲍威尔、前主席伯南克一同出席&#xff0c;并对当前的热点政策问题发表了看法。货币政策&#xff0c;自然是备受关注的议题。 凭借研究“银行和金融危机”荣获2022年诺贝尔经济学奖的伯南克表示&#xff0c;银行业危机…

Linux文件与目录管理笔记1

鸟哥私房菜笔记 这里写目录标题 常用文件命令cd,pwd,mkdir,rmdir 执行文件的路径的变量:$PATHls,cp,rm,mv 文件内容查看指令(cat,tac,nl)可翻页查看(more,less)More(一页一页翻动)less 数据截取&#xff08;head,tail&#xff09;非纯文本文件&#xff1a;od 常用文件命令 cd…

lwIP:宏 LWIP_TCPIP_CORE_LOCKING(内核锁定)

从 lwIP-2.0.0 开始&#xff0c;在 opt.h 中多了一个宏开关 LWIP_TCPIP_CORE_LOCKING&#xff0c;默认使能。这个宏是启用内核锁定功能的。 本文探索这个宏的前世今生。 2007 年 5 月 24 日&#xff0c;Simon Goldschmid &#xff08;以下简称 西蒙 &#xff09;提交了一个任务…

DriveAct:用于自动驾驶汽车细粒度驾驶员行为识别的多模态数据集

Drive&Act&#xff1a;A Multi-modal Dataset for Fine-grained Driver Behavior Recognition in Autonomous Vehicles 摘要1. 简介2. 其它驾驶员动作数据集3. Drive&Act数据集3.1 数据采集3.2 记录的数据流传感器设置和视频流3D Body Pose3D Head PoseInterior ModelA…

接口优化技巧汇总

1.批处理 批量思想&#xff1a;批量操作数据库&#xff0c;这个很好理解&#xff0c;我们在循环插入场景的接口中&#xff0c;可以在批处理执行完成后一次性插入或更新数据库&#xff0c;避免多次IO。 //批量入库 batchInsert();2.异步处理 异步思想&#xff1a;针对耗时比较…

短视频去水印接口 支持各短视频平台去水印 快速稳定

短视频去水印接口 支持各短视频平台去水印&#xff0c;抖音、快手、微视、西瓜等。 快速稳定 不限次 免费测试 接口开发文档 返回格式&#xff1a; JSON 请求方式&#xff1a; GET/POST 请求示例&#xff1a; 请求参数说明&#xff1a; 字段必填类型说明url是String短视…

听说你想成为一名6的飞起的黑客,这些资料怎么能少

重点提醒&#xff1a;本项目工具来源于互联网&#xff0c;是否含带木马及后门请自行甄别&#xff01;&#xff01;Hvv来即&#xff0c;请大家提高警惕&#xff01;&#xff01;&#xff01; 受限于篇幅原因&#xff0c;无法全部展示&#xff0c;如果你需要的话&#xff0c;可以…

【正点原子STM32连载】 第十章 STM32CubeMX简介 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十章…

教你精通Java语法之第十四章、枚举

目录 一、背景及定义 二、使用 2.1switch语句 2.2常用方法 三、枚举优点缺点 四、枚举和反射 4.1枚举是否可以通过反射&#xff0c;拿到实例对象呢&#xff1f; 五、总结 六、面试问题 一、背景及定义 枚举是在JDK1.5以后引入的。主要用途是&#xff1a;将一组常量组织…

触发器章节小结

触发器&#xff08;Flip Flop&#xff09; 4.1 SR锁存器&#xff08;Set-Reset Latch&#xff09; 4.1.1 或非门构成的SR锁存器 SD称为置位端或置1输入端&#xff1b; RD称为复位端或置0输入端。 当SD 1、RD 0时,Q1、Q’0。在SD 1信号消失以后&#xff08;即SD 回到0)&#…

AI绘画-Midjourney基础1-突破想象的界限:掌握文本引导的图像生成技巧

Midjourney是一款 AI 绘画工具&#xff0c;可以根据你的提示&#xff08;本文中称为 prompt&#xff09;创作出各种图像。你只需要在Discord上和一个机器人聊天&#xff0c;就可以用简单的命令来控制它。目前已不支持免费试用&#xff0c;可以选择付费计划来获得更多功能和优势…

viet构建项目及<script setup>的用法

vite构建项目 官方文档&#xff1a;https://v3.cn.vuejs.org/guide/installation.html#vite vite 官网&#xff1a;https://vitejs.cn 什么是 vite&#xff1f;—— 新一代前端构建工具。 优势如下&#xff1a; 开发环境中&#xff0c;无需打包操作&#xff0c;可快速的冷启动。…

操作系统易错题

操作系统易错题 假设某硬盘由5个盘片构成&#xff08;共有8个记录面&#xff09;&#xff0c;盘面有效记录区域的外直径为30cm&#xff0c;内直径为10cm&#xff0c;记录位密度为250位/mm&#xff0c;磁道密度为16道/mm&#xff0c;每磁道分16个扇区&#xff0c;每扇区512字节&…

【图像分割】卫星遥感影像道路分割:D-LinkNet算法解读

前言 因为毕设中的部分内容涉及到卫星遥感影像道路分割&#xff0c;因此去对相关算法做了一些调研。 本文所使用数据集为DeepGlobe&#xff0c;来自于CVPR2018年的一个挑战赛&#xff1a;DeepGlobe Road Extraction Challenge。 D-LinkNet为该挑战赛的冠军算法。 考虑到D-Lin…

时间序列预测 | Matlab基于遗传算法优化BP神经网络(GA-BP)的时间序列预测,matlab代码

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab基于遗传算法优化BP神经网络(GA-BP)的时间序列预测,matlab代码 评价指标包括:R2、MAE、MSE、RMSE等,代码质量极高,方便学习和替换数据。 部分源码 %% 清空环境变量 warning off …

Flink学习——处理函数ProcessFunction及多流转换

处理函数 在DataStream的更底层&#xff0c;我们可以不定义任何具体的算子&#xff08;如map()&#xff0c;filter()等&#xff09;二只提炼出一个统一的“处理”&#xff08;process&#xff09;操作 。它是所有转换算子的概括性的表达。可以自定义处理逻辑。 所以这一层接口就…

Springcloud1--->Eureka注册中心

目录 Eureka原理Eureka入门案例编写EurekaServer将user-service注册到Eureka消费者从Eureka获取服务 Eureka详解基础架构高可用的Eureka Server失效剔除和自我保护 Eureka原理 Eureka&#xff1a;就是服务注册中心&#xff08;可以是一个集群&#xff09;&#xff0c;对外暴露自…

开心档之MySQL 数据类型

目录 MySQL 数据类型 数值类型 日期和时间类型 字符串类型 MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL 支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串(字符)类型。 数值类型 MySQL 支持所有标准 SQL 数值数据类型…