當前位置:編程學習大全網 - 源碼下載 - C語言程序設計 跪求~~~~!!!!!!!!2號就交啦!358450804@qq.com

C語言程序設計 跪求~~~~!!!!!!!!2號就交啦!358450804@qq.com

//C++課程設計---學生成績管理系統,有註釋

//少了個鏈表插入結點的,應該不難

#include <stdio.h>

#include <string.h>

#include <iostream.h>

#include <stdlib.h>

#include <windows.h>

typedef struct studentinfo //結構體定義

{

int num;//學號

char name[64];//姓名

int sex;//性別,1為男性,0為女性

float math;//數學

float english;//英語

float politic;//政治

float chinese;//語文

float total;//總成績

struct studentinfo *next;

}STUDENT;

#define FILENAME "D:\\1.txt"

//定義默認的數據庫文件

#define DELAYTIME 1500

//顯示信息,延時

void create_menu();

STUDENT * new_student();

STUDENT* create_linkbyfile(char *);

STUDENT *del_info(STUDENT *);

int save_info(char *,STUDENT *,int);

int find_infile_printf(char *);

int pri_whole_link(STUDENT *);

STUDENT* printf_sort(STUDENT *);

void free_link(STUDENT *);

void main() //主函數

{

create_menu();

}

void create_menu()

//功能:清屏,輸出功能菜單,提供人-機接口

{

int menu_Num;

STUDENT *head=NULL;

char ch;

char file_name[256];

while(1)

{

system("cls");

cout<<"\t\t學生成績管理系統\n";

cout<<"##########################################\n";

cout<<"#\t\t 1.新增學生信息\t\t #\n";

cout<<"#\t\t 2.加載數據庫\t\t #\n";

cout<<"#\t\t 3.刪除學生信息\t\t #\n";

cout<<"#\t\t 4.保存學生信息\t\t #\n";

cout<<"#\t\t 5.數據庫查詢\t\t #\n";

cout<<"#\t\t 6.原序輸出\t\t #\n";

cout<<"#\t\t 7.排序輸出\t\t #\n";

cout<<"#\t\t 8.退出\t\t\t #\n";

cout<<"##########################################\n";

cout<<"請輸入操作編號:";

cin>>menu_Num;

switch (menu_Num)

{

case 1:

free_link(head);//釋放鏈表空間

head=new_student();//新增學生信息

break;

case 2:

free_link(head);//釋放鏈表空間

cout<<"請輸入要加載的數據庫文件的路徑"<<endl;

cin>>file_name;

head=create_linkbyfile(file_name);//讀取數據文件

if(head!=NULL)

{

cout<<"數據庫"<<file_name<<"已加載"<<endl;

Sleep(DELAYTIME);

}

break;

case 3:

del_info(head);//刪除學生信息

break;

case 4://保存學生信息

if (head==NULL)

{

cout<<"請先生成學生信息"<<endl;

Sleep(DELAYTIME);

}

else

{

cout<<"想將學生信息保存到哪個數據庫文件?";

cin>>file_name;

cout<<"請選擇保存方式:0追加到文件末尾 1覆蓋文件\n";

cin>>menu_Num;

if(save_info(file_name,head,menu_Num)==0)//0表示追加,1表示覆蓋

{

cout<<"信息保存失敗\n";

}

else

{

cout<<"數據已保存到"<<file_name<<endl;

Sleep(DELAYTIME);

}

}

break;

case 5:

find_infile_printf(FILENAME);//數據庫查詢

break;

case 6://原序輸出信息

pri_whole_link(head);

cout<<"返回主菜單? Y/N\t";

do

{

cin>>ch;

}while(ch!='Y'&&ch!='y');

break;

case 7://排序輸出信息

do

{

if((head=printf_sort(head))==NULL)

{

cout<<"數據庫未加載"<<endl;

Sleep(DELAYTIME);

break;

}

else

{

cout<<"選擇其他方式排序? Y/N\t";

cin>>ch;

}

}while(ch=='Y'||ch=='y');

break;

case 8:

free_link(head);//釋放鏈表空間

exit(0);

break;

default:

cout<<"輸入有誤!請重新輸入!"<<endl;

break;

}

}

}

STUDENT * new_student()

//功能:創建學生信息(通過鏈表)

//返回值:頭結點指針

