【題目】student.txt(GB2312 編碼)中存放了 20 個學生信息,包
括:學號、姓名、性別、籍貫、出生日期。這個 20 個同學沒有重名
的。編寫一個學生信息管理小程序,實現下面的功能:
我們要從一個txt中讀取信息,多組學生的信息顯然易見要存放在一個結構體數組中。把代碼全部放在一個源文件實在太過冗雜,這里我們可以把main函數放在一個源文件,功能實現放在別的源文件中,通過自己寫一個頭文件進行連接。那么這個結構體的定義就要寫在頭文件中,不過結構體數組要定義在源文件中并在頭文件中聲明。一個而多次使用的系統我們可以使用一個do while結構來實現。
cout<< "歡迎使用學生管信息管理系統"<< endl;
int a;
do
{menu1();
cin >>a;
switch (a)
{case 0:
cout<< "歡迎下次使用"<< endl;
file.close();
break;
case 1:
sexclass(total);
break;
case 2:
monthclass(total);
break;
case 3:
find(total);
break;
case 4:
modify(total);
goto begine;
break;
case 5:
add(total);
goto begine;
break;
case 6:
sort(total);
break;
default:
cout<< "輸入錯誤,請重新輸入"<< endl;
break;
}
} while (a);
讀入text信息讀入 student.txt 的學生信息;要讀入一個.txt類的文件儲存方式為ANSI格式
讀入文本文件分為5步
1.引頭文件
2.創建流對象
iftream file (ofstream–只寫、ifstream–只讀、fstream–可讀可寫.)
3.打開文件(并判斷文件是否成功打開)
file.open(“文件路徑”,打開方式)
打開方式分為
打開方式 | 對應操作 |
---|---|
ios::in | 為讀文件而打開 |
ios::out | 為寫文件而打開 |
ios::ate | 文件尾為初始位置 |
ios::app | 追加內容 |
ios::trunc | 重寫文件 |
ios::binary | 二進制形式讀寫 |
注:不同的打開方式配合 | 操作符使用。
4讀數據
5關閉文件
//讀入文件
fstream file;
file.open("D:\\student.txt", ios::in);
char s[200] = {0 };
int total = 0;
while (file.getline(s, 200))
{strcpy(stu[total].number, strtok(s, "\t"));
strcpy(stu[total].name, strtok(NULL, "\t"));
strcpy(stu[total].sex, strtok(NULL, "\t"));
strcpy(stu[total].hometown, strtok(NULL, "\t"));
strcpy(stu[total].date, strtok(NULL, "\t"));
total++;
}
這里將數據先存在了一個char類的數組s之中,然后借用strcpy和strtok函數來實顯將數據存在一個結構體數組之中;
這里拿一個total就可以確定學生人數,而且會有妙用
統計并輸出這些學生中有多少男生,多少女生?因為數據全拿一個結構體以字符串的形式儲存,所以我們因該用strcmp函數來實現比較,然后創建兩個變量分別儲存男女的數量。
void sexclass(int total)
{int male = 0;
int female = 0;
int i = 0;
char nan[6] = "男";
char nv[6] = "女";
for (i = 0; i< total; i++)
{if (strcmp(stu[i].sex, nan)==0)
{ male++;
}
if (strcmp(stu[i].sex, nv) == 0)
{ female++;
}
}
cout<< "男生有:"<< male<< "人"<< endl;
cout<< "女生有:"<< female<< "人"<< endl;
}
統計并輸出這些學生有多少是 11 月份出生的?和上面那個差不多,沒什么好說的
void monthclass(int total)
{int i = 0;
int sum = 0;
for (i = 0; i< total; i++)
{if (stu[i].date[5] == '1' && stu[i].date[6] == '1')
sum++;
}
cout<< sum<
其實這里我們可以先把月轉換出來
int month[50] = {0 };
for (j = 0; j< total; j++)
{int a = 0;
for (a = 5; a< 7; a++)
{ if (stu[j].date[a] != '/')
month[j] = month[j] * 10 + (stu[j].date[a] - '0');
}
}
int day[50] = {0 };
然后判斷哪個月就很隨便了
查找學生(要求)輸入一個姓名,查找 student 文件中是否存在他的信息,如果存
在,輸出出他(她)的信息,如果不存在,輸出“沒有這個同學的信
息”。可以多次查詢,每次查詢結束詢問用戶是否繼續查詢
多次查詢這不又do while
這里要注意的是在前面mian函數中輸入了一個數據并使用回車在這里若想使用getline必須先”清空“,我們可以使用getchar來清空。
void find(int total)
{int a = 0;
char mz[10] = {'0'};
do {cout<< "請輸入學生姓名"< if (strcmp(mz, stu[i].name) == 0)
{ cout<< stu[i].number<< "\t"<< stu[i].name<< "\t"<< stu[i].sex<< "\t"<< stu[i].hometown<< "\t"<< stu[i].date<< endl;
break;
}
}
if (i == total)
{ cout<< "沒有這個同學的信息"<< endl;
}
cout<< "是否繼續查找"<< endl;
cout<< " 1:繼續 "<< endl;
cout<< " 0:停止 "<< endl;
cin >>a;
}while (a);
}
修改籍貫宋羽玲同學的生源地錄入有誤,將她的籍貫改為江蘇省,并保存
到 student.txt 文件中
只要將存著宋羽玲信息的數組先找到然后將省會替換就行
void modify(int total)
{cout<< "要修改的學生名字"<< endl;
int a = 0;
char mz[10] = {'0' };
getchar();//將輸入的回車換行吸收掉
cin.getline(mz, 11);
int i = 0;
for (i = 0; i< total; i++)
{if (strcmp(mz, stu[i].name) == 0)
{ change(i,total);
break;
}
}
if (i == total)
{cout<< "沒有這個同學的信息"<< endl;
}
}
void change(int i,int total)
{cout<< "輸入要修改的值"<< endl;
cin.getline(stu[i].hometown, 10);
save(total);//保存修改后的數據
}
void save(int total)
{ofstream ofs;
ofs.open("D:\\student.txt", ios::out);
int i = 0;
for (i = 0; i< total; i++)
{ofs<< stu[i].number<< "\t";
ofs<< stu[i].name<< "\t";
ofs<< stu[i].sex<< "\t";
ofs<< stu[i].hometown<< "\t";
ofs<< stu[i].date<< endl;
}
ofs.close();
}
這里改完后的存和讀差不多就不多贅述,
值得注意的是這里我希望將數據進行一次更新,也就是重新讀一次,這里我們可以使用goto函數,具體見上
在開辟結構體空間時我刻意多創造了一些,然后用total來卡著每次循環的次數。所以這里直接添加然后存一下,并重新讀取
void add(int total)
{int i = total;
cout<< "輸入學生編號:";
getchar();
cin.getline(stu[i].number, 5);
cout<< endl<< "輸入學生名字:";
cin.getline(stu[i].name, 10);
cout<< endl<< "輸入學生性別:";
cin.getline(stu[i].sex, 6);
cout<< endl<< "輸入學生籍貫:";
cin.getline(stu[i].hometown, 10);
cout<< endl<< "輸入學生出生日期:";
cin.getline(stu[i].date, 12);
save(total + 1);
}
按照出生日期排升序輸出學生的學號、姓名和出生日期這里我將年月日分別取出,后使用了一種較為暴力的方式進行處理。沒有技術含量,希望大佬可以給我一種比較新的寫法
void sort(int total)
{int year[50] = {0 };
int j;
int sum = 0;
for (j = 0; j< total; j++)
{int a = 0;
for (a = 0; a< 4; a++)
{ year[j] = year[j] * 10 + (stu[j].date[a] - '0');
}
}
int month[50] = {0 };
for (j = 0; j< total; j++)
{int a = 0;
for (a = 5; a< 7; a++)
{ if (stu[j].date[a] != '/')
month[j] = month[j] * 10 + (stu[j].date[a] - '0');
}
}
int day[50] = {0 };
for (j = 0; j< total; j++)
{int a = 0;
for (a = 7; a< 10; a++)
{ if (stu[j].date[a] != '/' && stu[j].date[a] != '\0')
day[j] = day[j] * 10 + (stu[j].date[a] - '0');
}
}
int out[50] = {-1 };
for (int a = 2003; a< 2005; a++)
{for (int b = 1; b< 13; b++)
{ for (int c = 1; c< 32; c++)
{ for (int i = 0; i< total; i++)
{if (year[i] == a && month[i] == b && day[i] == c)
{cout<< stu[i].number<< "\t";
cout<< stu[i].name<< "\t";
cout<< stu[i].sex<< "\t";
cout<< stu[i].hometown<< "\t";
cout<< stu[i].date<< "\n";
sum++;
}
}
}
}
}
//cout<< sum<
完整代碼完整代碼
存學生的txt
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網頁題目:學生管理系統C++(初學者,不使用鏈表)-創新互聯
標題網址:http://vcdvsql.cn/article34/pphse.html
成都網站建設公司_創新互聯,為您提供網站營銷、服務器托管、企業建站、移動網站建設、虛擬主機、面包屑導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