ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言 实验七

2022-01-21 21:58:37  阅读:242  来源: 互联网

标签:int 样例 C语言 char 实验 100 成绩 id


复制之前点个赞吧 ヾ(◍°∇°◍)ノ゙

6-1 实验7_11_循环移位 (100 分)

设计函数void shift(int *array , int num , int size ) ;,实现将整型数组内元素循环向左移若干位置。循环向左移位含义如下:

比如,原始数组a[0],a[1]...a[9]内元素依次为:1 2 3 4 5 6 7 8 9 10,循环向左移1位后,则a[0],a[1]...a[9]内元素依次为:2 3 4 5 6 7 8 9 10 1,循环向左移2位后,则a[0],a[1]...a[9]内元素依次为:3 4 5 6 7 8 9 10 1 2。依次类推。

函数接口定义:

void shift(int *array , int num , int size ) ;

其中 array 、 num和 size 都是用户传入的参数。 array 为指向原始数组的指针; num 为向左移的位数;size 为数组的大小。函数没有返回值。

裁判测试程序样例:


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

void shift(int *array , int num , int size ) ;

int main()
{
    int        i , n , p , array[100] ;
    
    scanf(" %d%d" , &n , &p ) ;//测试用例保证0<p<n<=100
    for( i = 0 ; i < n ; i++ )
        scanf( "%d" , &array[i] ) ;//测试用例保证所有输入可以用整型存储

    shift( array , p , n ) ;//向左移p位
    for( i = 0 ; i < n - 1 ; i++ )
        printf( "%d " , array[i] ) ;
    printf( "%d\n" , array[i] ) ;
        
    return 0;    
}

/* 请在这里填写答案 */

输入样例:

10 1
1 2 3 4 5 6 7 8 9 10

输出样例:

2 3 4 5 6 7 8 9 10 1

目录

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:


void shift(int *array,int num,int size){
	int a[100];
	for(int i=0;i<size;i++)
		a[i]=*(array+i);
	for(int i=0;i<size;i++){
		if(i<size-num) *(array+i)=*(array+i+num);
		else *(array+i)=a[i-size+num];
			
	}
	
	
}

6-2 实验7_10_发子弹 (100 分)

在某次实弹射击训练中,班长让战士们围成一圈发子弹。首先,班长给每个人发若干发子弹,然后按如下方法将每个战士手中的子弹进行调整:所有的战士检查自己手中的子弹数,如果子弹数为奇数,则向班长再要一颗。然后每个战士再同时将自己手中的子弹分一半给下一个战士(最后一个战士将手中的子弹分一半给第1个战士)。这种调整会一直进行下去,直到所有战士手中的子弹数相等为止。现请你写一个函数模拟这个调整的过程。

函数接口定义:

void distribute(int * bullets , int size , int number ) ;

其中 bullets 、 size 和 number 都是用户传入的参数。 bullets 为指向一个int 型数组的指针,该数组中依次存储着每个战士手中的子弹数,每次调整后该数组仍然依次存储着每个战士手中的子弹数 ; size 是战士的总数; number为调整的次数。函数没有返回值。

裁判测试程序样例:


#include<stdio.h>

#define        LEN        100

//调整函数 
void distribute(int * bullets , int size , int number ) ;

int main()
{
    int        bullets[LEN] ;
    int        n , m , i ;    
         
    scanf("%d" , &n ) ;    //读入战士总数 
    for( i = 0 ; i < n ; i++ )
    {
        scanf("%d" , &bullets[i] ) ;//读入每个战士手中初始的子弹数 
    }
    scanf("%d" , &m ) ;//读入调整的次数(m>0) 
    distribute(bullets , n , m ) ;//调整 
    for( i = 0 ; i < n - 1 ; i++ )//输出调整后结果 
    {
        printf("%d " , bullets[i] ) ;
    }
    printf("%d\n" , bullets[i] ) ;
    
    return 0;    
}


/* 请在这里填写答案 */

输入样例:

10
10 2 8 22 16 4 10 6 14 20
1

