c語言學生管理系統鏈表(實現文件的讀入讀出功能)


大一期末作業終於告一段落

學生管理系統可以用來管理班級學生,能夠對學生信息(包括姓名、性別、年齡、成績等)進行增加、刪除、更改、查詢等操作。

該軟件將學生信息保存在文件中,直接對文件中的數據進行增刪改查操作,除了能夠培養您的編程思維,還能讓你深入了解文件操作。

廢話不多說,下面貼代碼(在VS2012環境下實測可以運行  在dev環境下測試可以運行)

 

#define LG (sizeof(struct student))
struct student
{
char name[10];//保存學生姓名
char sex[5];//保存學生的性別
long int num;//學號
int xuhao;//
int age;
float score[3];
float averange;
char DJ;//存放等級哦
struct student *next;

};//定義結構體變量保存 名字 性別 年齡 成績] 結構體聲明
int n;//存放學生人數
int man;//存放統計的男生數
int time=3000;//定義全局變量暫停時間
float JY(float a)//成績校驗函數
{
int n=0;
while(1)
{
if(a>100||a<0)
{
printf(" 輸入成績有誤,范圍應該0-100,請重新輸入:");
scanf("%f",&a);
n=n+1;
}
else
{
return a;
}
}
}
struct student *creat(void)// 鏈表創建函數
{
struct student *head;//頭指針 
struct student *p1,*p2,*p3;// 其他指針 
int mm=0;
int m=1;
n=0;
p1=p2=(struct student *)malloc(LG); // 開辟內存空間 
if(p1==NULL)
{
printf("開辟內存空間失敗\n");
}
//內存空間開辟后最后一定要釋放
printf("請先輸入學號(輸入0退出錄入)\n");
printf(" ");
p1->xuhao=m;
m++;
scanf("%d",&p1->num);
if(p1->num!=0)
{
printf(" 請輸入您的姓名\n");
printf(" ");
scanf("%s",&p1->name);
printf(" 你好,%s!",p1->name);
printf("請輸入您的性別male or female\n");
//mm=sexJY((char*)p1->sex);//char **類型與char *類型不兼容 需要強制轉換為char*類型
printf(" ");
scanf("%s",&p1->sex); 
mm=sexJY(p1->sex);
if(mm==1)
{ 
printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n");
printf(" 第一科的成績是:");
scanf("%f",&p1->score[0]); 
p1->score[0]=JY(p1->score[0]);//校驗第一科的成績	
printf(" 第二科的成績是:");
scanf("%f",&p1->score[1]); 
p1->score[1]=JY(p1->score[1]);//校驗第二科的成績
printf(" 第三科的成績是:");
scanf("%f",&p1->score[2]);
p1->score[2]=JY(p1->score[2]);//校驗第三科的成績
printf(" 錄入完畢\n");

_sleep(1000);
printf("-----------------------------------------------------------------------------------------------------------------\n");

} 
} 

head=NULL;
while(1)
{
n=n+1;
if(n==1) 
{
head=p1; 
} 
else 
{
p3=(struct student *)malloc(LG);

printf("請先輸入學號(輸入0退出錄入)\n");
printf(" ");
p3->xuhao=m;
m++;
scanf("%d",&p3->num);

if(p3->num!=0)
{
printf(" 請輸入您的姓名\n");
printf(" ");
scanf("%s",&p3->name);
printf(" 你好,%s!",p3->name);
printf("請輸入您的性別male or female\n");
printf(" ");
scanf("%s",&p3->sex); 
mm=sexJY(p3->sex);//char **類型與char *類型不兼容 需要強制轉換為char*類型
if(mm==1)
{

printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n");
printf(" 第一科的成績是:");
scanf("%f",&p3->score[0]); 
p3->score[0]=JY(p3->score[0]);//校驗第一科的成績	
printf(" 第二科的成績是:");
scanf("%f",&p3->score[1]);
p3->score[1]=JY(p3->score[1]);//校驗第二科的成績
printf(" 第三科的成績是:");
scanf("%f",&p3->score[2]);
p3->score[2]=JY(p3->score[2]);//校驗第三科的成績
printf(" 錄入完畢\n");
_sleep(1000);
printf("-----------------------------------------------------------------------------------------------------------------\n");

p2->next=p3;
p2=p3;
printf("%d",n);
}
}
else
{
n--;
break;
}
}

}

p2->next=NULL;
return (head);
}////結構體鏈表創
void body()//界面設計
{ 
/*
char stCmd[128];
sprintf("mode con cols=%d lines=%d", height, width);
system(stCmd);動態設置窗體大小
*/
system("mode con cols=120 lines=40");
//system("color f4");
printf("\n ----------------------------------------------- 學生成績管理系統-----------------------------------------------\n"); 
printf("\n");
printf("\n");
printf(" ===========================\n");
printf(" = 請先輸入數據 =\n");
printf(" ===========================\n");
printf(" 請輸入學生的信息,包含姓名、性別、年齡 、語文成績、數學成績、外語成績。\n \n \n");
printf(" ---------------------------------------------------------------------------------------------------------------\n "); 
printf("\n");
}
void body2()//界面設計
{
printf("\n ----------------------------------------- 學生成績管理系統-----------------------------------------------\n"); 
printf("\n");
printf("\n");
printf(" ==========================\n");
printf(" = 歡迎 =\n");
printf(" 該系統共有%d個學生\n",n);
printf(" ===========================\n");
}
int showdata(struct student *head)//功能界面,
{
struct student *p;
int sexJY(char *sex);//性別校驗函數
void *dell(struct student *head);//摧毀函數
struct student *del(struct student *head);
struct student *del2(struct student *head);//刪除功能2
long int search(struct student *head);//查找功能
int showdata3(struct student *head);//系統設置
void print1(struct student *head);//打印功能1
void print2(struct student *head);//打印功能2
void print3(struct student *head);//打印功能3
void out1(struct student *head);//輸出到文件功能
struct student *add(struct student *head);//添加功能
void cont(struct student *head);//計算功能1
void change1(struct student*head);//修改功能
struct student* input1();//外部導入功能
//void input1(struct student *head);//錄入功能
//void change1(struct student*head, long int i)//修改功能 
struct student *add(struct student *head);//插入數據
struct student*nsert(struct student *head);
//	void destroy1(struct student *head);//摧毀鏈表
int TJ(struct student *head);//男生計算功能
int i;//存放學生編號 
int iii;//存放選擇顯示參數
int j;//存放選擇參數 
int o;//選擇顏色參數
long int ii;//存放需要修改的學生編號
long int jj;//存放需要查找的學生編號
char a;
p=head;

while(1)
{
body2();
printf("\n");
printf("\n");
printf("\n---------- 學生成績管理系統------------\n"); 
printf("\n");
printf(" 1 ======================\n");
printf(" = 主菜單 =\n");
printf(" ======================\n");
printf("\n");
printf(" 請根據需要選擇操作\n");
printf("\n");
printf(" 選擇查詢的方式\n");
printf(" (0) 輸入0退出該系統\n");
printf(" (1)增加一個同學信息 \n");
printf(" (2)刪除一個同學信息 \n");
printf(" (3)修改一個學生信息 \n");//完成
printf(" (4)計算學生的三科平均分並且給予等級 \n");//完成
printf(" (5)顯示所有學生的信息 \n");//完成
//printf(" (6) 設置系統背景 \n");//完成
printf(" (6) 數據存盤 \n");//完成
printf(" (7) 查找一個學生的信息\n");
printf(" (8) 統計男生的人數\n");
printf(" (9) 局部顯示學生的信息\n");
printf(" (10) 系統設置\n");
//printf(" (11) 選擇顯示時間\n");
//printf(" (12) 刪除所有學生的數據\n");
//printf(" (13) 數據存盤\n ");
printf(" 請選擇1-10\n");

scanf("%d",&j);//選擇不同的功能
if(j==0)
{
break;
}
if(j>=1&&j<=10)
{
switch(j)
{
case 1:
add(p);
_sleep(time);
system("cls");//清屏操作 
break;
case 2: 
del(p);
_sleep(time);
system("cls"); 
break;
case 3:
print3(p);
change1(p);
break;
// change1(p,ii);
system("cls"); 
break;
case 4:
cont(p);
//rank(stu);
_sleep(time);
system("cls"); 
break;
case 5:
print3(p);
_sleep(time);	
break;
case 6:
out1(p);
_sleep(time);
break;
/* case 6:
printf("請選擇顏色\n");
printf("(1)天藍色");
printf("(2)紅色");
printf(" (3) 白色 ");
printf(" (4) 亮白色 ");
printf(" (5)綠色 ");
scanf("%d",&o);
switch(o)
{
case 1:
system("color 0B");
break;
case 2:
system("color 0C");
break;
case 3:
system("color 07");
break;
case 4:
system("color 0F");
break;
case 5:
system("color 0A");
break;
default://其他值均為默認
system("color 07");
break;
}
break;*/
case 7:
printf("請輸入要查找的學生學號");
search(p);
_sleep(time);
break;
case 8:
TJ(p);//計算男生人數
_sleep(time);
break;
case 9:
showdata2(p);
_sleep(time);
// _sleep(5000); 
break;
case 10://系統設置
showdata3(p);
_sleep(time);
break;

/* case 11:
printf("輸入暫停時間(s),默認3s\n");
scanf("%d",&time);
time=time*1000;
_sleep(time);
break;
*/
/*case 12:
printf("正在摧毀鏈表\n");
dell(p);
time=time*1000;
_sleep(time);*/
/*case 13:
out1(p);
_sleep(time);
*/

}
}
else
{
printf("輸入錯誤\n");
_sleep(time);
system("cls");
}


}

}
int showdata2(struct student *head)
{

struct student *p;

int sexJY(char *sex);//性別校驗函數
struct student *del(struct student *head);
struct student *del2(struct student *head);//刪除功能2
//	long int search(struct student *head,long int i);//查找功能
void print1(struct student *head);//打印功能1
void print2(struct student *head);//打印功能2
void print3(struct student *head);//打印功能3
void cont(struct student *head);//計算功能1
void change1(struct student*head);
struct student *add(struct student *head);//插入數據
struct student*nsert(struct student *head);
int TJ(struct student *head);//男生計算功能
int iii;//存放學生的查詢參數
p=head;
system("cls");//清屏
printf(" 1 ======================\n");
printf(" = 副菜單 =\n");
printf(" ======================\n");
printf(" 選擇查詢的方式\n");
printf("\n 1.顯示所有學生的成績\n");
printf("\n 2.顯示所有學生的學號性別\n");
printf("\n 3.顯示所有學生的所有信息\n");
printf(" 請選擇1-3\n");
scanf("%d",&iii);

switch (iii)
{
case 1:
print2(p);
_sleep(1000);
break;
case 2:
print1(p);
_sleep(1000);
break;
case 3:
print3(p);
_sleep(1000);
break;
default:
printf("輸入錯誤,返回主菜單\n");
break;
}

return 0;

}//二級菜單 
int showdata3(struct student *head)//系統設置選項
{
struct student *p;
int iii;
int o;
p=head;
system("cls");//清屏
printf(" 1 ======================\n");
printf(" = 副菜單 =\n");
printf(" ======================\n");
printf(" 選擇查詢的方式\n");
printf("\n (1). 設置系統背景 \n");
printf("\n (2). 修改系統延時 \n");
printf("\n (3). 刪除鏈表所有數據並重新讀入\n");
printf(" 請選擇1-2\n");
scanf("%d",&iii);

switch (iii)
{
case 1:
printf("請選擇顏色\n");
printf("(1)天藍色");
printf("(2)紅色");
printf(" (3) 白色 ");
printf(" (4) 亮白色 ");
printf(" (5)綠色 ");
scanf("%d",&o);
switch(o)
{
case 1:
system("color 0B");
break;
case 2:
system("color 0C");
break;
case 3:
system("color 07");
break;
case 4:
system("color 0F");
break;
case 5:
system("color 0A");
break;
default://其他值均為默認
system("color 07");
break;
}
_sleep(1000);
break;
case 2:
printf("輸入暫停時間(s),默認3s\n");
scanf("%d",&time);
time=time*1000;
_sleep(time);
break;
case 3:
printf("正在摧毀鏈表\n");
dell(p);
time=time*1000;
_sleep(1000);
break;
default:
printf("輸入錯誤,返回主菜單\n");
break;
}

return 0;

}
void print1(struct student *head)
{
struct student *p;
p=head;
if(head==NULL)
{
exit(0);
}
printf("------------------------------------------------------------------------------------------------------------------\n");
do
{
printf("\n 姓名:%s,學號%d,%s\n\n",p->name,p->num,p->sex);//姓名,學號
p=p->next;
}while(p!=NULL);
}//不同顯示數據的方式 第一種
void print2(struct student *head)//顯示所有學生的成績
{
struct student *p;
p=head;
if(head==NULL)
{
exit(0);
}
printf("------------------------------------------------------------------------------------------------------------------\n");
do
{
printf("\n\n 姓名%s,語文:%3.1f,數學:%3.1f,外語:%3.1f\n",p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}while(p!=NULL);
}//不同顯示數據的方式 第二種
void print3(struct student *head)
{
float a;
struct student *p;
p=head;
if(head==NULL)
{
exit(0);
}

printf("------------------------------------------------------------------------------------------------------------------------------------------");
while(p!=NULL)
{
printf("\n\n序號 %d 學號 %ld 姓名:%s 性別: %s 語文: %3.1f 數學:%3.1f 外語:%3.1f",p->xuhao,p->num,p->name,p->sex,p->score[0],p->score[1],p->score[2]);//姓名,性別
a=p->score[0]+p->score[1]+p->score[2];
printf(" 總分:%3.1f",a);
printf(" 等級%c\n",p->DJ);
p=p->next;
}
}
int passwd(char *name, char *pwd) 
{
int u = 0;
if (strcmp(name, "root") == 0 && strcmp(pwd, "123456") == 0)
{
u =1;
return u;
}
else if (strcmp(name, "1") == 0 && strcmp(pwd, "1") == 0)
{
u = 1;
return u;
}
return 0;
}//密碼校驗函數 傳遞兩個字符數組,一個賬號,一個密碼。
void change1(struct student*head)
{
long int i;
struct student *p;
p=head;//定義指針
if(head==NULL)
{
exit(0);
}
printf("輸入想要修改的學生的學號:\n");
scanf("%ld",&i);
do
{	
//printf("test1");
if(p->num==i)//當結點跳轉到該學生時修改成績
{

printf("開始修改信息\n");
printf("請先輸入學號\n");
printf(" ");

scanf("%ld",&p->num);
if(p->num!=0)
{
printf(" 請輸入您的姓名\n");
printf(" ");
scanf("%s",&p->name);
printf(" 你好,%s!",p->name);
printf("請輸入您的性別male or female\n");

printf(" ");
scanf("%s",&p->sex); 
printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n");
printf(" 第一科的成績是:");
scanf("%f",&p->score[0]); 
p->score[0]=JY(p->score[0]);//校驗第一科的成績	
printf(" 第二科的成績是:");
scanf("%f",&p->score[1]); 
p->score[1]=JY(p->score[1]);//校驗第二科的成績
printf(" 第三科的成績是:");
scanf("%f",&p->score[2]);
p->score[2]=JY(p->score[2]);//校驗第三科的成績
printf(" 錄入完畢\n");
printf("-----------------------------------------------------------------------------------------------------------------\n");
break; 
} 
p=p->next;//需要把下一個結點賦值給p

}


} while(p->next!=NULL);

 

 

 

}
void cont(struct student *head)//計算學生等級函數
{
struct student *p;
int i=0;
p=head;
if(head==NULL)
{
exit(0);
}
printf("------------------------------------------------------------------------------------------------------------------\n");
printf("----------------------------------------計算中----------------------------------------\n");
do{
p->averange=((p->score[0])+(p->score[1])+(p->score[2]))/3.0;
printf("第%d同學的成績為%3.1f",i+1,p->averange);

if(p->averange>=90&&p->averange<=100)
{ 

printf(" 等級為A\n",i+1);
p->DJ='A';
}
if(p->averange>=60&&p->averange<=89)
{

printf(" 等級為B\n",i+1);
p->DJ='B';
}
if(p->averange>=0&&p->averange<=60)
{

printf(" 等級為C\n",i+1);
p->DJ='C';
}
if(p->averange>100||p->averange<0)
{

printf(" incorrect\n");
}
i=i+1;
p=p->next;



}while(p!=NULL);


}
long int search(struct student *head)//通過學號來查找學生的信息
{
struct student *p;
long jj;

scanf("%ld",&jj);
p=head;
if(head==NULL)
{
exit(0);
}
do{
if(jj==p->num)
{
printf("\n\n學號 %ld 姓名:%s 性別: %s 語文: %3.1f 數學:%3.1f 外語:%3.1f 等級%c\n",p->num,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->DJ);
return 0;
}


p=p->next;
}while(p->next!=NULL);
//遍歷鏈表結點

printf("無該生信息\n");
return 0;

 


}
struct student *del(struct student *head)//鏈表怎么刪除結點並鏈接 刪除序號為多少的學生的成績 定義一個結構體指針
{
int i,j;
struct student *p1,*p2;//定義兩個結構體指針
if(head==NULL)
{
exit(0);
}
p1=head;//

p2=head;//p2指針依然指向head
printf("刪除第幾個節點的數據\n");
scanf("%d",&i);//獲得節點數據
for(j=1;j<i;j++)
{
p2=p1;//p2指向p1
p1=p1->next;//p1向后移動一個表
}
//此時指向刪除數據的上一個位置
if(p1==head)//如果此時依然指向鏈表的頭 則鏈表向后移動一位
{

// head=p1->next;//則通過p1向后一移動一位,鏈表向后移動了一位但是指針沒動
head = p1->next;//邏輯完全正確啊
// free(p1);
printf("當前正在刪除一個結點數據\n");

//return head;
}
else//否則
{
p2->next=p1->next;//把p1指針指向下一個數據給p2指針指向下一個位置 這句話的意思是向后移動一位指針。
//把p1指針指向下一個數據給p2指針指向下一個位置 這句話的意思是向后移動一位指針。

}

while(head!=NULL)
{
printf("\n\n序號 %d 學號 %ld 姓名:%s 性別: %s 語文: %3.1f 數學:%3.1f 外語:%3.1f",head->xuhao,head->num,head->name,head->sex,head->score[0],head->score[1],head->score[2]);//姓名,性別
//	a=p->score[0]+p->score[1]+p->score[2];
//printf(" 總分:%3.1f",a);
printf(" 等級%c\n",head->DJ);
head=head->next;
} //刪除第二行數據,之后的鏈條直接中斷需要把鏈條接上
free(p1);//釋放
n=n-1;
printf("\n**********刪除中 稍后*********\n");

 

return head;//返回


}
struct student*nsert(struct student *head)
{
struct student *p1,*p,*q;
int i = 1;
int jj;
int mm;
int nn;
if(head==NULL)
{
exit(0);
}

printf("要插入的位置(尾插)1-%d:",n);
scanf("%d",&jj);//所要插入第幾位學生信息
if(jj>=1&&jj<=n)
{


p = head->next ;
p1 = (struct student *)malloc(sizeof(struct student));
printf("請先輸入學號(輸入0退出錄入)\n");
printf(" ");
scanf("%ld",&p1->num);
if(p1->num!=0)
{
p1->xuhao=jj+1;
printf(" 請輸入您的姓名\n");
printf(" ");
scanf("%s",&p1->name);
printf(" 你好,%s!",p1->name);
printf("請輸入您的性別male or female\n");

printf(" ");
scanf("%s",&p1->sex); 
mm=sexJY((char*)p1->sex);//char **類型與char *類型不兼容 需要強制轉換為char*類型
if(mm==1)
{
printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n");
printf(" 第一科的成績是:");
scanf("%f",&p1->score[0]); 
p1->score[0]=JY(p1->score[0]);//校驗第一科的成績	
printf(" 第二科的成績是:");
scanf("%f",&p1->score[1]); 
p1->score[1]=JY(p1->score[1]);//校驗第二科的成績
printf(" 第三科的成績是:");
scanf("%f",&p1->score[2]);
p1->score[2]=JY(p1->score[2]);//校驗第三科的成績
printf(" 錄入完畢\n");
n=n+1;//系統學生數自增1
printf("-----------------------------------------------------------------------------------------------------------------\n");
}
}

if(1 == jj)
{
struct student*q = head->next ;
head->next = p1;
p1 ->next = q; 
}
else
while( p )
{
if(i == (jj-1))
{
struct student*q = p->next ;
p->next = p1;
p1->next = q;
}
p = p->next ;
i++;
}

return p;

}
else
{
printf("\n---------錄入錯誤---------\n");
printf("請重試\n");
return head;
}
}
int sexJY2(char *sex) 
{
int u = 0;
if (strcmp(sex, "male") == 0)
{
u =1;
return u;
}
return 0;
}
int sexJY(char *sex) 
{
int u = 0;
while(1)
{
if (strcmp(sex, "male") == 0 || strcmp(sex, "female") == 0)
{
u =1;
return u;
}
else
{
printf("性別錯誤請重新輸入\n");
scanf("%s",sex);

}
}
}
int TJ(struct student *head)
{
int sexJY2(char *sex);
int mm;
int nn;
struct student *p;
if(head==NULL)
{
exit(0);
}
p=head;
do
{ 
nn=sexJY((char*)p->sex);//強制轉換

if(nn==1)
{
man++;
}

p=p->next;//一直向下指直到



}while(p!=NULL);

printf("\n男生人數為:%d\n",man);
return 0;
}//遍歷整個鏈表 計算男生的人數
int in()
{

int i,j;
int m;
int n=0;//如果密碼輸入錯誤三次則跳出循環
char user[20]={'0'};
char pas[20]={'0'};
char aa[20]={' ','U','s','e','r',' ','N','a','m','e',':'};//輸出賬號登陸
char bb[20]={' ','P','a','s','s','w','o','r','d',':'};
system("mode con cols=45 lines=15");
while(1)
{
printf("\n");
for(i=0;i<12;i++)
{
printf("%c",aa[i]);
_sleep(50);

}
//printf(" User Name:");
gets(user);//輸入賬號
for(i=0;i<10;i++)
{
printf("%c",bb[i]);
_sleep(50);

}
gets(pas);//如何隱藏輸入的密碼 安全性getch(); printf("*");
m=passwd(user,pas);
if(m==1)
{
return m;
}
else
{
n++; 
printf("incorrect please try again\n");
if(n==3)
{
system("color 04");
system("cls");
while(1)
{
printf("快滾出老子的魔仙堡!!!!\n");
_sleep(1000);
}
return 0;
}
}
}
}
struct student *add(struct student *head)
{
struct student *p,*p1,*p2;
int i = 1;
int jj;
int mm;
int nn;
p=head;
printf("輸入要插入的位置1-%d: ",n);
scanf("%d",&i);
jj=i;

p1=(struct student*)malloc(LG);//開辟p1內存空間
p2=(struct student*)malloc(LG);//開辟p2內存空間
printf("請先輸入學號(輸入0退出錄入)\n");
printf(" ");
scanf("%ld",&p1->num);
if(p1->num!=0)
{
p1->xuhao=jj+1;
printf(" 請輸入您的姓名\n");
printf(" ");
scanf("%s",&p1->name);
printf(" 你好,%s!",p1->name);
printf("請輸入您的性別male or female\n");

printf(" ");
scanf("%s",&p1->sex); 
mm=sexJY((char*)p1->sex);//char **類型與char *類型不兼容 需要強制轉換為char*類型
if(mm==1)
{
printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n");
printf(" 第一科的成績是:");
scanf("%f",&p1->score[0]); 
p1->score[0]=JY(p1->score[0]);//校驗第一科的成績	
printf(" 第二科的成績是:");
scanf("%f",&p1->score[1]); 
p1->score[1]=JY(p1->score[1]);//校驗第二科的成績
printf(" 第三科的成績是:");
scanf("%f",&p1->score[2]);
p1->score[2]=JY(p1->score[2]);//校驗第三科的成績
printf(" 錄入完畢\n");
printf("-----------------------------------------------------------------------------------------------------------------\n");
}
}
if(i==1)//如果插入點為頭部head 則
{
p2=head->next;
head->next=p1;
p1->next=p2;
n=n+1;//系統學生數自增1
return head;
}
else
{
p=head;
if(i==n)
{
//如果輸入等於n
while(p->next!=NULL)
{
p=p->next;
}
p->next=p1;
p1->next=NULL;
//插入函數寫完后一定要把指針指向空
//printf("%d",p1->xuhao);
n=n+1;
return head;

}
else
{
//如果不是頭也不是尾巴
//則從中間插
while(i--)
{
p=p->next;

}
//	printf("已找到");
p2=p->next;
p->next=p1;
p1->next=p2;
n=n+1;
return head;

}
}
}
void *dell(struct student *head)
{
struct student *p=head;
free(p);
printf("\n\n鏈表已摧毀\n\n");


}
int choose(int i)
{
printf("\n ----------------------------------------------- 學生成績管理系統-----------------------------------------------\n"); 
printf("\n");
printf("\n");
printf(" 請選擇信息錄入的方式\n");
printf(" ===========================\n");
printf(" = (1)手動輸入 =\n");
printf(" = (2)通過外部導入信息 =\n");
printf(" ===========================\n");
printf(" 請選擇:");
while(1)
{
scanf("%d",&i);
if(i==1||i==2)
{
//printf("%d",n);
return i;
}
else
{
printf("\n 請輸入一個有效的值:");
}

}


}
void load()
{
printf("\n該功能還在完善中\n 敬請期待\n");

}
//實現輸出輸入文件的功能
void out1(struct student *head)
{
FILE *out;
struct student *p;
char outfile[20];
char ch;
int i;
ch=getchar();
if((out=fopen("stu.txt","wb"))==NULL)
{
printf(" 找不到輸出文件");
exit(0);
}
p=head;
while(p!=NULL)
{
if(fwrite(p,LG,1,out)!=1) 
{ 
printf("\n寫入數據出錯\n"); 
fclose(out); 
return; 
} 
p=p->next;
} 
fclose(out); 
} 
struct student *input1 () 
{ 
struct student *head = NULL; 
struct student *p1, *p2;//s = p1;p = p2; 

FILE *fp; 
if((fp=fopen("stu.txt","rb+"))==NULL) 
{ 
printf("打開文件出錯\n"); 
exit(0); 
} 
while(!feof(fp)) { 
if((p1=(struct student*)malloc(LG))==NULL){ 
printf("內存申請出錯\n"); 
fclose(fp); 
exit(0); 
} 
if(fread(p1,LG,1,fp)!=1){ 
free(p1); 
break; 
} 
if(head==NULL) 
{
head=p2=p1;
n=n+1;
} 
else{ 
p2->next=p1; 
p2=p1;
n=n+1;
} 
} 
fclose(fp); 
return (head); 
}

 

  

 

  登陸界面

 

 

實現文件的讀入功能

 

 

主菜單的設計  還有相關的二級菜單

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#include"xyf.h"
int main(void)
{
    struct student *p;
    int m=1;//注意要修改回來
	int zz=0;
    //system("cls"); 
    //m=in();
   if(m==1)
   {
	system("color 07");
	zz=choose(zz);
	switch (zz)
	{
case 1:
	body();
    //data(p);
	p=creat();
	showdata(p);
	break;
case 2:
	printf("\n   -----------------------------------------------正在導入-----------------------------------------------\n"); 
	p=input1();
	showdata(p);
	break;
	}
    }
   
     _sleep(1000);
     return 0;

} 
/*增加一個同學信息
刪除一個同學信息
修改一個學生信息
查找一個學生信息(按姓名、按學號)
等級計算
統計男生人數
顯示學生信息(局部或全部)
學生成績管理系統
要求:

定義學生結構體數據類型。在此類型中,應該包括三個成員變量(學號、姓名、成績)。

定義個學生數組保存學生的信息。用一個變量來記錄學生人數。
	添加學生的信息。
	顯示學生的信息。
	刪除學生的信息。
	查找學生的信息,根據姓名。
	統計學生的信息。


第一步:菜單界面設計
提示:
1、程序功能的展示:輸出語句

2、提供用戶選擇功能的接口:輸入語句

3、對用戶輸入的范圍校驗:if結構

4、對用戶選擇的響應:switch結構

5、單個函數頭的定義


第二步:
1、結構體構造(函數外面的地方)
2、設計輸入函數,實現一個信息的輸入;
3、設計輸出函數,實現一個信息的輸出。

4、提示:變量的定義位置,解決數據共享問題。
方法一:定義在主函數中,通過函數參數傳遞的方式進行。

方法二:定義為全局變量,實現數據的共享(變量的作用域)


程序結構:
//引入頭文件
include

//函數原型聲明
void add();

//結構體定義(構造)
struct A{……};

//主函數定義
int main()
{

}

//子函數定義
void add()
{……}


第三步:采用數組解決全班信息的存儲、顯示問題

1、采用宏定義的方式聲明學生人數
2、定義數組,定義數組的數組下標采用宏定義符號
struct stu s[N];
for(int i=0;i<N;i++) 
{
    //單個數據輸入代碼        
}

3、對數組操作,顯示全班信息

第四步:結構體變量定義在主函數中,通過函數參數傳遞的方式進行數據共享。
1、一個數據的處理
main()
{
   ……
   struct stu s;  //結構體變量的定義
   sr(&s);         //實參傳遞
   …… 
}

//單個數據輸入函數
void sr(struct stu * x)
{  
   //對形參變量x賦值 
   scanf("%d",&(*x).xh);
   scanf("%d",&(x->xh));
}

2、多個數據的處理
main()
{
   ……
   struct stu s[10];  //結構體變量的定義
   for(i=0;i<10;i++)
      sr(&s[i]);         //實參傳遞
   …… 
}

//單個數據輸入函數
void sr(struct stu * x)
{  
   //對形參變量x賦值 
   scanf("%d",&(*x).xh);
   scanf("%d",&(x->xh));
}
*/
/*
/*1、聲明一個結構體類型student,包含姓名、性別、年齡、語文成績、數學成績、外語成績等成員。
2、編寫程序:輸入2個同學的基礎信息,分別求出2個同學的語文平均成績。
3、編寫程序:輸入10個同學的基礎信息,顯示同學的基礎信息。
4、設計多個顯示功能函數:
(1)顯示學生的姓名、性別
(2)顯示學生的姓名、年齡
(3)顯示學生的姓名、總分
編寫程序:讓用戶有選擇的查看10位同學的信息。
5、給結構體類型student新增成員:等級
設計等級測試函數:根據3科平均分計算出學生等級(A:100-90;  B:89-60;   C:60-0)
編寫程序:讓用戶有選擇的使用系統功能。
6、學生管理系統
7.鏈表+指針
學生成績管理系統
               2016級物聯網2班
1.代碼優化
3.框架
4.增加功能
5.輸出定向文件
*/

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM