主題:一個簡易成績管理系統(tǒng)
功能介紹:
1.以文本形式存儲學(xué)生信息
2.對以存信息進行? ?1. 插入 2. 修改3. 刪除? 4.查詢? 5.成績數(shù)字特征
目錄
一:分析
二:查詢?
三:菜單
四:初始化函數(shù)
五:插入函數(shù)
六:修改函數(shù)
七:刪除函數(shù)
八:數(shù)字特征
九:顯示函數(shù)
一:分析
要進行 插入 查詢 刪除 修改 就還需要進行查詢。
這些函數(shù)內(nèi)部都需要調(diào)用同一種功能的函數(shù)因此
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查詢函數(shù)模塊需要精心設(shè)計
接下來先看查詢函數(shù)
在這之前確定數(shù)據(jù)結(jié)構(gòu)? 鏈式結(jié)構(gòu)(鏈表), 順序結(jié)構(gòu)(數(shù)組)
分析:
0)要進行初始化可以鏈表頭插法(建議帶頭結(jié)點優(yōu)點接下來可以看到增刪查改省去很多判斷)
student_information *head;
head = (student_information *)malloc(sizeof(student_information));
head->next = NULL;
while (1)
{
printf("是否繼續(xù)輸入成績: 1(是)/0(否) ");
scanf("%d", &judge);
if (judge == 1)
{
student_information *p;
p = (student_information *)malloc(sizeof(student_information));
if (!head->next)
{
head->next = p;
p->next = NULL;
}
else
{
p->next = head->next;
head->next = p;
}
else
{
return head;
}
}
??????也可以結(jié)構(gòu)體數(shù)組
1)要進行插入用鏈表較方便方法如下:
//p為目標結(jié)點
p->next = pf->next;
pf->next = p;
數(shù)組需要進行整體向后挪移 時間復(fù)雜度大,寫起來不方便
?2)要進行刪除鏈表也較方便:
pf->next = pf->next->next;
?同樣數(shù)組需要進行整體向后挪移 時間復(fù)雜度大,寫起來不方便
?3)要進行修改,查詢兩者相差不大
綜上所述:鏈表較優(yōu)
于是
typedef struct student_information
{
char name[15]; //姓名
char number[15]; //學(xué)號
int score[3]; //三科成績
//還可以加入其他信息類型
struct student_information *next;
} student_information;
OK
二:查詢?
這是姓名進行查詢
/// @brief 姓名查詢函數(shù)
/// @param head
/// @param name
/// @return 返回目標前指針
student_information *inquery_name(student_information *head, char name[])
{
student_information *p = head;
while (p->next)
{
if (strcmp((p->next)->name, name) != 0)//strcmp()返回值為-+0相等為零
p = p->next;
else
return p;
}
return p;
}
下面是學(xué)號查詢
/// @brief 學(xué)號查詢函數(shù)
/// @param head
/// @param number
/// @return 返回目標前指針
student_information *inquery_number(student_information *head, char number[])
{
student_information *p = head;
while (p->next)
{
if (strcmp((p->next)->number, number) != 0)
p = p->next;
else
return p;
}
return p;
}
/*這兩個函數(shù)可以改成QQ號,手機號等信息查詢,也可以進行雙重查詢(將姓名QQ一起查詢)只需將函數(shù)進行雙重判斷就行。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 這兩個也可以合并為一個函數(shù)因為參數(shù)都是string,但是要進行提示使用者要進行何種查詢。? ? ? ? ? */
接下來分析函數(shù)
1.參數(shù):是用鏈表進行的線性結(jié)構(gòu)存儲方式,自然參數(shù)要有頭指針。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.返回值:為目標結(jié)點的前一結(jié)點(利于插入刪除,都需要前一結(jié)點較方便,上面的函數(shù)可以看出來)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.主體較簡單,逐個比較即可。
將兩函數(shù)進行合并為一個函數(shù)塊
/// @brief 分為 姓名查詢與學(xué)號查詢
/// @param head
/// @return 返回頭指針 目標信息的前指針
student_information **inquery_info(student_information *head)
{
student_information *q, *qf;
int b;
char name_inquery[15];
char number_inquery[15];
printf("請選擇查詢方式:1.姓名查詢 2.學(xué)號查詢\n");
scanf("%d", &b);
switch (b)
{
case 1:
scanf("%s", name_inquery);
qf = q = inquery_name(head, name_inquery); //接收前指針
q = q->next;
if (q)
{
printf("************************************************\n");
printf("姓名\t學(xué)號\t\t成績1\t成績2\t成績3\n");
printf("%s\t%s\t%d\t%d\t%d\n", q->name, q->number, q->score[0], q->number[1], q->score[2]);
printf("************************************************\n");
}
else
printf("查詢的信息不存在?。?!\n");
break;
case 2:
printf("請輸入學(xué)號:");
scanf("%s", number_inquery);
qf = q = inquery_number(head, number_inquery); //接收前指針
q = q->next;
if (q)
{
printf("************************************************\n");
printf("姓名\t學(xué)號\t\t成績1\t成績2\t成績3\n ");
printf("%s\t%s\t%d\t%d\t%d\n", q->name, q->number, q->score[0], q->number[1], q->score[2]);
printf("************************************************\n");
}
else
printf("查詢的信息不存在?。?!\n");
break;
default:
printf("輸入錯誤!??!\n");
break;
}
point[0] = head;//此處將head,和qf一并傳回
point[1] = qf;
return point;
}
三:菜單
int main(void)
{
student_information *head;
student_information **temp; //臨時存儲頭指針與目標前指針
int flag = 1;
do
{
printf("初始化信息: 1\n");
printf("插入信息: 2\n");
printf("查詢信息: 3\n");
printf("修改信息: 4\n");
printf("刪除信息: 5\n");
printf("成績特征: 6\n");
printf("打印信息單: 7\n");
printf("退出程序: 0\n");
int o;
printf("請選擇功能:");
scanf("%d", &o);
switch (o)
{
case 1:
head = init_info();
break;
case 2:
head = insert_info(head);
break;
case 3:
temp = inquery_info(head);
head = temp[0];
break;
case 4:
head = modify_info(head);
break;
case 5:
head = dele_info(head);
break;
case 6:
digitalFeature(head);
break;
case 7:
show_info(head);
break;
case 0:
flag = 0;
printf("************************************************\n");
printf("感謝使用??!!\n");
printf("************************************************\n");
break;
default:
printf("\n輸入錯誤,請重新輸入!!!!\n\n");
break;
}
} while (flag);
}
四:初始化函數(shù)
要求需要將信息存儲進文件如下
//文件寫入
FILE *fp = fopen("information.txt", "w+");
if (!fp)
{
printf("文件打開失?。?!");
}
char str_1[] = "s";
fputs(p->name, fp);
fputs("\t", fp);
fputs(p->number, fp);
fputs("\t", fp);
itoa(p->score[0], str_1, 10);//integer to array 整形轉(zhuǎn)化為字符串
fputs(str_1, fp);
fputs("\t", fp);
itoa(p->score[1], str_1, 10);
fputs(str_1, fp);
puts("\t", fp);
itoa(p->score[2], str_1, 10);
fputs(str_1, fp);
fputs("\n", fp);
fclose(fp);
?初始化:
student_information *init_info()
{
int judge;
//文件寫入
FILE *fp = fopen("information.txt", "w+");
if (!fp)
{
printf("文件打開失敗?。?);
}
//帶頭結(jié)點鏈表
student_information *head;
head = (student_information *)malloc(sizeof(student_information));
head->next = NULL;
while (1)
{
printf("是否繼續(xù)輸入成績: 1(是)/0(否) ");
scanf("%d", &judge);
if (judge == 1)
{
student_information *p;
p = (student_information *)malloc(sizeof(student_information));
printf("請輸入信息:\n姓名\t學(xué)號\t成績1\t成績2\t成績3\n");
scanf("%s%s%d%d%d", p->name, p->number, &(p->score[0]), &(p->score[1]), &(p->score[2]));
if (!head->next)
{
head->next = p;
p->next = NULL;
}
else
{
p->next = head->next;
head->next = p;
}
//文件寫入部分
//
}
else
{
fclose(fp);
return head;
}
}
}
五:插入函數(shù)
/// @brief 顯示系統(tǒng)所有信息 將新信息插入到指定位序上
/// @param head
/// @return 返回新鏈表的頭指針
student_information *insert_info(student_information *head)
{
//文件寫入
int j, i;
show_info(head);
printf("請輸入要插入的位序 \n");
scanf("%d", &j);
student_information *p;
p = (student_information *)malloc(sizeof(student_information));
printf("請輸入信息:姓名\t學(xué)號\t成績1\t成績2\t成績3\n");
scanf("%s%s%d%d%d", p->name, p->number, &(p->score[0]), &(p->score[1]), &(p->score[2]));
student_information *pf = head;
for (i = 1; i < j; i++)
{
pf = pf->next;
}
p->next = pf->next;
pf->next = p;
printf("插入成功?。。n");
p = head->next;
//寫入文件
char str_2[] = "s";
while (p)
{
//即使存入文件
//文件寫入部分
//
p = p->next;
}
//fclose(fp_1);
return head;
}
六:修改函數(shù)
/// @brief 修改信息 并重新存儲到文檔中
/// @param head
/// @return 返回新鏈表的頭指針
student_information *modify_info(student_information *head)
{
//文件寫入
//
student_information **p;
student_information *q;
p = inquery_info(head); //接受返回的頭指針與目標前指針
q = p[1]; //接收目標指針
q = q->next; //移動到目標指針
if (q == NULL)
{
printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
printf("輸入信息錯誤,信息不存在??!\n");
}
else
{
int flag = 1;
while (flag)
{
int s;
printf("請選擇要修改的信息:\n1.姓名, 2.學(xué)號, 3.成績1, 4.成績2, 5.成績3, 0.不修改退出\n");
scanf("%d", &s);
switch (s)
{
case 1:
printf("請輸入新姓名\n");
scanf("%s", q->name);
printf("修改成功?。。?!\n");
break;
case 2:
printf("請輸入新學(xué)號\n");
scanf("%s", q->number);
printf("修改成功!?。?!\n");
break;
case 3:
printf("請輸入新成績1\n");
scanf("%d", &(q->score[0]));
printf("修改成功!?。?!\n");
break;
case 4:
printf("請輸入新成績2\n");
scanf("%d", &(q->score[0]));
printf("修改成功?。。?!\n");
break;
case 5:
printf("請輸入新成績3\n");
scanf("%d", &(q->score[0]));
printf("修改成功!?。?!\n");
break;
case 0:
flag = 0;
break;
default:
printf("請重新輸入!!\n");
break;
}
}
}
student_information *p_2;
p_2 = head->next;
char str_3[] = "j";
//寫入文件
while (p_2)
{
//
p_2 = p_2->next;
}
//fclose(fp_2);
return p[0]; //返回頭指針
}
七:刪除函數(shù)
/// @brief 刪除信息 并重新存儲到文檔中
/// @param head
/// @return 返回新鏈表的頭指針
student_information *dele_info(student_information *head)
{
//文件寫入
student_information **p;
student_information *q;
p = inquery_info(head); //接受返回的頭指針與目標前指針
q = p[1]; //接收目標指針的前指針 不移動到目標指針利于刪除
if ((q->next) != NULL)
{
q->next = q->next->next;
printf("刪除成功!?。。n");
}
else
{
printf("輸入信息錯誤,信息不存在!!\n");
}
head = p[0]; //接收頭指針
student_information *p_3;
p_3 = head->next;
char str_4[] = "j";
//寫入文件
while (p_3)
{
//
p_3 = p_3->next;
}
//fclose(fp_3);
return head; //返回新鏈表的頭指針
}
八:數(shù)字特征
自由發(fā)揮部分
/// @brief 顯示平均分 最高分 不及格人數(shù) 優(yōu)秀率
/// @param head
void digitalFeature(student_information *head)
{
int h;
student_information *sco = head->next;
int total[subjectTotal] = {0}; //臨時變量 存分數(shù)之和
double average[subjectTotal]; //平均分
int max_score[subjectTotal] = {0}; //最高分
double people = 0.0; //總?cè)藬?shù)
int people_fail[subjectTotal] = {0}; //三科不及格人數(shù)
int people_good[subjectTotal] = {0}; //優(yōu)秀人數(shù)
double goodRate[subjectTotal] = {0}; //三科優(yōu)秀率
while (sco != NULL)
{
people += 1;
for (h = 0; h < subjectTotal; h++)
{
total[h] += sco->score[h];
if (sco->score[h] < 60)
people_fail[h]++;
if (sco->score[h] >= 85)
people_good[h]++;
if (sco->score[h] > max_score[h])
max_score[h] = sco->score[h];
}
sco = sco->next;
}
for (h = 0; h < subjectTotal; h++)
{
average[h] = total[h] / people;
goodRate[h] = people_good[h] / people;
}
printf("**********************************************************************\n");
printf(" 成績數(shù)字特征 \n");
for (h = 0; h < subjectTotal; h++)
{
printf("科目%d\t平均分%6.2f\t最高分%d\t不及格人數(shù)%d\t優(yōu)秀率%6.2f\n", h + 1, average[h], max_score[h], people_fail[h], goodRate[h]);
}
printf("**********************************************************************\n");
}
九:顯示函數(shù)
/// @brief 顯示全部信息
/// @param head
void show_info(student_information *head)
{
student_information *p = head->next;
int i = 1;
printf("************************************************\n");
printf("序號\t姓名\t學(xué)號\t\t成績\t成績\t成績\n ");
while (p)
{
printf("%d\t%s\t%s\t%d\t%d\t%d\n", i, p->name, p->number, p->score[0], p->number[1], p->score[2]);
p = p->next;
i++;
}
printf("************************************************\n");
}
十:運行結(jié)果?
菜單
初始化?
插入?
查詢?
修改?
刪除?
?就到這了?。。。。?!文章來源:http://www.zghlxwxcb.cn/news/detail-525242.html
內(nèi)容僅供自己學(xué)習(xí)記錄,歡迎指正!?。?!感謝?。。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-525242.html
到了這里,關(guān)于C語言學(xué)生成績信息管理系統(tǒng)(超詳細版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!