输出样例:

15 6 5 15 19 10 7 8 10 17

参考代码

void distribute(int * bullets , int size , int number ){
	int a[100]={0};
	for(int i=1;i<=number;i++){
	
		
		for(int j=0;j<size;j++){
		if(*(bullets+j)%2==0)  *(bullets+j)=*(bullets+j)/2;
		else *(bullets+j)=(*(bullets+j)+1)/2;}
		
		for(int j=0;j<size;j++) 
			a[j]=*(bullets+j);
	
		for(int j=1;j<size;j++)
		{ 
			*(bullets+j)+=a[j-1];
		}
		*bullets +=a[size-1];
		
	
	}
}

 

6-3 实验10_8_设计函数 void delcharfun(char *str,char ch) (100 分)

设计函数 void delcharfun(char *str,char ch)实现从字符串str中删除指定的字符ch。同一字母的大、小写按不同字符处理。

函数接口定义:

void delcharfun(char *str,char ch);

其中 str 和 ch 都是用户传入的参数。 str 为指向待删除数组的指针; ch 指定字符。函数没有返回值。

裁判测试程序样例:

#include<stdio.h>

void delcharfun(char *str,char ch);
 
int main()
{
    char    ch,str[110];
    
    scanf("%s",str);    //读入字符串 
    getchar();            //读取回车符号 
    scanf("%c",&ch);    //读入字符 
    delcharfun(str,ch);    //删除 
    printf("%s\n",str);    //输出删除后结果 
    return 0;    
}

/* 请在这里填写答案 */

输入样例:

abcABCabc#
b

输出样例:

acABCac#

参考代码 

 

void delcharfun(char *str,char ch){
	for(int i=0;str[i]!='\0';i++) {
        
        if(str[i]==ch) {
            for(int j=i;str[j]!='\0';j++){
                str[j]=str[j+1];
            }
            i--;
            }
            
      
    }

}

6-4 实验10_4_设计函数 locatesubstr (100 分)

设计函数 char *locatesubstr(char *str1,char *str2),查找str2指向的字符串在str1指向的字符串中首次出现的位置,返回指向该位置的指针。若str2指向的字符串不包含在str1指向的字符串中,则返回空指针NULL。 注意这里必须使用指针而不是数组下标来访问字符串。

函数接口定义:

char *locatesubstr(char *str1,char *str2);

其中 str1 和 str2 都是用户传入的参数,其含义如题面所述 。若查找成功则返回指向该位置的指针,若失败则返回空指针。

裁判测试程序样例:

#include <stdio.h>

char *locatesubstr(char *str1,char *str2);
int main()
{
    char str1[505],str2[505];
    char *p;
    gets(str1);
    gets(str2);
    p=locatesubstr(str1,str2);
    
    if(p==NULL)    printf("NULL!\n");
    else    puts(p);
    
    return 0;
}

/* 请在这里填写答案 */

输入样例:

didjfsd dabcxxxxxx
abc

输出样例:

abcxxxxxx

参考代码 

 

char *locatesubstr(char *str1,char *str2){
	int temp=0;
	while(*str1!='\0'&&*str2!='\0'){
		if(*str1!=*str2) {str1++;temp=0;}
		else {
			while(*str2!='\0'){
				if(*str1==*str2){
					str1++;
					str2++;
					temp++;
				}
				else {str2=str2-temp;temp=0;break;}
			}
			
		}
	}
	str1=str1-temp;
	if(temp==0) return NULL;
	else return str1;
}

6-5 数据清洗 (100 分)

数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。小明去某公司实习,公司交给了他一个数据清洗的任务。由于小明是实习生,所以数据清洗的算法公司已经给定,小明的任务仅仅是将清洗后合格的数据按原来的顺序存储并输出。可是小明仍无法完成这个任务,聪明的你能帮帮他吗?

数据清洗的函数原型为:

int dataCleaning(int n);

这里参数n为待处理数据,如果该数据是正确的函数则返回1,如果该数据不正确则函数返回0。在你的函数中需要调用这个函数(不需要实现,直接调用即可)来判断数据是否正确。

