大学生期末C语言实验(学生成绩和鞍点)

简介: 大学生期末C语言实验(学生成绩和鞍点)

一.学生成绩管理系统(简单)


要求包括学生的基本信息:学号,姓名,三门成绩的输入

平均成绩;学生的所有信息;找出平均成绩最高的学生;按学生的平均分进行从高到低排序;修改学生成绩;

效果(代码实现)

分段代码

1.头函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

2. 结构体

struct Student
{
  int id;
  char name[10];
  float scores[3];
  float average;
};

3. 学生学号,姓名,三门成绩的输入

注:结构体成员的访问

两种方法:

  #define MAX_Student 100                      //声明学生人数的最大限值
 
    int N = 0;
  printf("请输入学生人数:");
  scanf("%d", &N);
 
  struct Student students[MAX_Student];        //结构体定义学生人数的最大限值
 
  int i = 0, j = 0;
  for (i = 0; i < N; i++)
  {
    printf("请输入第%d个学生的学号:", i + 1); //因为i是从0开始的,而且个数是正整数,所以i+1
    scanf("%d", &students[i].id);
 
    printf("请输入第%d个学生的姓名:", i + 1);
    scanf("%s", students[i].name);
      //这里name不用&的原因:name是一个char数组,数组名就是地址
 
    printf("请输入第%d个学生的三门成绩:", i + 1);
    for (j = 0; j < 3; j++)
    {
      scanf("%f", &students[i].scores[j]);
    }
    }

4.学生的平均成绩

简单的for循环体结构,注意float类型

  int i = 0, j = 0;
  for (i = 0; i < N; i++)
  {
    float sum = 0.0, average = 0.0;
    for (j = 0; j < 3; j++)
    {
      sum += students[i].scores[j];  //该学生三门成绩的总和
    }
    students[i].average = sum / 3.0;   //该生三门成绩的平均值
  }

5. 学生的所有信息

  for (i = 0; i < N; i++)
  {
    printf("学号:%d\n", students[i].id);
    printf("姓名:%s\n", students[i].name);
    for (j = 1; j <= 3; j++)               //j=1是第几门的成绩不能是0,所以也需j<=N
    {
      printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j - 1]);
    }
    printf("%s的三门课程平均分:%.2f\n", students[i].name, students[i].average); //%.2f保留小数点后两位
  }

6. 找出平均成绩最高的学生

int maxindex = 0;
for (i = 0; i < N; i++)
{
  if (students[i].average > students[maxindex].average)
  {
    maxindex = i;
  }
}
 
//输出平均分成绩最高的学生
printf("平均分成绩最高学生的信息如下:\n");
printf("学号:%d\n", students[maxindex].id);
printf("姓名:%s\n", students[maxindex].name);
printf("平均成绩:%.2f\n", students[maxindex].average);

7. 按学生的平均分进行从高到低排序

这是该代码最困难的一个

涉及qsort排序

关于qsort知识点和本结构的解释:

return 1,表示elem1 > elel2;

return -1,表示elem1 < elel2;

return 0,表示elem1 = elel2;

int com_students_average(const void* p1, const void* p2)
{
  float diff = ((struct Student*)p1)->average - ((struct Student*)p2)->average;
  if (diff > 0) return -1;  // 降序排序
  else if (diff < 0) return 1;
  else return 0;
}
 
int main()
{
      printf("对学生的平均分排序:\n");
 
  qsort(students, N, sizeof(students[0]), com_students_average);
 
  for (i = 0; i < N; i++)
  {
    printf("学号:%d\n", students[i].id);
    printf("姓名:%s\n", students[i].name);
    printf("%s的三门课程平均分:%.2f\n", students[i].name, students[i].average);
 
//以下的for循环表示该生的这三门课程的成绩,因这里只需学生的平均分排序,可根据需要把该段代码是否屏蔽
    //for (j = 1; j <= 3; j++)
    //{
    //  printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j - 1]);     //因为最开始输入时,我是定义j=0,所以这里要j-1
    //}
    printf("\n");
  }
    return 0;
}

