BUPT2021秋季计算导论第十四次实验

函数题

实验11_4_综合成绩排名-Swap (100 分)
众所周知,计算机院要对申请转入计算机大类的学生进行考核,考核方式包括机试和面试。学生综合成绩采取百分制,其中50%由机试成绩核算,另50%由学生已获得的加权成绩核算。综合成绩优秀者可进入面试环节。现请你写一个根据学生成绩来确定综合成绩排名的程序。

输入: 第一行为一个整数n(0<n<100),代表学生人数。 后边n行为学生信息,格式为,一个字符串代表学生学号(长度不超过15),后边为两个整数,前边的代表机试成绩,后一个代表学生已获得的加权成绩。(两类成绩均在0到100之间)。

输出: 共n行,按综合成绩(机试成绩加加权成绩)从高到低每行输出每个学生的信息,如果综合成绩相同,则机试成绩高的学生在前。每行的格式为:一个字符串(学生学号)加三个整数(4个数据之间均用一个空格分隔),这三个整数依次为综合成绩,机试成绩和加权成绩,测试用例保证输入合法且不存在成绩完全相同的学生。

程序中用的结构体定义及各成员含义如下:

typedef struct
{
char id[16] ; //学生账号
int total ; //综合成绩
int ce ; //机试成绩
int ws ; //加权成绩
}STUDENT;
程序中用到3个函数,分别为:

void Swap(STUDENT * s1,STUDENT * s2) ;

其中参数s1,s2为指向两个结构体的指针,其功能是将这两个指针指向的结构体内的值互相交换。

int Comp(STUDENT * s1,STUDENT * s2) ;

其中参数s1,s2为指向两个结构体的指针,其功能是比较两个结构体, 如果s1>s2则返回1,否则返回0。这里s1>s2指的是s1的总分高,或者总分相同时指的是s1的机试成绩高。测试用例保证输入合法且不存在成绩完全相同的学生。

void Sort(STUDENT a[],int size) ;

其中参数a为待排序的结构体数组,size为数组中学生的数量。其功能是将a按题目指定规则排序。

函数接口定义:
本题中大家只需实现下边这一个函数,另外两个函数不需实现,函数接口如下:
void Swap(STUDENT * s1,STUDENT * s2) ;
裁判测试程序样例:
#include <stdio.h>

typedef struct
{
char id[16] ;//学生账号
int total ; //综合成绩
int ce ; //机试成绩
int ws ; //加权成绩
}STUDENT;

void Sort(STUDENT a[],int size) ;
void Swap(STUDENT * s1,STUDENT * s2) ;
int Comp(STUDENT * s1,STUDENT * s2) ;

int main()
{
STUDENT stu[100] ;
int i , n ;

scanf("%d",&n) ;
for(i=0;i<n;i++)
{
    scanf("%s%d%d",stu[i].id,&stu[i].ce,&stu[i].ws) ;
    stu[i].total = stu[i].ce+stu[i].ws ;
}
        
Sort(stu,n) ;
for(i=0;i<n;i++)
    printf("%s %d %d %d\n",stu[i].id,stu[i].total,stu[i].ce,stu[i].ws) ;

return 0;    

}

/* 请在这里填写答案 */
输入样例:
3
bupt_2018210001 78 74
bupt_2018210002 95 71
bupt_2018210003 84 75
输出样例:
bupt_2018210002 166 95 71
bupt_2018210003 159 84 75
bupt_2018210001 152 78 74

void Swap(STUDENT * s1,STUDENT * s2)
{
	STUDENT temp ;
	temp = *s1 ;
	*s1 = *s2 ;
	*s2 = temp ;
}

综合成绩排名——Swap

void Swap(STUDENT * s1,STUDENT * s2)
{
	STUDENT temp ;
	temp = *s1 ;
	*s1 = *s2 ;
	*s2 = temp ;
}


综合成绩排名——Comp

int  Comp(STUDENT * s1,STUDENT * s2) 
{
	if(s1->total > s2->total)
	{
		return 1;
	}
	else if(s1->total == s2-> total )
		 {
		 	if(s1->ce > s2-> ce)
		 	{
		 		return 1;
			 }
		 }
	return 0 ;
}

综合成绩排名——Sort

void Sort(STUDENT a[],int size)
{
	int i , j ;
	for (i = 0 ;i < size ; i++)
	{
		
		for (j = i + 1 ; j <size ; j++)
		{
			if(!Comp (&a[i] , &a[j]))
			{
				Swap(&a[i] , &a[j]);
			}
		}
	}
}

