システムインターフェースと関連要件
1) システムが実行され、次のインターフェイスが開きます。システム ヘルプ メニュー (つまり、コマンド メニュー) を一覧表示し、コマンドの入力を求めます。
2) 最初は成績が入力されていないため、Lコマンドを入力しても成績は表示されません。「成績リストが空です! 最初に学生の成績を入力するにはコマンド T を使用してください。」
同様に、他の成績処理コマンドを入力するときも、それに応じて処理されます。
3) コマンド T を入力し、Type サブ関数を呼び出して成績を記録します。
インターフェースでは生徒数の入力を求められます
3 を入力すると、3 人の学生の 3 つのコースの成績を入力するよう求められ、成績証明書のヘッダーに「学生番号 中国語 数学 英語」が表示され、学生番号: 1 が入力されます。
生徒番号 1 の 3 つのコース成績をスペースで区切って入力し、Enter キーを押して終了します。即時生徒番号: 2
生徒番号 2 の 3 つのコース成績をスペースで区切って入力し、Enter キーを押して終了します。即時生徒番号: 3
生徒番号 3 の 3 つのコース成績をスペースで区切って入力し、Enter キーを押して終了します。Type サブ関数呼び出しが終了して戻ります。コマンドの入力を求めるプロンプトが表示されます。
4) コマンド L を入力し、List サブ関数を呼び出してスコアシートを出力します。List サブ関数の呼び出しが終了して戻ります。コマンドの入力を求めるプロンプトが表示されます。
5) コマンド A を入力し、Average サブ関数を呼び出して平均スコアを計算し、「平均スコアが計算されました。コマンド L を使用して表示してください。」というプロンプトが表示され、Average サブ関数の呼び出しは終了して戻ります。コマンドの入力を求めるプロンプトが表示されます。
コマンド L を入力し、List サブ関数を呼び出してスコアシートを出力します。List サブ関数の呼び出しが終了して戻ります。コマンドの入力を求めるプロンプトが表示されます。
6) コマンド P を入力し、Sort サブ関数を呼び出して、各学生の記録を平均点に従って高いものから低いものに並べ替え、「並べ替えが完了しました。表示するにはコマンド L を使用してください。」というプロンプトが表示されます。が呼ばれて戻ります。コマンドの入力を求めるプロンプトが表示されます。
コマンド L を入力し、List サブ関数を呼び出してスコアシートを出力します。List サブ関数の呼び出しが終了して戻ります。コマンドの入力を求めるプロンプトが表示されます。
7) コマンド S を入力し、検索サブ関数を呼び出して学生の成績を照会し、「照会する学生番号を入力してください」というプロンプトを表示します。
2 を入力すると生徒番号 2 の成績が求められ、出力されます。Search サブ関数が呼び出され、戻ります。コマンドの入力を求めるプロンプトが表示されます。
8) コマンド C を入力して、クリア機能ステートメント system("clear") を実行します。
画面の内容をすべてクリアします。コマンドの入力を求めるプロンプトが表示されます。
9) コマンド H を入力してヘルプ サブ関数を呼び出し、ヘルプ メニューを表示します。help サブ関数が呼び出され、戻ります。コマンドの入力を求めるプロンプトが表示されます。
10) コマンド Q を入力してシステムを終了します。
注:
1) 配列要素を出力するときは、生徒番号を個別に処理し、整数として出力する必要があります (つまり、小数点以下 0 桁を保持します)。同様に、成績を計算する場合、最初の列の生徒数は無視され、2 列目以降の生徒数のみが計算されます。等級は小数点第 1 位を保持します。
2) 生徒の数は全体を通して n であり、n の値は現在のコマンドのサブ関数を呼び出して実行できるかどうかを判断するために使用されます。例: n=0 の場合、結果がまだ入力されていないことを意味します。コマンド T が入力されると、つまり、グレードを入力するために Type サブ関数が呼び出されると、n の値は 0 ではなくなります。ときは!=0 の場合、他のグレードの操作は実行できますが、グレードを募集する操作は実行できなくなります。したがって、ユーザーが入力したコマンドを実行できない場合は、プロンプトを表示する必要があります。
コード
#include <stdio.h>
#include <stdlib.h>
//#include "hs.h"
struct student
{
int id;
float yw;
float sx;
float wy;
float pj;
};
void help(void);
int type(struct student *p);
void list(struct student *p,int n);
void average(struct student *p,int n);
void search (struct student *p);
void sort(struct student *p,int n);
int main(int argc, const char *argv[])
{
char ch;
struct student stu[32];
int n=0;
while(1)
{
printf("请输入命令 = ");
//getchar();
scanf("%c",&ch);
putchar(10);
if(ch=='T')
{
n=type(stu);
}
else if(ch=='L')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
list(stu,n);
}
else if(ch=='A')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
{
average(stu,n);
printf("平均分已计算,请使用命令L查看!\n");
putchar(10);
}
}
else if(ch=='H')
help();
else if(ch=='C')
system("clear");
else if(ch=='S')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
{
search(stu);
putchar(10);
}
}
else if(ch=='P')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
{
sort(stu,n);
putchar(10);
}
}
else if(ch=='Q')
{
printf("Press any key to continue!\n");
return -1;
}
getchar();
}
return 0;
}
int type(struct student *p)
{
int n=0;
printf("请输入学生人数:");
scanf("%d",&n);
printf("请输入学生三门课的成绩:\n");
printf("学号 语文 数学 外语\n");
for(int i=0;i<n;i++)
{
printf("%d ",i+1);
struct student stu[i];
scanf("%f %f %f",&(p+i)->yw,&(p+i)->sx,&(p+i)->wy);
}
return n;
}
void list(struct student *p,int n)
{
printf("学生成绩如下:\n");
printf("学号 语文 数学 外语 平均分\n");
for(int i=0;i<n;i++)
{
printf("%d ",i+1);
printf("%.1f %.1f %.1f %.1f",p->yw,p->sx,p->wy,p->pj);
p++;
putchar(10);
}
}
void average(struct student *p,int n)
{
for(int i=0;i<n;i++)
{
(p->pj)=((p->yw)+(p->sx)+(p->wy))/3;
p++;
}
}
void help(void)
{
printf("**********************************\n");
printf(" * 学生成绩管理系统——帮助菜单 * \n");
printf("**********************************\n");
printf(" * H = 显示帮助菜单 * \n");
printf(" * T = 成绩录入 * \n");
printf(" * A = 计算学生平均分 * \n");
printf(" * L = 列出成绩单 * \n");
printf(" * P = 按平均成绩由高到低排序 * \n");
printf(" * S = 按学号查询学生成绩 * \n");
printf(" * C = 清屏 * \n");
printf(" * Q =退出系统 * \n");
printf("**********************************\n");
printf(" *Copyright(c) 2022.3.15 By liq* \n");
printf("**********************************\n");
}
void search(struct student *p)
{
int s=0;
printf("请输入要查询的学生号:");
scanf("%d",&s);
printf("学号 语文 数学 外语 平均分\n");
printf("%d %.1f %.1f %.1f %.1f",s,(p+s-1)->yw,(p+s-1)->sx,(p+s-1)->wy,(p+s-1)->pj);
putchar(10);
}
void sort(struct student *p,int n)
{
struct student temp;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(p[j].pj<p[j+1].pj)
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
printf("排序完成,请使用命令L查看!\n");
}
知らせ
必要に応じて別ファイルに記述してください。
上記のコードの関数部分を取り出して、fun.c と fun.h という 2 つの新しいファイルを作成するだけです。fun.c ファイルは、上記のコードの構造体宣言と関数部分 (および対応するヘッダー ファイル) を保存するために使用されます。fun.h は、構造体宣言と関数宣言 (および対応するヘッダー ファイル) を保存するために使用されます。
対応するヘッダー ファイルをメイン関数に追加します: #include "fun.h" (<> ではなく二重引用符)。
コンパイルするときは、main 関数と新しく作成した fun.c ファイルを一緒にコンパイルする必要があります。操作は以前と同じで、./a.out を使用して実行するだけです。
詳細を以下の図に示します。
1. 2 つの新しいファイル (同じ名前、異なるサフィックス) を作成し、コンパイルして実行します (複数のファイルを同時にコンパイルする必要があります)。
2.hs.c には、構造体宣言と対応する関数が格納されます (内部の関数は他のファイルに分割することもできるため、ここでは分割しません)。
#include <stdio.h>
#include <stdlib.h>
struct student
{
int id;
float yw;
float sx;
float wy;
float pj;
};
int type(struct student *p)
{
int n=0;
printf("请输入学生人数:");
scanf("%d",&n);
putchar(10);
printf("请输入学生三门课的成绩:\n");
putchar(10);
printf("学号 语文 数学 外语\n");
for(int i=0;i<n;i++)
{
printf("%d ",i+1);
struct student stu[i];
scanf("%f %f %f",&(p+i)->yw,&(p+i)->sx,&(p+i)->wy);
}
putchar(10);
return n;
}
void list(struct student *p,int n)
{
printf("学生成绩如下:\n");
printf("学号 语文 数学 外语 平均分\n");
for(int i=0;i<n;i++)
{
printf("%d ",i+1);
printf("%.1f %.1f %.1f %.1f",p->yw,p->sx,p->wy,p->pj);
p++;
putchar(10);
}
putchar(10);
}
void average(struct student *p,int n)
{
for(int i=0;i<n;i++)
{
(p->pj)=((p->yw)+(p->sx)+(p->wy))/3;
p++;
}
}
void help(void)
{
printf("**********************************\n");
printf(" * 学生成绩管理系统——帮助菜单 * \n");
printf("**********************************\n");
printf(" * H = 显示帮助菜单 * \n");
printf(" * T = 成绩录入 * \n");
printf(" * A = 计算学生平均分 * \n");
printf(" * L = 列出成绩单 * \n");
printf(" * P = 按平均成绩由高到低排序 * \n");
printf(" * S = 按学号查询学生成绩 * \n");
printf(" * C = 清屏 * \n");
printf(" * Q =退出系统 * \n");
printf("**********************************\n");
printf(" *Copyright(c) 2022.3.15 By liq* \n");
printf("**********************************\n");
}
void search(struct student *p)
{
int s=0;
printf("请输入要查询的学生号:");
scanf("%d",&s);
putchar(10);
printf("学号 语文 数学 外语 平均分\n");
printf("%d %.1f %.1f %.1f %.1f",s,(p+s-1)->yw,(p+s-1)->sx,(p+s-1)->wy,(p+s-1)->pj);
putchar(10);
}
void sort(struct student *p,int n)
{
struct student temp;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(p[j].pj<p[j+1].pj)
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
printf("排序完成,请使用命令L查看!\n");
}
3.hs.h には、hs.c の関数に対応する構造体宣言と関数宣言が格納されます。
#include <stdio.h>
#include <stdlib.h>
struct student
{
int id;
float yw;
float sx;
float wy;
float pj;
};
int type(struct student *p);
void list(struct student *p,int n);
void average(struct student *p,int n);
void help(void);
void search(struct student *p);
void sort(struct student *p,int n);
4.メイン機能
#include <stdio.h>
#include <stdlib.h>
#include "hs.h"
int main(int argc, const char *argv[])
{
char ch;
struct student stu[32];
int n=0;
while(1)
{
printf("请输入命令 = ");
scanf("%c",&ch);
putchar(10);
if(ch=='T')
{
n=type(stu);
}
else if(ch=='L')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
list(stu,n);
}
else if(ch=='A')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
{
average(stu,n);
printf("平均分已计算,请使用命令L查看!\n");
putchar(10);
}
}
else if(ch=='H')
help();
else if(ch=='C')
system("clear");
else if(ch=='S')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
{
search(stu);
putchar(10);
}
}
else if(ch=='P')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
{
sort(stu,n);
putchar(10);
}
}
else if(ch=='Q')
{
printf("Press any key to continue!\n");
return -1;
}
getchar();
}
return 0;
}