8. 修改学生成绩(简单)

直接给成绩重新赋值

  printf("请按顺序重新输入学生成绩:\n");
  //输入
  for (i = 0; i < N; i++)
  {
    for (j = 1; j <=3; j++)
    {
      printf("输入修改%s学生的%d门成绩:", students[i].name,j);
      scanf("%f", &students[i].scores[j]);
    }
  }
  printf("\n");
  //输出
  for (i = 0; i < N; i++)
  {
    for (j = 1; j <= 3; j++)
    {
      printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j]);
    }
  }

全部代码

头函数及声明

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#define MAX_Student 100

总代码

//结构体
struct Student
{
  int id;
  char name[10];
  float scores[3];
  float average;
};
 
int com_students_average(const void* p1, const void* p2)
{
  float diff = ((struct Student*)p1)->average - ((struct Student*)p2)->average;
  if (diff > 0) return -1;  // 降序排序
  else if (diff < 0) return 1;
  else return 0;
}
int main()
{
  int N = 0;
  printf("请输入学生人数:");
  scanf("%d", &N);
 
  struct Student students[MAX_Student];
 
  int i = 0, j = 0;
  for (i = 0; i < N; i++)
  {
    printf("请输入第%d个学生的学号:", i + 1);
    scanf("%d", &students[i].id);
 
    printf("请输入第%d个学生的姓名:", i + 1);
    scanf("%s", students[i].name);
 
    printf("请输入第%d个学生的三门成绩:", i + 1);
    for (j = 0; j < 3; j++)
    {
      scanf("%f", &students[i].scores[j]);
    }
 
    //计算平均成绩
    float sum = 0.0, average = 0.0;
    for (j = 0; j < 3; j++)
    {
      sum += students[i].scores[j];
    }
    students[i].average = sum / 3.0;
  }
 
  printf("\n");
  //输出所有学生的信息
  for (i = 0; i < N; i++)
  {
    printf("学号:%d\n", students[i].id);
    printf("姓名:%s\n", students[i].name);
    for (j = 1; j <= 3; j++)
    {
      printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j - 1]);
    }
    printf("%s的三门课程平均分:%.2f\n", students[i].name, students[i].average);
  }
 
  //找出平均成绩最高的学生
  int maxindex = 0;
  for (i = 0; i < N; i++)
  {
    if (students[i].average > students[maxindex].average)
    {
      maxindex = i;
    }
  }
 
  printf("\n");
  //输出平均分成绩最高的学生
  printf("平均分成绩最高学生的信息如下:\n");
  printf("学号:%d\n", students[maxindex].id);
  printf("姓名:%s\n", students[maxindex].name);
  printf("平均成绩:%.2f\n", students[maxindex].average);
 
  printf("\n");
  //3.对学生的平均分进行排序
  printf("对学生的平均分排序:\n");
 
  qsort(students, N, sizeof(students[0]), com_students_average);
 
  for (i = 0; i < N; i++)
  {
    printf("学号:%d\n", students[i].id);
    printf("姓名:%s\n", students[i].name);
    printf("%s的三门课程平均分:%.2f\n", students[i].name, students[i].average);
    //for (j = 1; j <= 3; j++)
    //{
    //  printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j - 1]);
    //}
    printf("\n");
  }
 
  printf("\n");
    //4.修改学生成绩
  printf("请按顺序重新输入学生成绩:\n");
  //输入
  for (i = 0; i < N; i++)
  {
    for (j = 1; j <=3; j++)
    {
      printf("输入修改%s学生的%d门成绩:", students[i].name,j);
      scanf("%f", &students[i].scores[j]);
    }
  }
  printf("\n");
  //输出
  for (i = 0; i < N; i++)
  {
    for (j = 1; j <= 3; j++)
    {
      printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j]);
    }
  }
  return 0;
}