字符串排序

实验10_11_字符串排序(指针数组) (100 分)
1、设计函数char ** create1( int n ) ;,根据整数n创建一个长度为n的字符指针型动态一维数组,并返回动态数组第一个元素的地址。

2、设计函数char * create2( int n ) ;,根据整数n创建一个长度为n的字符型动态一维数组,并返回动态数组第一个元素的地址。

3、设计函数void sort( char** strArray , int size ) ; ,该函数可将字符指针数组strArray所指向的所有字符串按从小到大排列。

输入第一行为一个不超过200的整数n,代表待排序字符串的个数。然后输入n个字符串,每个字符串长度不会超过100。

输出为排序后的n个字符串,每个字符串占一行。

函数接口定义一:
char ** create1( int n ) ;
其中 n 为字符指针数组的长度; 函数需返回动态数组第一个元素的地址。如果没有获得内存则返回NULL。

函数接口定义二:
char * create2( int n ) ;
其中 n 为字符数组的长度; 函数需返回动态数组第一个元素的地址。如果没有获得内存则返回NULL。

函数接口定义三:
void sort( char** strArray , int size ) ;
其中 strArray 和 size 都是用户传入的参数。 strArray 为字符指针数组; size 是数组的长度。函数没有返回值。

裁判测试程序样例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 101

char ** create1( int n ) ;
char * create2( int n ) ;
void sort( char** strArray , int size ) ;

int main()
{
char** strArray ;
int n , i ;

scanf("%d",&n) ;
strArray = create1( n ) ; 
if ( strArray != NULL ) 
{
    for ( i = 0 ; i < n ; i++ ) 
    {
        strArray[i] = create2( MAX ) ;
        if ( strArray[i] == NULL ) return -1 ;
    }            
}
else return -1 ;//这里两个 return -1 都是无法获得内存时直接结束程序 

getchar();//吃掉前边输入的回车符 

for( i = 0 ; i < n ; i++ ) 
    gets(strArray[i]); //读入字符串 
    
sort( strArray , n ) ; //排序 

for( i = 0 ; i < n ; i++ ) 
    printf("%s\n",strArray[i]); //输出
    
for ( i = 0 ; i < n ; i++ )  
    free(strArray[i]) ;
free(strArray) ;

return 0;

}

/* 请在这里填写答案 */
输入样例:
5
bbb
zzzzzz
aabbbccc
aaaaaa
abbbbb
输出样例:
aaaaaa
aabbbccc
abbbbb
bbb
zzzzzz

char **    create1( int n )
{
	char ** p ;
	p = (char **)malloc(sizeof(char *)*n);
	return p;
}


char *    create2( int n )
{
	char * s ;
	s= (char *)malloc(sizeof(char) * n) ;
	return s ;
}


void    sort( char** strArray , int size )
{
	int i , j ;
	char *s ;
	for ( i = 0; i< size ; i++)
	{
		for ( j = i+1 ; j < size ; j++)
		{
			int k = 0;
			for ( k = 0 ; *(strArray+i)+ k != '\0' ; k++ )
			{
				if(*(*(strArray + i) + k) > *(*(strArray + j ) + k))
				{
					s = strArray[j];
					strArray[j] = strArray[i];
				    strArray[i] = s ;
				    break ;
			   } 
			   if(*(*(strArray + i) + k) < *(*(strArray + j ) + k))
		  		{
		  			break ;
				  }
			   
		   }
    	}
    }
}

编程题

初识结构体

实验11_1_初识结构 (100 分)
学生的属性包括姓名、学号、5门课程的成绩、平均成绩与总成绩。已知一个学生的姓名、学号与5门课程的成绩,你的任务是计算该学生的平均成绩与总成绩,并将该学生的5门课程成绩按照从高到底进行排序,最后将这个同学的完整信息输出。学生的姓名中只能包含大小写字母与空格字符,不会超过20个字符;学生的学号是个长度不会超过20的字符串,只包含数字字符;课程成绩均为0—100的整数。

要求:

1.在本题中,你要设计一个结构来存储学生的信息。在此结构中,需要有一个字符数组来存储姓名;一个字符数组来存储学号;一个长度为5的整型数组来存储5门课程的成绩;一个双精度浮点型变量存储平均成绩,一个整型变量存储总成绩。

