部分功能無法實作

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct tagStudent
{
int nStuNum; //學號
char szName[10]; //姓名
char szClass1[20];//課程 1
int nScore1; //成績 1
int nCredit1; //學分 1
char szClass2[20];//課程 2
int nScore2; //成績 2
int nCredit2; //學分 2
char szClass3[20];//課程 3
int nScore3; //成績 3
int nCredit3; //學分 3
char szClass4[20];//課程 4
int nScore4; //成績 4
int nCredit4; //學分 4
char szClass5[20];//課程 5
int nScore5; //成績 5
int nCredit5; //學分 5
float avgXFJ;
int paiming;
}Student;
typedef struct tagNode
{
Student stu; //學生資訊
struct tagNode* pNext; //指向下一個學生
}Node;
Node *g_pHead = NULL; //定義第一個學生
//錄入學生資訊
void InputStudent();
//列印學生資訊
void PrintStudent();
//保存學生資訊
void SaveStudent();
//讀取學生資訊
void ReadStudent();
//統計所有學生人數
int CountStudent();
//查找學生資訊
Node* FindStudent();
//修改某個學生的資訊
void ModifyStudent();
//洗掉學生資訊
void DeleteStudent();
//計算平均學分績
void CalculateXFJ(Node* pn);
//計算排名
void CalculatePaiming(Node* pn);
int main()
{
while (1)
{
printf("\n 歡迎進入\n\t\t\t\t 學生成績管理系統\n\n\t\t\t\t\t\t-------作者:\n");
printf("********************************* 主 菜 單*****************************************\n");
printf("=======>>>請選擇功能串列\n");
printf("\t1 錄入學生資訊\t\t\t\t\t2 顯示學生資訊\n");
printf("\t3 保存學生資訊\t\t\t\t\t4 讀取學生資訊\n");
printf("\t5 統計所有學生人數\t\t\t\t6 查找學生資訊\n");
printf("\t7 修改學生資訊\t\t\t\t\t8 洗掉學生資訊\n");
printf("\t0 退出系統\n");
printf("***********************************************************************************\n");
char ch;
//scanf("%c", &ch);
ch = _getch();
switch (ch)
{
case '1'://錄入學生資訊
InputStudent();
break;
case '2'://顯示學生資訊
PrintStudent();
break;
case '3'://保存學生資訊
SaveStudent();
break;
case '4'://讀取生資訊
ReadStudent();
break;
case '5'://統計所有學生人數
printf("當前學生總人數為:%d\n", CountStudent());
break;
case '6'://查找學生資訊
{
Node *pNode = FindStudent();
if (pNode != NULL)
{
printf("學號:%d\t姓名:%s\t課程1:%s\t成績1:%d\t學分1:%d\t課程2:%s\t成績2:%d\t學分2:%d\t課程3:%s\t成績3:%d\t學分3:%d\t課程4:%s\t成績4:%d\t學分4:%d\t課程5:%s\t成績5:%d\t學分5:%d\n", pNode->stu.nStuNum, pNode->stu.szName, pNode->stu.szClass1, pNode->stu.nScore1, pNode->stu.nCredit1, pNode->stu.szClass2, pNode->stu.nScore2, pNode->stu.nCredit2, pNode->stu.szClass3, pNode->stu.nScore3, pNode->stu.nCredit3, pNode->stu.szClass4, pNode->stu.nScore4, pNode->stu.nCredit4, pNode->stu.szClass5, pNode->stu.nScore5, pNode->stu.nCredit5);
}
break;
}
case '7'://修改某個學生的資訊
ModifyStudent();
break;
case '8'://洗掉學生資訊
DeleteStudent();
break;
case '0':
printf("歡迎再次使用!\n");
return 0;
break;
default:
printf("您的輸入有誤,請重新輸入!\n");
break;
} //
}
return 0;
}
//錄入學生資訊
void InputStudent()
{
printf("\n請輸入學生資訊:\n學號 姓名 課程1 成績1 學分1 課程2 成績2 學分2 課程3 成績3 學分2 課程4 成績4 學分4 課程5 成績5 學分5\n");
Node* p;
p = g_pHead;
while (g_pHead != NULL && p->pNext != NULL)
{
p = p->pNext;
}
//為新的學生分配一個空間
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
if (g_pHead == NULL)
{
g_pHead = pNewNode;
p = g_pHead;
}
else
{
p->pNext = pNewNode;//p的下一個節點為pNewNode
}
//輸入新的學生資料
scanf("%d %s %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d", &pNewNode->stu.nStuNum, &pNewNode->stu.szName, &pNewNode->stu.szClass1,
&pNewNode->stu.nScore1, &pNewNode->stu.nCredit1, &pNewNode->stu.szClass2, &pNewNode->stu.nScore2, &pNewNode->stu.nCredit2,
&pNewNode->stu.szClass3, &pNewNode->stu.nScore3, &pNewNode->stu.nCredit3, &pNewNode->stu.szClass4, &pNewNode->stu.nScore4,
&pNewNode->stu.nCredit4, &pNewNode->stu.szClass5, &pNewNode->stu.nScore5, &pNewNode->stu.nCredit5);
CalculateXFJ(pNewNode);
system("cls");
printf("\n資料添加成功....\n");
}
//顯示學生資訊
void PrintStudent()
{
system("cls");
printf("顯示所有學生資訊\n");
Node* p;
p = g_pHead;
while (p != NULL)
{
printf ("學號:%d\t姓名:%s\t課程1:%s\t成績1:%d\t學分1:%d\t課程2:%s\t成績2:%d\t學分2:%d\t課程3:%s\t成績3:%d\t學分3:%d\t課程4:%s\t成績4:%d\t學分4:%d\t課程5:%s\t成績5:%d\t學分5:%d\t平均學分績:%f\t排名:%d\n",
p->stu.nStuNum,
p->stu.szName,
p->stu.szClass1,
p->stu.nScore1,
p->stu.nCredit1,
p->stu.szClass2,
p->stu.nScore2,
p->stu.nCredit2,
p->stu.szClass3,
p->stu.nScore3,
p->stu.nCredit3,
p->stu.szClass4,
p->stu.nScore4,
p->stu.nCredit4,
p->stu.szClass5,
p->stu.nScore5,
p->stu.nCredit5,
p->stu.avgXFJ,
p->stu.paiming
);
p = p->pNext;
}
}
//保存學生資訊
void SaveStudent()
{
system("cls");
FILE *pFile = fopen("stuinfo.txt", "at+");
if (pFile == 0)
{
printf("打開檔案失敗\n");
return;
}
//寫入資料
Node *p;
p = g_pHead;
while (p != NULL)
{
fprintf(pFile, "%d %s %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %f %d\n", p->stu.nStuNum, p->stu.szName, p->stu.szClass1, p->stu.nScore1, p->stu.nCredit1, p->stu.szClass2, p->stu.nScore2, p->stu.nCredit2, p->stu.szClass3,
p->stu.nScore3, p->stu.nCredit3, p->stu.szClass4, p->stu.nScore4, p->stu.nCredit4, p->stu.szClass5, p->stu.nScore5, p->stu.nCredit5,p->stu.avgXFJ,p->stu.paiming);
p = p->pNext;
}
printf("資料保存成功\n");
//關閉檔案
fclose(pFile);
}
//讀取學員資訊
void ReadStudent()
{
system("cls");
//首先洗掉鏈表資料,然后從檔案中讀取資料
Node *p, *p2;
p = p2 = g_pHead;
while (p2 != NULL)
{
//逐個洗掉鏈表中的資料
p = p->pNext;
free(p2);
p2 = p;
}
g_pHead = NULL;
//打開檔案
FILE *pFile = fopen("stuinfo.txt", "at+");
if (pFile == 0)
{
printf("打開檔案失敗\n");
return;
}
//讀取資料
while (!feof(pFile))
{
//分配空間以存盤資料
Node *pTemp = (Node*)malloc(sizeof(Node));
//從檔案中讀取
fscanf(pFile, "%d %s %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %f %d\n", &pTemp->stu.nStuNum, &pTemp->stu.szName, &pTemp->stu.szClass1, &pTemp->stu.nScore1,
&pTemp->stu.nCredit1, &pTemp->stu.szClass2, &pTemp->stu.nScore2, &pTemp->stu.nCredit2, &pTemp->stu.szClass3, &pTemp->stu.nScore3, &pTemp->stu.nCredit3,
&pTemp->stu.szClass4, &pTemp->stu.nScore4, &pTemp->stu.nCredit4, &pTemp->stu.szClass5, &pTemp->stu.nScore5, &pTemp->stu.nCredit5,&pTemp->stu.avgXFJ,&pTemp->stu.paiming);
//創建鏈表
if (g_pHead == NULL)
{
g_pHead = pTemp;
p = g_pHead;
}
else
{
p->pNext = pTemp;//p的下一個節點為temp
p = p->pNext;
p->pNext = NULL;
}
}
//關閉檔案
fclose(pFile);
}
//統計所有學生人數
int CountStudent()
{
system("cls");
int nCount = 0;
//先把檔案中的資料讀取到鏈表中
ReadStudent();
Node *p;
p = g_pHead;
while (p != NULL)
{
nCount++;
p = p->pNext;
}
return nCount;
}
//查找學生資訊
Node* FindStudent()
{
system("cls");
int nStuNum;
printf("請輸入要查找的學生的學號:\n");
scanf("%d", &nStuNum);
//先從檔案中讀取到鏈表中
ReadStudent();
Node* p;
p = g_pHead;
while (p != NULL)
{
if (p->stu.nStuNum == nStuNum)
{
return p;
}
p = p->pNext;
}
//遍歷完鏈表也沒有找到資訊
if (p == NULL)
{
printf("沒有該學生的資訊\n");
return NULL;
}
return NULL;
}
//修改某個學生的資訊
void ModifyStudent()
{
system("cls");
int nStuNum;
printf("請輸入要修改學生資訊的學號:\n");
scanf("%d", &nStuNum);
//先把檔案中的資料讀取到鏈表中
ReadStudent();
Node* p;
p = g_pHead;
while (p != NULL)
{
if (p->stu.nStuNum == nStuNum)
{
printf("請輸入要修改的資訊:學號 姓名 課程1 成績1 學分1 課程2 成績2 學分2 課程3 成績3 學分2 課程4 成績4 學分4 課程5 成績5 學分5\n");
scanf("%d %s %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %f %d\n", p->stu.nStuNum, p->stu.szName, p->stu.szClass1, p->stu.nScore1, p->stu.nCredit1, p->stu.szClass2, p->stu.nScore2, p->stu.nCredit2, p->stu.szClass3,
p->stu.nScore3, p->stu.nCredit3, p->stu.szClass4, p->stu.nScore4, p->stu.nCredit4, p->stu.szClass5, p->stu.nScore5, p->stu.nCredit5);
//計算平均學分績
//CalculateXFJ(p);
//計算排名
//CalculatePaiming( p);
printf("修改成功!\n");
break;
}
p = p->pNext;
}
if (p == NULL)
{
printf("沒有該學生資訊!\n");
}
}
//洗掉學生資訊
void DeleteStudent()
{
system("cls");
int nStuNum;
printf("請輸入要洗掉學生資訊的學號:\n");
scanf("%d", &nStuNum);
//先把檔案中的資料讀取到鏈表
ReadStudent();
Node *p, *p2;
p = g_pHead;
//判斷是否是頭結點
if (g_pHead->stu.nStuNum == nStuNum)
{
p2 = g_pHead;
g_pHead = g_pHead->pNext;//頭指標指向洗掉元素后的首元素
free(p2);//釋放節點
return;
}
//不是頭結點
while (p->pNext != NULL)
{
if (p->pNext->stu.nStuNum == nStuNum)
{
p2 = p->pNext;
p->pNext = p->pNext->pNext;//洗掉該節點指標跳過此節點
free(p2);
return;
}
p = p->pNext;//指向下一個節點
if (p->pNext == NULL)
{
//判斷是否到了鏈表的結尾
break;
}
}
if (p->pNext == NULL)
{
printf("沒有該學生資訊\n");
}
}
//計算平均學分績
void CalculateXFJ(Node* pn)
{
//課程學分*課程成績總和
float sum=
(pn->stu.nCredit1) * (pn->stu.nScore1)+
(pn->stu.nCredit2) * (pn->stu.nScore2)+
(pn->stu.nCredit3) * (pn->stu.nScore3)+
(pn->stu.nCredit4) * (pn->stu.nScore4)+
(pn->stu.nCredit5) * (pn->stu.nScore5);
//課程學分總和
float sumCredit= pn->stu.nCredit1+pn->stu.nCredit2+pn->stu.nCredit3+pn->stu.nCredit4+pn->stu.nCredit5;
pn->stu.avgXFJ=sum/sumCredit;
}
void CalculatePaiming(Node* pn)
{
float max=0;
int num=0;
Node *p;
p = g_pHead;
while (p != NULL)
{
max=p->stu.avgXFJ;
num =0;
while(p!=NULL)
{
if(p->pNext==NULL)
{
}
if(p->pNext->stu.avgXFJ>max)
{
num++;
p->stu.paiming=num;
}
}
p = p->pNext;
}
}
uj5u.com熱心網友回復:
什么功能無法實作uj5u.com熱心網友回復:
劃線的那幾個
uj5u.com熱心網友回復:
連續輸入,用回圈就可以了。排序也很簡單,冒泡排序就行了。
冒泡排序可以參考
https://blog.csdn.net/zhanghaiyang9999/article/details/107102728
uj5u.com熱心網友回復:
排序可以宣告一個臨時的student變數,然后冒泡排序時交換結構體轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/30909.html
標籤:C語言
上一篇:socket 多客戶端通訊