{

STUDENT *pnew,*p,*head;

float *pfloat;

char ch;

head=NULL;

do

{

system("cls");

pnew=(STUDENT *)malloc(sizeof(STUDENT)*1);

cout<<"請輸入學生的學號(0表示取消): ";

cin>>pnew->num;

if(0>=pnew->num)

{

break;

}

cout<<"請輸入學生的姓名:";

cin>>pnew->name;

while(1)

{

cout<<"請輸入學生的性別:0/1\t";

cin>>pnew->sex;

if(pnew->sex&&pnew->sex-1)

{

cout<<"性別輸入錯誤,0表示女性,1表示男性,請重新輸入"<<endl;

}

else

{

break;

}

}

cout<<"請依次輸入學生的數學、英語、政治、語文成績:"<<endl;

for(pnew->total=0,pfloat=&pnew->math;pfloat<&pnew->math+4;)

{

cin>>*pfloat;

if(*pfloat<0||*pfloat>150)

{

cout<<"成績輸入錯誤,只能為0~150"<<endl;

}

else

{

pnew->total+=*pfloat;

pfloat++;

}

}

if(head==NULL)

{

head=pnew;

}

else

{

p->next=pnew;

}

p=pnew;

pnew->next=NULL;

cout<<"##########################該學生信息已生成#########################\n";

cout<<"建立另壹個學生的信息? Y/N\t";

cin>>ch;

}while(ch=='Y'||ch=='y');

return head;

}

STUDENT* create_linkbyfile(char *filename)

//功能:讀取文件,創建鏈表

//參數:如果filename不為空,則打開該文件,如果filename為空,要求輸入文件位置

//創建的鏈表的所有結點的next全部修改,指向物理地址上的下壹個結點

{

system("cls");

FILE *fp;

STUDENT *head,*ptemp,*pnew;

head=NULL;//初始化head為空

if(filename==NULL)//若filename為空,要求輸入文件絕對地址

{

char file_name[256];

cout<<"請輸入數據庫文件的路徑:"<<endl;

cin>>file_name;

if(NULL==(fp=fopen(file_name,"rb")))

{

cout<<"數據庫連接失敗\n";

return 0;

}

}

else

{

if(NULL==(fp=fopen(filename,"rb")))

{

cout<<"數據庫連接失敗\n";

return 0;

}

}

for(ptemp=NULL;;)

{

pnew=(STUDENT *)malloc(sizeof(STUDENT)*1);

if(fread(pnew,sizeof(STUDENT),1,fp)!=NULL)

{

if(ptemp!=NULL)

{

ptemp->next=pnew;

}

else

{

head=pnew;

}

ptemp=pnew;

}

else

{

if(ptemp!=NULL)

{

ptemp->next=NULL;

}

else

{

head=NULL;

}

free(pnew);

break;

}

}

fclose(fp);

return head;

}

STUDENT *del_info(STUDENT *head)

//根據學號,刪除鏈表的結點

{

system("cls");

STUDENT *p1,*p2;

int num;

if (head==NULL)

{

cout<<"數據庫未加載"<<endl;

Sleep(DELAYTIME);

return 0;

}

cout<<"請輸入要刪除學生的學號:";

cin>>num;

for(p1=head;p1!=NULL;)

{

if(p1->num==num)//找到

{

if(p1==head)//要刪除的結點是頭結點

{

head=p1->next;

}

else

{

p2->next=p1->next;

}

cout<<"成功刪除!!";

}

p2=p1;

p1=p1->next;

}

return head;

}

int save_info(char *filename,STUDENT *head,int flag)

//功能:將鏈表按Binary寫入文件末尾

//參數:

//1.filename文件名,絕對地址

//2.head指向鏈表的頭結點

//3.flag 0追加或1覆蓋數據

//返回值:失敗則返回0

{

system("cls");

FILE *fp;

STUDENT *p;

char openmethod[8];

if(flag==0)

{

strcpy(openmethod,"ab+");//追加

}

else

{

strcpy(openmethod,"w");//覆蓋

}

if(NULL==(fp=fopen(filename,openmethod)))//

{

cout<<"數據庫連接失敗"<<endl;

Sleep(DELAYTIME);

return 0;

}

else

{

for(p=head;p;p=p->next)

{

if((fwrite(p,sizeof(STUDENT),1,fp))==NULL)

{

cout<<"數據庫創建失敗"<<endl;

return 0;

}

}

}

fclose(fp);

return 1;

}

int find_infile_printf(char *filename)

//功能:根據學號和姓名來查詢某個學生

//參數:filename數據庫文件

//返回值:失敗返回0

//直接搜索文件,缺點是速度慢

//也可先根據文件創建鏈表,再搜索鏈表,缺點是如果文件較大,占用內存多

