实现一个成绩管理程序(不用结构体和使用结构体两种)

2024-01-19 15:48

本文主要是介绍实现一个成绩管理程序(不用结构体和使用结构体两种),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每天都告诉自己要努力向前冲!!!

  • 冲冲冲!!!

题目要求:
输入多个学生的学号(由字母与数字组成)、姓名(由字符或者汉字组成)、语文、英语、数学三门课程的成绩
计算每个学生的平均成绩和总分
按总分由高到低的顺序输出学生的学号、姓名、语文成绩、英语成绩、数学成绩、总分、平均分
学号、姓名占用的内存要求动态分配,实现过程中可以用指针、数组等,不得用结构体structure

#include<stdio.h>
#include<malloc.h> 
#include<string.h>
#include<stddef.h>
#define N 100
int main()
{double a[N][6]; double temp[6]={0};char t[50]={0};char tempStr[20] ;char *name[5] ;char tempStr2[19] ;char *xuehao[14];int i,j,n;printf("请输入学生人数:");scanf("%d",&n);for(i=0;i<n;i++){printf("第%d个学生姓名、学号、语文成绩、数学成绩、英语成绩:\n",i+1); scanf("%s%s%lf%lf%lf",&tempStr,&tempStr2,&a[i][0],&a[i][1],&a[i][2]);name[i] =(char *) calloc(10,sizeof(char));	 	xuehao[i] =(char *) calloc(20,sizeof(char));		strcpy(name[i], tempStr);			 								strcpy(xuehao[i], tempStr2);a[i][3]=a[i][0]+a[i][1]+a[i][2];a[i][4]=a[i][3]/3;}for(i=0;i<n-1;i++){for(j=0;j<n-i-1;j++){if(a[j][3]<=a[j+1][3]){memcpy(temp,a[j],sizeof(temp));memcpy(a[j],a[j+1],sizeof(temp));memcpy(a[j+1],temp,sizeof(temp));strcpy(t,name[j]);strcpy(name[j],name[j+1]);strcpy(name[j+1],t);strcpy(t,xuehao[j]);strcpy(xuehao[j],xuehao[j+1]);strcpy(xuehao[j+1],t);}}}printf("\n姓名\t学号\t\t语文\t数学\t英语\t总分\t平均分\t排名\n");for(i=0;i<n;i++){printf("%s\t%s\t",name[i],xuehao[i]);free(name[i]);name[i] = NULL;free(xuehao[i]);xuehao[i] = NULL;for(j=0;j<3;j++){printf("%.f\t",a[i][j]);if(j==2){printf("%.f\t%.2f\t%d",a[i][3],a[i][4],i+1);}}printf("\n");}}

总结:
尽量避免使用memcpy吧,我感觉每次字符串的字符数量不同,具体实现起来总会有一点点小错误!!!

#include<stdio.h>
#include<stdlib.h>struct student
{char name[10]; double yuwen;double math;double english;double sum;double average;};
int n;
double y_average,m_average,e_average;void s_average(struct student s[]);
void sum(struct student s[]);
void meike_average(struct student s[]);
void paixu(struct student s[]);
void paixu(struct student s[]);
int main()
{struct student s[100];int i,j;printf("请输入学生人数:");scanf("%d",&n);for(i=0;i<n;i++){printf("请输入%d个学生的信息---姓名---语文成绩---数学成绩---英语成绩\n",i+1);scanf("%s%lf%lf%lf",&s[i].name,&s[i].yuwen,&s[i].math,&s[i].english);} sum(s);s_average(s);meike_average(s);for(i=0;i<n;i++){printf("学生%s的总分为%.f\t各科平均分为%.2f\n",s[i].name,s[i].sum,s[i].average);}printf("\n");printf("各科平均分\n");printf("  \t平均分\n语 文\t  %.2f\n数 学\t  %.2f\n英 语\t  %.2f\n",y_average,m_average,e_average);paixu(s);printf("姓名\t语文\t英语\t数学\t总分\t平均分\t名次\n");for(i=0;i<n;i++){printf("%s\t%.f\t%.f\t%.f\t%.f\t%.f\t%d\n",s[i].name,s[i].yuwen,s[i].english,s[i].math,s[i].sum,s[i].average,i+1);}
}void sum(struct student s[])
{int i;for(i=0;i<n;i++){s[i].sum=s[i].math+s[i].english+s[i].yuwen;}
}void s_average(struct student s[])
{int i;for(i=0;i<n;i++){s[i].average=(s[i].math+s[i].english+s[i].yuwen)/3;}}void meike_average(struct student s[]) 
{int i;double sum1=0,sum2=0,sum3=0;for(i=0;i<n;i++){sum1+=s[i].yuwen;sum2+=s[i].math;sum3+=s[i].english;} y_average=sum1/n;m_average=sum2/n;e_average=sum3/n;
}void paixu(struct student s[])
{int i,j,t,flag;struct student temp;for (i = 0; i < n-1; i++)       //轮次,共NUM-1次{flag = 0;for (j = 0; j < n - i-1; j++)  //实现一次冒泡操作if (s[j].sum < s[j+1].sum)                  //交换a[j]和a[j+1]{   temp = s[j];   s[j] = s[j+1];  s[j+1] = temp;  flag = 1;  }if (flag == 0)  break;}
}

这篇关于实现一个成绩管理程序(不用结构体和使用结构体两种)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622906

相关文章

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将