20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises34
P783
修改之前的代码
#include<stdio.h>
#define SNUM 4 /* student number */
#define CNUM 3 /* course number */
/* User Code Begin(考生可在本行后添加代码,例如结构体的定义、函数原型声明等,行数不限) */
/* User Code End(考生添加代码结束) */
int main(void)
{
int i, j;
struct student stu[SNUM];
printf("Please input student num name and score:\n");
for (i=0; i<SNUM; i++)
{
printf("Student %d: ", i+1);
scanf("%s %s", stu[i].num, stu[i].name);
for (j=0; j<CNUM; j++)
{
scanf("%d", &stu[i].score[j]);
}
}
DispScore(stu);
FindNoPass(stu);
return 0;
}
/* User Code Begin(考生在此后完成自定义函数的设计,行数不限) */
修改之后的代码
#include<stdio.h>
#define SNUM 4 /* student number */
#define CNUM 3 /* course number */
/* User Code Begin(考生可在本行后添加代码,例如结构体的定义、函数原型声明等,行数不限) */
/*
程序的功能是:
某班有4个学生,三门课,通过main函数读入学生的学号(5位数字)、姓(最长7个字符)和三门课的成绩,
然后通过调用用户自定义函数DispScore实现这些信息的输出,调用用户自定义函数FindNoPass实现找出有两门以上不及格的学生、输出其学号和不及格课程的成绩。
要求用结构体编程。
编程可用素材:
printf("\nStudent Info and Score:\n");
printf("%6s %8s"…);
printf("%5d"…);
printf("\nTwo Course No Pass Students:\n")。
Please input student num name and score:
Student 1: 00001 zhang 55 67 77
Student 2: 00032 li 64 44 55
Student 3: 30013 zhou 78 90 88
Student 4: 20706 peng 45 55 36
Student Info and Score:
00001 zhang 55 67 77
00032 li 64 44 55
30013 zhou 78 90 88
20706 peng 45 55 36
Two Course No Pass Students:
00032 li 44 55
20706 peng 45 55 36
*/
struct student
{
char num[6]; // 学号(5位数字)
char name[8]; // 姓(最长7个字符)
int score[3]; // 三门课
};
void DispScore(struct student *stu);
void FindNoPass(struct student *stu);
/* User Code End(考生添加代码结束) */
int main(void)
{
int i, j;
struct student stu[SNUM];
printf("Please input student num name and score:\n");
for (i=0; i<SNUM; i++)
{
printf("Student %d: ", i+1);
scanf("%s %s", stu[i].num, stu[i].name);
for (j=0; j<CNUM; j++)
{
scanf("%d", &stu[i].score[j]);
}
}
DispScore(stu);
FindNoPass(stu);
return 0;
}
/* User Code Begin(考生在此后完成自定义函数的设计,行数不限) */
void DispScore(struct student *stu)
{
int i, j;
// 信息的输出
printf("\nStudent Info and Score:\n");
for (i = 0; i < SNUM; i++)
{
printf("%6s %8s", (stu + i)->num, (stu + i)->name);
for ( j = 0; j < CNUM; j++)
{
printf("%5d", (stu + i)->score[j]);
}
printf("\n");
}
}
void FindNoPass(struct student *stu)
{
// 找出有两门以上不及格的学生、输出其学号和不及格课程的成绩
int i, j;
int flag[SNUM] = {
0};
int cnt;
printf("\nTwo Course No Pass Students:\n");
// 先统计60以下的门数
for (i = 0; i < SNUM; i++)
{
cnt = 0;
for ( j = 0; j < CNUM; j++)
{
if((stu + i)->score[j] < 60)
{
cnt++;
}
}
if (cnt >=2)
{
flag[i] = 1;
}
}
// 再输出
for (i = 0; i < SNUM; i++)
{
if (flag[i])
{
printf("%6s %8s", (stu + i)->num, (stu + i)->name);
for ( j = 0; j < CNUM; j++) // 循环负责遍历分数
{
if ((stu + i)->score[j] < 60) // 只输出60以下的分数
{
printf("%5d", (stu + i)->score[j]);
}
}
printf("\n");
}
}
}
P790
修改之前的代码
#include <stdio.h>
/* User Code Begin(考生可在本行后添加代码,例如结构体的定义、函数原型声明等,行数不限) */
/* User Code End(考生添加代码结束) */
int main(void)
{
struct stu stud[5];
input(stud, 5);
printf("\nfailed the exam: ");
output(stud, 5);
return 0;
}
/* User Code Begin(考生在此后完成自定义函数的设计,行数不限) */
修改之后的代码
#include <stdio.h>
/* User Code Begin(考生可在本行后添加代码,例如结构体的定义、函数原型声明等,行数不限) */
/*
从键盘上读入5个学生的姓名(char(10))、学号(char(10))和成绩(int),要求成绩必须在0~100之间,否则重新读入该学生信息。
最后输出不及格学生的学号、名字和分数。要求用指针完成函数中结构体数组参数的传递以及各个数组元素的访问,访问结构体成员时使用->形式,
自定义函数头和函数体中不得出现数组下标形式的表示法。
编程可用素材:
printf("input name number score:\n");
printf("student %d: "…);
printf(" error score! input again!\n");
printf("%s/%s,%d "…);
*/
struct stu
{
char name[10]; // 姓名(char(10))
char num[10]; // 学号(char(10))
int score; // 成绩(int)
};
void input(struct stu *stu, int n); // 输入信息
void output(struct stu *stu, int n); // 输出
/* User Code End(考生添加代码结束) */
int main(void)
{
struct stu stud[5];
input(stud, 5);
printf("\nfailed the exam: ");
output(stud, 5);
return 0;
}
/* User Code Begin(考生在此后完成自定义函数的设计,行数不限) */
/*
input name number score:
student 1: aa 11 77
student 2: bb 02 55
student 3: cc 13 33
student 4: ee 36 110
error score! input again!
student 4: ee 36 10
student 5: dd 25 88
*/
void input(struct stu *stu, int n)
{
int i;
printf("input name number score:\n");
for ( i = 0; i < n; i++)
{
printf("student %d: ", i + 1);
scanf("%s %s %d", (stu + i)->name, (stu + i)->num, &(stu + i)->score);
while ((stu + i)->score < 0 || (stu + i)->score > 100) // 只不要符合要求,就重新输入,直到符合要求
{
printf(" error score! input again!\n");
printf("student %d: ", i + 1);
scanf("%s %s %d", (stu + i)->name, (stu + i)->num, &(stu + i)->score);
}
}
}
void output(struct stu *stu, int n)
{
int i;
for ( i = 0; i < n; i++)
{
if((stu + i)->score < 60) // 只输出不及格的
{
printf("%s/%s,%d ", (stu + i)->num, (stu + i)->name, (stu + i)->score);
}
}
}
P765
修改之前的代码
#include <stdio.h>
#include <stdlib.h>
/* User Code Begin(考生可在本行后添加代码,行数不限) */
/* User Code End(考生添加代码结束) */
int main(void)
{
STUDENT myclass[5], *pStu = myclass;
int i;
const int N = 5;
/* User Code Begin(考生可在本行后添加代码,行数不限) */
/* User Code End(考生添加代码结束) */
printf("\nResult of sort:\n");
printf("Num Name Math English Computer Average\n");
for (i=0; i<N; i++)
{
printf("%-5d %-20s %-8d %-8d %-8d %-.2f\n", (pStu+i)->num, (pStu+i)->name,
(pStu+i)->math, (pStu+i)->english, (pStu+i)->computer, (pStu+i)->average);
}
return 0;
}
/* User Code Begin(考生在此后根据设计需要完成程序的其它部分,行数不限) */
修改之后的代码
#include <stdio.h>
#include <stdlib.h>
/* User Code Begin(考生可在本行后添加代码,行数不限) */
/*
有五个学生,每个学生的数据包括学号、姓名(最长19字节)、三门课的成绩,从键盘输入五个学生的数据,
计算每个学生的平均成绩并按平均成绩由高到低排序,并将排序结果显示。
要求用结构体编程,变量数据类型的选择应适当,在保证满足设计要求精度的情况下,养成不浪费内存空间和计算时间的好习惯。
编程可用素材:
printf("Please input info of students:No Name Math English Computer\n");
*/
typedef struct
{
int num; // 学号
char name[20]; // 姓名(最长19字节)
int math; // 三门课之一 数学
int english; // 三门课之一 英语
int computer; // 三门课之一 计算机
float average; // 平均分
} STUDENT;
void inputStudent(STUDENT *stu, int n); // 输入功能
void sortStudent(STUDENT *stu, int n); // 排序功能
void swapStudent(STUDENT *stu1, STUDENT *stu2); // 交换功能
/* User Code End(考生添加代码结束) */
int main(void)
{
STUDENT myclass[5], *pStu = myclass;
int i;
const int N = 5;
/* User Code Begin(考生可在本行后添加代码,行数不限) */
inputStudent(myclass, N);
sortStudent(myclass, N);
/* User Code End(考生添加代码结束) */
printf("\nResult of sort:\n");
printf("Num Name Math English Computer Average\n");
for (i=0; i<N; i++)
{
printf("%-5d %-20s %-8d %-8d %-8d %-.2f\n", (pStu+i)->num, (pStu+i)->name,
(pStu+i)->math, (pStu+i)->english, (pStu+i)->computer, (pStu+i)->average);
}
return 0;
}
/* User Code Begin(考生在此后根据设计需要完成程序的其它部分,行数不限) */
/*
输入学生结构的信息
*/
void inputStudent(STUDENT *stu, int n)
{
int i;
printf("Please input info of students:No Name Math English Computer\n");
for (i=0; i<n; i++)
{
printf("%d:", i + 1);
scanf("%d %s %d %d %d", &stu[i].num, stu[i].name, &stu[i].math, &stu[i].english, &stu[i].computer);
stu[i].average = ((float)stu[i].math + (float)stu[i].english + (float)stu[i].computer) / 3;
}
}
/*
1. 使用冒泡排序算法
2. 实现对n个元素的STUDENT数组的排序
*/
void sortStudent(STUDENT *stu, int n)
{
int i, j;
for (i=0; i<n-1; i++)
{
for ( j = 0; j < n-1-i; j++)
{
if(stu[j].average < stu[j+1].average)
{
swapStudent(&stu[j], &stu[j + 1]);
}
}
}
}
/*
实现两个STUDENT结构的交换
*/
void swapStudent(STUDENT *stu1,STUDENT *stu2)
{
STUDENT stuTmp;
stuTmp = *stu1;
*stu1 = *stu2;
*stu2 = stuTmp;
}