{

system("cls");

FILE *fp;

STUDENT stu;

int num;

char stu_name[64];

char ch;

if(filename==NULL)

{

return 0;

}

do

{

memset(stu_name,0,sizeof(stu_name));

cout<<"查詢學號或查詢姓名? 1查詢學號 0查詢姓名";

//flag=1根據學號來查詢,flag=0根據姓名來查詢

cin>>num;

if(num==1)

{

cout<<"輸入要查詢的學號:";

cin>>num;

cout<<"正在為您查詢學號為"<<num<<"的學生……"<<endl;

}

else if(num==0)

{

cout<<"輸入要查詢的姓名:";

cin>>stu_name;

cout<<"正在為您查詢姓名為"<<stu_name<<"的學生……"<<endl;

}

else

{

cout<<"輸入有誤"<<endl;

return 0;

}

if(NULL==(fp=fopen(filename,"rw")))

{

cout<<"數據庫連接失敗\n";

return 0;

}

else

{

while(fread(&stu,sizeof(STUDENT),1,fp)!=NULL)

{

if(strcmp(stu.name,stu_name)==0||stu.num==num)

{

cout<<"學號\t姓名\t性別\t數學\t英語\t政治\t語文\t總成績\n";

//輸出該學生的所有信息

cout<<stu.num<<"\t"<<stu.name<<"\t"<<stu.sex<<"\t"<<stu.math<<"\t"<<stu.english<<"\t"<<stu.politic<<"\t"<<stu.chinese<<"\t"<<stu.total<<endl;

//不加break;可支持多個相同數據的索引

}

}

}

cout<<"##########################查詢完畢#########################\n";

cout<<"查詢另壹個學生的信息? Y/N\t";

cin>>ch;

}while(ch=='Y'||ch=='y');

fclose(fp);

return 1;

}

int pri_whole_link(STUDENT *head)

//功能:顯示整條鏈表的學生信息

//參數:head 頭結點指針,如果head為空,返回空

{

system("cls");

STUDENT* p;

if (head==NULL)

{

cout<<"數據庫未加載"<<endl;

Sleep(DELAYTIME);

return 0;

}

cout<<"學號\t姓名\t性別\t數學\t英語\t政治\t語文\t總成績\n";

for(p=head;p;p=p->next)

{

cout<<p->num<<"\t"<<p->name<<"\t"<<p->sex<<"\t"<<p->math<<"\t"<<p->english<<"\t"<<p->politic<<"\t"<<p->chinese<<"\t"<<p->total<<endl;

}

return 1;

}

STUDENT* printf_sort(STUDENT *head)

//功能:根據學號|某科目成績|總成績對鏈表進行排序,然後輸出

//參數:head鏈表頭指針,如果head為空,返回空

//返回值:返回新的鏈表的頭結點指針

{

system("cls");

STUDENT *p1,*p2,*ptemp,*pfinished=NULL;

int num;

int flag;

if (head==NULL)

{

return 0;

}

cout<<"選擇排序依據 0.數學成績1.英語成績2.政治成績3.語文成績4.總成績\n";

cin>>num;

// cout<<"升序/降序輸出? 0.升序1.降序";

// cin>>flag;

for(p1=head;p1->next!=pfinished;)//對鏈表進行從大到小排序(這裏用冒泡法)

//p1使之總是指向頭結點,pfinished使之總是指向已排序好的最前面的結點

//ptemp作為中介,保存p2的上壹個結點

{

for(p2=p1;p2->next!=pfinished;)

{

if(*(&(p2->math)+num)<*(&(p2->next->math)+num))//p2的值小於p2->next的值,交換 ptemp p2 p2->next

{

if(p2==p1)//頭結點要交換

{

p1=p2->next;

p2->next=p1->next;

p1->next=p2;

ptemp=p1;

}

else

{

ptemp->next=p2->next;

ptemp=p2->next;

p2->next=ptemp->next;

ptemp->next=p2;

}

}

else//不需要交換,則p2、ptemp前進1位

{

ptemp=p2;

p2=p2->next;

}

}

pfinished=p2;

}

// if(flag==1)

// {

pri_whole_link(p1);

// }

// else

// {

// }

cout<<"##########################信息顯示完畢#########################\n";

return p1;

}

void free_link(STUDENT *head)

//釋放鏈表空間,如果head,什麽都不做

{

STUDENT *p1,*p2;

for(p1=head;p1;p1=p2)

{

p2=p1->next;//先保存,否則

free(p1);//free後 p1->next數據丟失

}

}

  • 上一篇:如何在gnuradio中編寫自己的C++模塊
  • 下一篇:完美世界手遊妖精pve技能擺放順序(附妖精核心專精推薦)
  • copyright 2024編程學習大全網