二.在数组中找鞍点


鞍点的说明:在n行n列的数组中,找出该元素的该行最大的元素,该列最小的元素,为鞍点

简单来说:行大列小

效果(代码实现)

分段代码

1.头函数

#include<stdio.h>

2.数组的输入

  #define Line 6              //声明
 
    int a[Line][Line] = { 0 };
  int n = 0;
  scanf("%d", &n);
  int i = 0, j = 0;
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < n; j++)
    {
      scanf("%d", &a[i][j]);
    }
  }

3.找行大列小

  int maxindex = 0, row = 0;
  for (i = 0; i < n; i++)
  {
    maxindex = 0;                               //重新定义为0
    for (j = 1; j < n; j++)
    {
      //找列小
      if (a[i][maxindex] <= a[i][j])
        maxindex = j;
    }
    for (row = 0; row < n; row++)
    {
      //找行大
      if (a[row][maxindex] < a[i][maxindex])
        break;
    }
    if (row == n)                               //如果row(行)==n,输出
    {
      printf("a[%d][%d]\n", i, maxindex);
      break;
    }
 
  }

4.没有找到鞍点

  //如果i==n还没找到鞍点,就输出NO
    if (i == n)
  {
    printf("NO\n");
  }

全部代码

头函数及声明

#include<stdio.h>
#define Line 6

总代码

int main()
{
  int a[Line][Line] = { 0 };
  int n = 0;
  scanf("%d", &n);
  int i = 0, j = 0;
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < n; j++)
    {
      scanf("%d", &a[i][j]);
    }
  }
 
  int maxindex = 0, row = 0;
  for (i = 0; i < n; i++)
  {
    maxindex = 0;//重新定义为0
    for (j = 1; j < n; j++)
    {
      //找列小
      if (a[i][maxindex] <= a[i][j])
        maxindex = j;
    }
    for (row = 0; row < n; row++)
    {
      //找行大
      if (a[row][maxindex] < a[i][maxindex])
        break;
    }
    if (row == n)
    {
      printf("a[%d][%d]\n", i, maxindex);
      break;
    }
 
  }
  if (i == n)
  {
    printf("NO\n");
  }
  return 0;
}
目录
相关文章
|
6月前
|
C语言
C语言期末习题之求二维数组中的最大值
C语言期末习题之求二维数组中的最大值
55 0
|
6月前
|
C语言
C语言期末习题之数组逆序存放
C语言期末习题之数组逆序存放
88 0
|
6月前
|
C语言
C语言期末习题之二维数组转置
C语言期末习题之二维数组转置
46 0
|
3月前
|
存储 C语言
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
52 15
|
3月前
|
存储 数据可视化 数据安全/隐私保护
【C语言】C语言-成绩管理系统(管理员+教师+学生 源码)【独一无二】
【C语言】C语言-成绩管理系统(管理员+教师+学生 源码)【独一无二】
105 2
|
3月前
|
存储 数据可视化 C语言
【C语言】C语言 学生成绩管理系统(源码+报告)【千行代码】【独一无二】
【C语言】C语言 学生成绩管理系统(源码+报告)【千行代码】【独一无二】
|
4月前
|
人工智能 C语言
7-5 sdut -C语言实验-节约用电
7-5 sdut -C语言实验-节约用电
35 3
|
4月前
|
存储 C语言 C++
PTA—C语言期末复习(选择题)
PTA—C语言期末复习(选择题)
|
4月前
|
Linux C语言
【编程小实验】C语言实现:无限循环写入文本文件,支持Ctrl+C中断与数据追加(附完整源码)
在Linux中,文件I/O(输入/输出)是程序与文件进行交互的基本方式,包括读取文件内容和向文件写入数据。这通常通过标准的C库函数来实现,下面是一些基本的文件读写操作和代码示例。
227 0
|
4月前
|
C语言
PTA—C语言期末复习(判断题)
PTA—C语言期末复习(判断题)