函数接口定义:

int getData(int source[] , int size , int target[] );

其中 source 、 size 和 target 都是用户传入的参数。 source 为待清洗数据; size 为数组source的长度; target为正确的数据。函数的返回值为正确数据的个数。

裁判测试程序样例:

#include<stdio.h>

int getData(int source[] , int size , int target[] );

int dataCleaning(int n);

int main()
{
    int        source[110] , target[110];
    int        i , n , size ;
    
    scanf( "%d", &n ) ;
    for ( i = 0 ; i < n ; i++ )
        scanf( "%d", &source[i] ) ; 
    size = getData( source , n, target ) ; 
    for ( i = 0 ; i < size - 1 ; i++ )
        printf( "%d " , target[i] ) ;
    printf( "%d\n" , target[i] ) ;
    
    return 0;    
}

/* 请在这里填写答案 */

输入样例:

10
62 58 20 69 92 4 99 67 12 88

输出样例:

样例解释:输入的10个整数中只有69、99和12是正确的数据。

69 99 12

参考代码 

int getData(int source[] , int size , int target[] ){
	int x=0;
	int test;
	for(int i=0;i<size;i++){
		test=dataCleaning(source[i]);
		if(test==1) {*(target+x)=source[i];x++;}	
	}
	return x;
}

6-6 递归求解之阿尔法乘积 (100 分)

计算一个整数的阿尔法乘积。对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身;否则的话,x的阿 尔法乘积就等于它的各位非0的数字相乘所得到的那个整数的阿尔法乘积。例如:4018224312的阿尔法乘积等于8,它是按照以下的步骤来计算的:

  4018224312 → 4*1*8*2*2*4*3*1*2 → 3072 → 3*7*2 → 42 → 4*2 → 8

编写一个程序,输入一个正整数(该整数可以用long long 存储),输出它的阿尔法乘积。

输入格式:输入只有一行,即一个正整数。

输出格式:输出相应的阿尔法乘积。

此题要求用递归函数实现,且不允许使用全局变量,其他方式不得分。

函数接口定义:

long long alpha(long long n) ;

其中 n 是用户传入的参数。 n 的值不超过long long的范围。函数须返回 n 的阿尔法乘积。

裁判测试程序样例:

#include <stdio.h>

//求一个整数阿尔法乘积的函数 
long long alpha(long long n) ;

int main()
{
    long long n;
    
    scanf("%lld",&n);    
    printf("%lld\n",alpha(n));
    
    return 0 ;
}

/* 请在这里填写答案 */

输入样例:

4018224312

输出样例:

8

参考代码

long long alpha(long long n){
	long long int x=1,test;
	if(n<10) return n;
	else{
		
	while(n!=0){
		test=n%10;
		if(test!=0) {x=x*test;n=n/10;}
		else {n=n/10;continue;}		
	}	
	return alpha(x);
	}
	
}

 

6-7 04_拆分字符串 (100 分)

任意给定一个字符串s(长度小于100),其中只包含大写字母“A—Z”和小写字母“a—z”。你的任务是把s中大写字母和小写字母分开,并分别存到指定的字符数组中。拆分后原字母顺序保持不变。本题要求用函数实现。

函数接口定义:

函数接口如下:
void split(const char *s, char *upper, char *lower) ;

其中 supper 和 lower 都是用户传入的参数。其中 s为待拆分字符串,upper为拆分后存大写字母的字符数组,lower为拆分后存小写字母的字符数组。函数返回值为空。

裁判测试程序样例:

函数被调用进行测试的例子如下:
#include<stdio.h>

void split(const char *s, char *upper, char *lower) ;

int main()
{
       char    s[100] , upper[100] , lower[100] ; 
       
       scanf("%s",s);
      split( s , upper , lower ) ;    
       printf("%s\n%s\n", upper , lower) ;

    return 0;
}

/* 请在这里填写答案 */

输入样例:

HwEorLLldO

输出样例:

HELLO
world

参考代码

