C程序设计 (第四版) 谭浩强 习题9.3
习题 9.3 编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,用print函数输出这些记录。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法1:
#include <stdio.h>
#include <stdlib.h>
struct student
{
int num;
char name[10];
float score[3];
} stu[5];
void print(struct student s[]);
int main(){
int i, j;
for(i = 0; i < 5; i++){
printf("Please enter No.%d student num, name, score: ", i + 1);
scanf("%d %s", &stu[i].num, stu[i].name);
for(j = 0; j < 3; scanf("%f", &stu[i].score[j++]));
}
print(stu);
system("pause");
return 0;
}
void print(struct student s[]){
int i, j;
for(i = 0; i < 5; printf("\n"), i++){
printf("%d %-10s ", s[i].num, s[i].name);
for(j = 0; j < 3; printf("%.2f ", s[i].score[j++]));
}
}
方法2:使用指针,结构体,动态分配内存
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct{
int num;
char name[20];
float score[3];
}Student;
void initialStu(Student **stu, int n){
*stu = (Student*)malloc(n * sizeof(Student));
}
void inputStu(Student *stu, int n){
printf("Enter %d student info:\n", n);
for(int i = 0; i < n; i++){
printf("Enter No.%d student number: ", i + 1);
scanf("%d", &stu[i].num);
while(stu[i].num < 100 || stu[i].num > 999){
printf("Number Error! Retry!\nEnter No.%d student number: ", i + 1);
scanf("%d", &stu[i].num);
}
fflush(stdin);
printf("Enter No.%d student name: ", i + 1);
gets(stu[i].name);
printf("Enter No.%d student score:\n", i + 1);
for(int j = 0; j < 3; j++){
printf("Enter No.%d course score: ", j + 1);
scanf("%f", &stu[i].score[j]);
while(stu[i].score[j] < 0 || stu[i].score[j] > 100){
printf("Score Error! Retry!\nEnter No.%d course score: ", j + 1);
scanf("%f", &stu[i].score[j]);
}
}
printf("\n");
}
}
void print(Student *stu, int n){
printf("\nThere are %d students info:\n", n);
for(int i = 0; i < n; i++){
printf("Number: %3d Name %-12s Score: ", stu[i].num, stu[i].name);
for(int j = 0; j < 3; j++){
printf("%.2f ", stu[i].score[j]);
}
printf("\n");
}
printf("\n");
}
int main(){
Student *stu = NULL;
initialStu(&stu, N);
inputStu(stu, N);
print(stu, N);
free(stu);
system("pause");
return 0;
}