2.在对结构变量的成员进行赋值与排序的时候,你要使用“结构变量名+‘.’+结构成员名”这种方式访问变量,如“student.score”;而在输出学生信息时,你要用一个结构指针指向该结构,然后用结构指针访问结构中的变量,即“结构指针名+‘->’+结构成员名”,如“ptr->score”。

输入格式:
学生信息的输入按照姓名、学号、5门课程成绩的顺序输入,共占三行,具体格式见样例。

输出格式:
姓名占一行;学号占一行;5门成绩中间用空格分开,最后一个成绩后是换行符,从高到底进行排序,占一行;平均成绩与总成绩用空格分隔,占一行,平均成绩保留两位小数。

输入样例:
Liu Mengmeng
0821131666666
88 90 93 91 85
输出样例:
Name:Liu Mengmeng
ID:0821131666666
Score:93 91 90 88 85
average:89.40 total:447

在这里插入代#include<stdio.h>

typedef struct node{
	char name[20] ;
	char id[20] ;
	int score[10] ;
}Student;


int main()
{
	Student  s;
	gets(s.name);
    
	gets(s.id) ;
	int i ;
	int sum = 0;
	for (i = 0; i<5 ; i++)
	{
		scanf("%d", &s.score[i]) ;
		sum = sum + s.score[i] ;
	}
	int j ;
	int k ;
	for ( j = 0; j< 5 ; j++)
	{
		for (k =j +1 ; k< 5; k++)
		{
			if ( s.score[j] < s.score[k])
			{
				int temp ;
				temp = s.score[j] ;
				s.score[j] = s.score[k] ;
				s.score[k] = temp ;
			}
		}
	 } 
	double average ;
	Student *ptr ;
	ptr = &s ;
	average = (sum  * 1.00)/ 5 ;
	printf("Name:");
	puts(ptr->name) ;
	printf("ID:");
	puts(ptr->id) ;
	printf("Score:");
	for ( j =0 ; j< 4; j++)
	{
		printf("%d ", s.score[j]) ;
	}
	printf("%d\n", s.score[j]) ;
	printf("average:%.2f total:%d\n", average , sum) ;
	return 0;
	
	
}

初识结构数组实验11_2_初识结构数组 (100 分)

有n名学生,每个学生的信息包括姓名、学号、5门课程的成绩,平均成绩与总成绩。已知学生的姓名、学号与5门课程的成绩,你的任务是计算每个学生的平均成绩与总成绩,并将它们输出。学生的姓名中只能包含大小写字母与空格字符,不会超过20个字符;学生的学号是个长度不会超过20的字符串,只包含数字字符;课程成绩均为0—100的整数。

要求:在本题中,你要设计一个结构来存储一个学生的信息。在此结构中,需要有一个字符数组来存储姓名;一个字符数组来存储学号;一个长度为5的整型数组来存储5门课程的成绩;一个双精度浮点型变量存储平均成绩,一个整型变量存储总成绩。然后,你要设计一个结构数组来存储n名学生的信息。

输入格式:
输入首先是一个正整数n,代表学生的数量,1<=n<=100;每名学生的信息按照姓名、学号、5门课程成绩的顺序输入,共占三行。输入具体格式见样例。

输出格式:
姓名占一行;学号占一行;5门课程成绩中间用空格分开,最后一个成绩后是换行符,占一行;平均与总成绩用空格分隔,占一行,平均成绩保留两位小数;每名同学的信息后都再输出一个空行。 注意:每名同学的信息后都再输出一个空行。

输入样例:
4
xiaowang
0821131699999
87 98 79 90 68
Liu Mengmeng
0821131666666
88 90 93 91 85
Albert Einstein
0821131477777
75 87 100 66 64
Bill Gates
0821131588888
65 58 77 60 61
输出样例:
Name:xiaowang
ID:0821131699999
Score:87 98 79 90 68
average:84.40 total:422

Name:Liu Mengmeng
ID:0821131666666
Score:88 90 93 91 85
average:89.40 total:447

Name:Albert Einstein
ID:0821131477777
Score:75 87 100 66 64
average:78.40 total:392

Name:Bill Gates
ID:0821131588888
Score:65 58 77 60 61
average:64.20 total:321

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

typedef struct node {
	char name[20] ;
	char id[20] ;
	int data[5] ;
	double average ;
	int sum ;
}student ;