void split(const char *s, char *upper, char *lower){
	while(*s!='\0'){
		if(*s>='A'&&*s<='Z'){
			*upper=*s;
			upper++;
			s++;
		}
		else if(*s>='a'&&*s<='z'){
			*lower=*s;
			lower++;
			s++;
		}
		*upper='\0';
		*lower='\0';
		
	}

 

 

6-8 实验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按题目指定规则排序。

裁判测试程序样例:

#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 stu;
	strcpy(stu.id,s1->id);
	stu.total=s1->total;
	stu.ce=s1->ce;
	stu.ws=s1->ws;
	
	strcpy(s1->id,s2->id);
	s1->total=s2->total;
	s1->ce=s2->ce;
	s1->ws=s2->ws;
	
	strcpy(s2->id,stu.id);
	s2->total=stu.total;
	s2->ce=stu.ce;
	s2->ws=stu.ws;
	
}

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;
		else return 0;
	}
    else if(s1->total<s2->total) return 0;
}



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

7-1 单词统计 (100 分)

给定的字符串中只包含#和小写字母,其中#是分隔符,连续的小写字母构成单词。单词内部不会包含#号,也不存在两个单词之间没有#的情况。请你写一个程序来统计一下一行字符串中单词的数量和#的数量。

输入格式:

第一行为一个整数n(0<n<10),代表共有n个字符串。后边n行,每行一个长度不超过100的字符串。

测试用例保证输入合法。

输出格式:

共n行,每行依次对应输入各个字符串。

每行的格式如下:

首先是一个整数,代表单词的数量,跟着是一个空格;然后又是一个整数,代表#的数量,跟着又是一个空格;最后依次输出所有单词,单词之间用一个空格分隔,最后一个单词后边没有空格。如果单词的数量为0,则在应该输出单词的位置输出三个连续的#。

输入样例:

2
#
hello#world

输出样例:

0 1 ###
2 1 hello world

参考代码 

#include<stdio.h>
#include<string.h>
int main(){
	int i,j,n;
	char str[105];
	int len;
	int x=0,y=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%s",str);
		len=strlen(str);
		x=0;y=0;
		char b[105];
		int ppp=0;
		for(j=0;j<len;j++){
			if(str[j]!='#'){
				if(j==0||str[j-1]=='#') {x++;}
				b[ppp]=str[j];
				ppp++;
			}
			else{
				if(j<len-1&&str[j+1]!='#'&&x>0){
					b[ppp]=' ';
					ppp++;
				}
			y++;	
			}
			
		}
		b[ppp]='\0';
		printf("%d %d ",x,y);
		if(x==0){
			printf("###\n");
			continue;
		}
		else{
			printf("%s\n",b);
		}
	}
}

7-2 实验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>
#include<string.h>
struct student{
	char name[25],id[25];
	int score[6];
	
};
int main(){
	struct student a;
	int total=0;
	int temp;
	float ave;
	gets(a.name);
	gets(a.id);
	for(int i=0;i<5;i++){
		scanf("%d",&a.score[i]);
		total+=a.score[i];
		
	}
	ave=(float)total/5;
	for(int i=0;i<5;i++){
		for(int j=0;j<5-i-1;j++){
			if(a.score[j]<a.score[j+1]){
				temp=a.score[j+1];
				a.score[j+1]=a.score[j];
				a.score[j]=temp;
			}
		}
	}
		
		
	printf("Name:%s\nID:%s\n",a.name,a.id);
	printf("Score:%d %d %d %d %d\n",a.score[0],a.score[1],a.score[2],a.score[3],a.score[4]);
	printf("average:%.2f total:%d",ave,total);
	
	
}

