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

选题三 、我们自己来写,太“库”啦 ~
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
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值