int main()
{
	int n ;
	scanf("%d", &n) ;
	getchar();
	student s[100] ;
	int i ;
	for (i = 0; i<n ; i++)
	{
		gets(s[i].name) ;
		gets(s[i].id) ;
		int j ;
		s[i].sum = 0 ;
		for (j = 0;j < 5; j++)
		{
			scanf("%d", &s[i].data[j]) ;
			s[i].sum = s[i].sum + s[i].data[j] ;
		}
		getchar();
		s[i].average = (s[i].sum * 1.00) / 5 ;
	}
	int k ;
	for ( k = 0 ; k< n; k ++)
	{
		printf("Name:%s\n", s[k].name);
		printf("ID:%s\n", s[k].id) ;
		printf("Score:");
		int m ;
		for ( m= 0; m< 4 ; m++)
		{
			printf("%d ", s[k].data[m]) ;
		 } 
		printf("%d\n", s[k].data[4]) ;
		printf("average:%.2lf total:%d\n", s[k].average , s[k].sum) ;
		printf("\n") ;
	}
	return 0;
}

结构排序

实验11_3_结构排序 (100 分)
有n名学生,每个学生的属性包括姓名与总成绩。已知学生的姓名与总成绩,你的任务是将学生的信息按照以下方式排序:首先比较总成绩,总成绩高的在前面,总成绩低的在后面,当总成绩相同时,你要比较学生的姓名,姓名字典序小的同学在前面,姓名字典序大的同学在后面(ASCII码顺序)。n的范围是1—100;学生的姓名中只能包含大小写字母,不会超过20个字符;总成绩为整数。

要求:在本题中,你要设计一个结构来存储学生的信息。在此结构中,需要有一个字符数组来存储姓名,一个整型变量存储总成绩。

输入格式:
首先输入一个正整数n,代表学生的数量,1<=n<=100;每名学生的信息按照姓名、总成绩的顺序输入(空格分开),每名学生信息占一行。具体格式见样例。

输出格式:
n名学生的信息,姓名占一行,总成绩占一行,输出顺序要按照题目的要求,每名同学的信息后都再输出一个空行。 注意:每名同学的信息后都再输出一个空行。

输入样例:
4
AlbertEinstein 1328
GeorgeWalkerBush 860
LiuMengmeng 1475
BillGates 1328
输出样例:
Name:LiuMengmeng
total:1475

Name:AlbertEinstein
total:1328

Name:BillGates
total:1328

Name:GeorgeWalkerBush
total:860

#include<stdio.h>
typedef struct node {
	char name[30] ;
	int score ;
}s;


void swap (s * , s *);

int main()
{
	int n ;
	scanf("%d", &n) ;
	int i;
	s stu[100] ;
	for (i = 0;i < n ; i++)
	{
		getchar();
		scanf("%s", stu[i].name);
		scanf("%d", &stu[i].score) ;

	}
		int j ; 
	for (i = 0; i< n ; i++)
	{
		for (j =  i ; j< n ; j++)
		{
			if ( stu[i].score <stu[j].score)
			{
				swap (&stu[i], &stu[j]);
			}
		}
	}
	for ( i = 0 ; i< n -1 ; i++)
	{
		if (stu[i].score == stu[i+1].score)
		{
			int k ;
			for (k = 0 ;stu[i].name[k] != '\0' ; k++)
			{
				if(stu[i].name[k] > stu[i+1].name[k] )
					{
						swap(&stu[i] , &stu[i+1]) ;
						break ;
					}
				    if(stu[i].name[k]  < stu[i+1].name[k])
				    {
				    	break ;
					}
		    } 
		}
	}
	for (i = 0 ; i< n; i++)
	{
		printf("Name:"); 
		puts(stu[i].name) ;
		printf("total:%d\n",stu[i].score );
		printf("\n");
	}
 } 
 
 void swap(s *s1 , s *s2)
 {
 	s temp ;
 	temp = *s1 ;
 	*s1 = *s2 ;
 	*s2 =temp ;
 }

学生管理系统

实验11_7_学生信息管理系统 (100 分)
创建学生信息管理系统,具体要求如下:

学生信息包括:学号 姓名 数学成绩 英语成绩 计算机成绩

功能1:添加学生信息 执行1时,输入学号,姓名,三门科目成绩;如果添加学生成功则输出“Add success”,如果学生已存在则输出“Students already exist”