7-3 实验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<string.h>
struct inform{
	char name[25];
	char num[25];
	int score[5];
	float pin;
	int zong;
};
int main(){
	int i,j;
	int n;
	struct inform stu[101];

	scanf("%d",&n);

	for(i=0;i<n;i++){
		getchar();
		gets(stu[i].name);
		gets(stu[i].num);
		for(j=0;j<5;j++){
			scanf("%d",&stu[i].score[j]);
		}

	}
	for(i=0;i<n;i++){
		stu[i].zong=0;
		for(j=0;j<5;j++){
			stu[i].zong+=stu[i].score[j];
		}
		stu[i].pin=(float)stu[i].zong/5;
	}
	for(i=0;i<n;i++){
		printf("Name:%s\n",stu[i].name);
		printf("ID:%s\n",stu[i].num);
		printf("Score:%d %d %d %d %d\n",stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4]);
		printf("average:%.2f total:%d\n",stu[i].pin,stu[i].zong);
		printf("\n");


	}



}

7-4 实验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>
#include<string.h>
struct student{
	char name[100];
	int total;
};

int main(){
	struct student a[105];
	struct student tmp;
	int n;
	int test;
	
	scanf("%d",&n);
	
	for(int i=0;i<n;i++){
		scanf("%s %d",a[i].name,&a[i].total);
		
	}
	
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-i-1;j++){
			if(a[j].total<a[j+1].total){
				tmp=a[j+1];
				a[j+1]=a[j];
				a[j]=tmp;
				
			}
			else if(a[j].total==a[j+1].total){
				test=strcmp(a[j].name,a[j+1].name);
				if(test>0){
					tmp=a[j+1];
					a[j+1]=a[j];
					a[j]=tmp;
					
				}
				
			}
		}
	}
	for(int i=0;i<n;i++){
		printf("Name:%s\ntotal:%d\n\n",a[i].name,a[i].total);
	}
}

7-5 实验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>
#include <string.h>
typedef struct{
 char id[50], name[50];
 int math, english, sc; }stu;
stu students[150];
int n = 0;
void add(char id[], char name[], int math, int english, int sc) {
 int i;
 for (i = 0; i < n; i++) {
 if (strcmp(students[i].id, id) == 0) {
 printf("Students already exist\n");
 return ;
 }
 }
 strcpy(students[n].id, id);
 strcpy(students[n].name, name);
 students[n].math = math;
 students[n].english = english;
 students[n].sc = sc;
 n ++;
 printf("Add success\n");
}
void delete(char id[]) {
 int i, j;
 for (i = 0; i < n; i++) {
 if (strcmp(students[i].id, id) == 0) {
 for (j = i; j < n - 1; j++) {
 students[j] = students[j + 1];
 }
 n --;
 printf("Delete success\n");
 return ;
 }
 }
 printf("Students do not exist\n");
}
void update(char id[], int math, int english, int sc) {
 int i;
 for (i = 0; i < n; i++) {
 if (strcmp(students[i].id, id) == 0) {
 students[i].math = math;
 students[i].english = english;
 students[i].sc = sc;
 printf("Update success\n");
 return ;
 }
 }
 printf("Students do not exist\n");
}
void show(char id[]) {
 int i;
 for (i = 0; i < n; i++) {
 if (strcmp(students[i].id, id) == 0) {
 printf("Student ID:%s\n", students[i].id);
 printf("Name:%s\n", students[i].name);
 printf("Average Score:%.1lf\n", (students[i].math +
students[i].english + students[i].sc) / 3.0);
 return ;
 }
 }
 printf("Students do not exist\n");
}
int main() {
 int i, option, m;
 char id[50], name[50];
 int math, english, sc;
 
 scanf("%d", &m);
 
 for (i = 0; i < m; i++) {
 scanf("%d", &option);
 switch(option) {
 case 1:
 scanf("%s %s %d %d %d", id, name, &math, &english, &sc);
 add(id, name, math, english, sc);
 break;
 case 2:
 scanf("%s", id);
 delete(id);
 break;
 case 3:
 scanf("%s %d %d %d", id, &math, &english, &sc);
 update(id, math, english, sc);
 break;
 case 4:
 scanf("%s", id);
 show(id);
 break;
 }
 }
}

标签:int,样例,C语言,char,实验,100,成绩,id
来源: https://blog.csdn.net/weixin_62889643/article/details/122629946

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有