选题三
、我们自己来写,太“库”啦
~
(
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