功能2:删除学生信息 执行2时,输入学号信息;如果学生不存在,输出“Students do not exist”,如果存在,则输出“Delete success”

功能3:更改学生成绩信息 执行3时,输入学号信息;如果学生不存在,输出“Students do not exist”,如果存在,输出“Update success”

功能4:显示学生平均分成绩 执行4时,输入学号信息;如果学生不存在,输出“Students do not exist”,如果存在,则输出学生信息,如下格式:

Student ID:2019989890

Name:Jerry

Average Score:89.3

其中平均分为三门科目相加除以3,保留一位小数,每行之间换行。

输入格式:
第一行为一个整数n(0<n<130),后边共n行,每一行表示执行一种功能。其中1,2,3,4分别对应执行上面4种功能,具体格式见输入样例。 测试用例保证:学号和名字均为长度不超过10的字符串,各门课成绩为0到100之间的整数。

输出格式:
输入样例:
8
1 201817123 Tom 89 80 76
1 2019989890 Jerry 78 99 67
4 201817123
2 201817123
4 201817123
4 2019989890
3 2019989890 79 90 99
4 2019989890
输出样例:
Add success
Add success
Student ID:201817123
Name:Tom
Average Score:81.7
Delete success
Students do not exist
Student ID:2019989890
Name:Jerry
Average Score:81.3
Update success
Student ID:2019989890
Name:Jerry
Average Score:89.3

#include<stdio.h>
typedef struct node {
	int flag ;
	char name[10] ;
	long long id ;
	int score[3] ;
	double aver ;
}stu;

int main()
{
	int n ;
	scanf("%d", &n);
    stu s[130] ;
    int i ; 
	for ( i = 0 ; i< n ; i++)
	{
	    scanf("%d", &s[i].flag) ;
	    switch(s[i].flag){
	    	case 1 :scanf("%lld", &s[i].id);
	        		scanf("%s",s[i].name) ;
	    			scanf("%d %d %d", &s[i].score[0], &s[i].score[1], &s[i].score[2]);
	    			break ;
	    	case 2 :case 4 :scanf("%lld", &s[i].id);
	        				break ;
	        case 3: scanf("%lld", &s[i].id);
	        		scanf("%d %d %d", &s[i].score[0], &s[i].score[1], &s[i].score[2]);
	        		break ;
		}
	    
	}
	int j ;
	stu *S[130] ;
	int count = 0;
	int cf = 0;
	for (i = 0 ; i< n; i++)
	{
		switch(s[i].flag){
			  case 1 : printf("Add success\n");
			  
			           S[count] = &s[i];
					   count++;
					   break ;
			  case 2 : cf = 0;
			  		   for (j = 0 ; j< count  ;j ++)
			              {
			                 if(s[i].id == S[j]->id )
							 {
							 	printf("Delete success\n");
							 	int m ;
							 	for ( m = j ; m < count ; m ++)
							 	{
							 		S[m] = S[m+1] ;
								 }
								 count -- ;
							 	cf = 1;
 							 }       	
						  }
						  if (cf == 0)
					        {
					        	printf("Students do not exist\n");	
							 } 
		                 break ;
						  
			  case  3 :  cf = 0;
			  		   for (j = 0 ; j< count  ;j ++)
			              {
			                 if(s[i].id == S[j]->id )
							 {
							 	printf("Update success\n");
							 	int k ;
							 	for (k = 0 ; k< 3 ; k++)
							 	{
							 		S[j]->score[k] = s[i].score[k]; 
								 }
							 	cf = 1 ;
 							 }       	
						  }
						   if (cf == 0)
						   {
						    printf("Students do not exist\n");
						}
						    break ;
			   case 4 :  cf = 0;
			  		   for (j = 0 ; j< count  ;j ++)
			              {
			                 if(s[i].id == S[j]->id )
							 { 
							 	printf("Student ID:%d\n", S[j]->id);
							 	printf("Name:%s\n", S[j]->name);
							 	double average ;
							 	average = (S[j]->score[0] + S[j]->score[1] +S[j]->score[2] )*(1.0) / 3 ;
							 	printf("Average Score:%.1f\n", average) ;
							 	cf =1;
 							 }       	
						   } 
						if(cf == 0)
						{
						printf("Students do not exist\n");
						}
						break ;
				}
			
			  
   }
   

  return 0;
 } 

最后一题的代码还是有稍微瑕疵的QAQ…

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影不在遗忘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值