数据结构技能考试系统
生活随笔
收集整理的這篇文章主要介紹了
数据结构技能考试系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通過一個月的努力,終于把數據結構技能考試系統用C++的語言實現(其中有C語言的穿插),系統的最大優點是可以檢測學生答題時是否插入了U盤,打開了word及記事本等輔助工具。此系統分為兩部分,一部分是學生端,一部分是教師端。
學生端主要是學生輸入學號及姓名(對此進行檢測),根據學號的后四位對應的ASCII碼模8求值,達到抽題的效果(也可適當改進改為IP讀題),在題庫中抽取兩道題,隨機答一道題即可,在完成作答后選擇所作的試題,避免了選題后不會做的情況。抽題時顯示倒計時,時間為60分鐘,如若超時,允許的最大期限為20分鐘,答題結束后可自動將程序及加密的學生信息發送至教師端。
教師端的功能是獲取學生的文件,依次打開它的cpp和信息文件,并錄入成績,最后生成學生成績表格。減少了需要去學生端看程序,錄成績的麻煩。
?
系統的部分注意事項如下:
?
學生端:
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<math.h> #include<time.h> #include<string.h> #include <fstream> #include<conio.h> #include<Windows.h> # define NORMAL_SIZ BUFSIZ #define CHMSK_KEY 0xa5 char buf[NORMAL_SIZ]; using namespace std;//在屏幕上顯示試題內容 int duquwenben(string a) {FILE *fp;fp=fopen(a.c_str(),"r");char buf[1024];while((fgets(buf,1024,fp))!=NULL){printf("%s",buf);}printf("\n");return 0; }//讀取驅動狀態 int GetDriverInfo(LPSTR szDrive){UINT uDriverType;uDriverType = GetDriveType(szDrive); if(uDriverType==DRIVE_REMOVABLE) return 1;else return 0; }//判斷是否有U盤插入 int checkUdisk() {CHAR szLogicDriveStrings[1024];PCHAR szDrive;GetLogicalDriveStrings(1023,szLogicDriveStrings); szDrive = (PCHAR)szLogicDriveStrings;for(int i=0;i<7;i++) {if(GetDriverInfo(szDrive)) return 1;szDrive += (lstrlen(szDrive)+1);}return 0; }//判斷是否打開word,PPT及記事本 int checkTask() {string temp1,temp2,temp3;temp1="tasklist | find ";temp2=temp1+"\"WINWORD\" "+"> 1.txt";system(temp2.c_str());temp2=temp1+"\"POWERPNT\" "+">> 1.txt";system(temp2.c_str());temp2=temp1+"\"note\" "+">> 1.txt";system(temp2.c_str());ifstream test;test.open("1.txt");while(!test.eof()){test>>temp3;if(temp3.length()>3){return 1; break;}}test.close();return 0; } //將學生的相關內容存儲到xinxi文本文檔中 void xinxi(){FILE *fp=fopen("d:\\數據結構技能考試\\xinxi.txt","w+");fprintf(fp,"%s","d:\\數據結構技能考試\\");fclose(fp); }//登錄界面并判斷是否符合信息 void denglu1(char b[]){FILE *fp=fopen("d:\\數據結構技能考試\\xinxi.txt","w+");FILE *fq=fopen("d:\\數據結構技能考試\\xingming.txt","r");char m[4],ch,s[100];int i=0,k=0,n,x=0,y,len; // m1[0]='\n'; printf("請輸入姓名:"); for(int v=0;v<3&&k==0;v++){gets(b);fclose(fq);FILE *fq=fopen("d:\\數據結構技能考試\\xingming.txt","r");while(fgets(s,100,fq) != NULL){len = strlen(s);s[len-1] = '\0';if(strcmp(b,s)==0){fputs(b,fp);k=1;break;}}if(k==0&&v<2)printf("請重新輸入:");}fclose(fp);fclose(fq);if(k==0)exit(0);}//登錄學號界面并判斷是否符合信息 void denglu2(char c[]){FILE *fp=fopen("d:\\數據結構技能考試\\xinxi.txt","a+");FILE *fq=fopen("d:\\數據結構技能考試\\xuehao.txt","r");char m[4],ch,s[100];int i=0,k=0,n,x=0,y,len; printf("請輸入學號:"); for(int v=0;v<3&&k==0;v++){gets(c);fclose(fq);FILE *fq=fopen("d:\\數據結構技能考試\\xuehao.txt","r");while(fgets(s,100,fq) != NULL){len = strlen(s);s[len-1] = '\0';if(strcmp(c,s)==0){fprintf(fp,"\n");fputs(c,fp);k=1;break;}}if(k==0&&v<2)printf("請重新輸入:");}fclose(fp);fclose(fq);if(k==0)exit(0); }//根據學生的學號抽題 int chuti(int a ){int b;a=a%8;b=a+10;FILE *fp=fopen("d:\\數據結構技能考試\\xinxi.txt","a+");string tempIdd;string tempId="d:\\數據結構技能考試\\Ti\\1.txt";fprintf(fp,"\n");fprintf(fp,"%s","學生抽到的試題是:");printf("\n抽到的試題是:第%d題和第%d題\n",a+1,b+1);fprintf(fp,"%s","第");fprintf(fp,"%d",a+1);fprintf(fp,"%s","題和第");fprintf(fp,"%d",b+1);fprintf(fp,"%s","題");fprintf(fp,"\n");switch(a){case 0:tempId="d:\\數據結構技能考試\\Ti\\1.txt";break;case 1:tempId="d:\\數據結構技能考試\\Ti\\2.txt";break;case 2:tempId="d:\\數據結構技能考試\\Ti\\3.txt";break;case 3:tempId="d:\\數據結構技能考試\\Ti\\4.txt";break;case 4:tempId="d:\\數據結構技能考試\\Ti\\5.txt";break;case 5:tempId="d:\\數據結構技能考試\\Ti\\6.txt";break;case 6:tempId="d:\\數據結構技能考試\\Ti\\7.txt";break;case 7:tempId="d:\\數據結構技能考試\\Ti\\8.txt";break;case 8:tempId="d:\\數據結構技能考試\\Ti\\9.txt";break;case 9:tempId="d:\\數據結構技能考試\\Ti\\10.txt";break;case 10:tempId="d:\\數據結構技能考試\\Ti\\11.txt";break;case 11:tempId="d:\\數據結構技能考試\\Ti\\12.txt";break;case 12:tempId="d:\\數據結構技能考試\\Ti\\13.txt";break;case 13:tempId="d:\\數據結構技能考試\\Ti\\14.txt";break;case 14:tempId="d:\\數據結構技能考試\\Ti\\15.txt";break;case 15:tempId="d:\\數據結構技能考試\\Ti\\16.txt";break;case 16:tempId="d:\\數據結構技能考試\\Ti\\17.txt";break;case 17:tempId="d:\\數據結構技能考試\\Ti\\18.txt";break;}duquwenben(tempId);printf("*********************************************************** \n"); switch(b){case 0:tempIdd="d:\\數據結構技能考試\\Ti\\1.txt";break;case 1:tempIdd="d:\\數據結構技能考試\\Ti\\2.txt";break;case 2:tempIdd="d:\\數據結構技能考試\\Ti\\3.txt";break;case 3:tempIdd="d:\\數據結構技能考試\\Ti\\4.txt";break;case 4:tempIdd="d:\\數據結構技能考試\\Ti\\5.txt";break;case 5:tempIdd="d:\\數據結構技能考試\\Ti\\6.txt";break;case 6:tempIdd="d:\\數據結構技能考試\\Ti\\7.txt";break;case 7:tempIdd="d:\\數據結構技能考試\\Ti\\8.txt";break;case 8:tempIdd="d:\\數據結構技能考試\\Ti\\9.txt";break;case 9:tempIdd="d:\\數據結構技能考試\\Ti\\10.txt";break;case 10:tempIdd="d:\\數據結構技能考試\\Ti\\11.txt";break;case 11:tempIdd="d:\\數據結構技能考試\\Ti\\12.txt";break;case 12:tempIdd="d:\\數據結構技能考試\\Ti\\13.txt";break;case 13:tempIdd="d:\\數據結構技能考試\\Ti\\14.txt";break;case 14:tempIdd="d:\\數據結構技能考試\\Ti\\15.txt";break;case 15:tempIdd="d:\\數據結構技能考試\\Ti\\16.txt";break;case 16:tempIdd="d:\\數據結構技能考試\\Ti\\17.txt";break;case 17:tempIdd="d:\\數據結構技能考試\\Ti\\18.txt";break;}duquwenben(tempIdd);if(checkUdisk()){printf("禁止插入u盤,請拔下后重試\n"); while(checkUdisk())Sleep(1);}fclose(fp); // system(f);return 0; }//如果期間有異常會重新顯示題目 int chongchuti(int a){int b;a=a%8;b=a+10;string tempId,tempIdd;tempId="d:\\數據結構技能考試\\Ti\\1.txt";printf("\n抽到的試題是:第%d題和第%d題\n",a+1,b+1);switch(a){case 0:tempId="d:\\數據結構技能考試\\Ti\\1.txt";break;case 1:tempId="d:\\數據結構技能考試\\Ti\\2.txt";break;case 2:tempId="d:\\數據結構技能考試\\Ti\\3.txt";break;case 3:tempId="d:\\數據結構技能考試\\Ti\\4.txt";break;case 4:tempId="d:\\數據結構技能考試\\Ti\\5.txt";break;case 5:tempId="d:\\數據結構技能考試\\Ti\\6.txt";break;case 6:tempId="d:\\數據結構技能考試\\Ti\\7.txt";break;case 7:tempId="d:\\數據結構技能考試\\Ti\\8.txt";break;case 8:tempId="d:\\數據結構技能考試\\Ti\\9.txt";break;case 9:tempId="d:\\數據結構技能考試\\Ti\\10.txt";break;case 10:tempId="d:\\數據結構技能考試\\Ti\\11.txt";break;case 11:tempId="d:\\數據結構技能考試\\Ti\\12.txt";break;case 12:tempId="d:\\數據結構技能考試\\Ti\\13.txt";break;case 13:tempId="d:\\數據結構技能考試\\Ti\\14.txt";break;case 14:tempId="d:\\數據結構技能考試\\Ti\\15.txt";break;case 15:tempId="d:\\數據結構技能考試\\Ti\\16.txt";break;case 16:tempId="d:\\數據結構技能考試\\Ti\\17.txt";break;case 17:tempId="d:\\數據結構技能考試\\Ti\\18.txt";break;}duquwenben(tempId);printf("*********************************************************** \n"); switch(b){case 0:tempIdd="d:\\數據結構技能考試\\Ti\\1.txt";break;case 1:tempIdd="d:\\數據結構技能考試\\Ti\\2.txt";break;case 2:tempIdd="d:\\數據結構技能考試\\Ti\\3.txt";break;case 3:tempIdd="d:\\數據結構技能考試\\Ti\\4.txt";break;case 4:tempIdd="d:\\數據結構技能考試\\Ti\\5.txt";break;case 5:tempIdd="d:\\數據結構技能考試\\Ti\\6.txt";break;case 6:tempIdd="d:\\數據結構技能考試\\Ti\\7.txt";break;case 7:tempIdd="d:\\數據結構技能考試\\Ti\\8.txt";break;case 8:tempIdd="d:\\數據結構技能考試\\Ti\\9.txt";break;case 9:tempIdd="d:\\數據結構技能考試\\Ti\\10.txt";break;case 10:tempIdd="d:\\數據結構技能考試\\Ti\\11.txt";break;case 11:tempIdd="d:\\數據結構技能考試\\Ti\\12.txt";break;case 12:tempIdd="d:\\數據結構技能考試\\Ti\\13.txt";break;case 13:tempIdd="d:\\數據結構技能考試\\Ti\\14.txt";break;case 14:tempIdd="d:\\數據結構技能考試\\Ti\\15.txt";break;case 15:tempIdd="d:\\數據結構技能考試\\Ti\\16.txt";break;case 16:tempIdd="d:\\數據結構技能考試\\Ti\\17.txt";break;case 17:tempIdd="d:\\數據結構技能考試\\Ti\\18.txt";break;}duquwenben(tempIdd);return 0;}//生成學生信息的文檔將會加密 void jiami(){FILE *fp = fopen("d:\\數據結構技能考試\\xinxi.txt", "rb+"); int n; while ((n = fread(buf, 1, NORMAL_SIZ, fp)) > 0) { int i; for (i = 0; i < n; i++) { buf[i] ^= CHMSK_KEY; } if (fseek(fp, -n, SEEK_CUR) == -1) { perror("fseek"); } n = fwrite(buf, 1, n, fp); fflush(fp);//如果不加這句,那么文件大小如果小于庫函數緩沖(默認是BUFSIZ大小)時實際上面的寫操作并沒寫進去,從而導致下一次read還是成功,因此程序不會退出 buf[0] = 0; } fclose(fp); }//倒計時,時間為1小時 void daojishi(int a,int m[0],int sec[0]){m[0]=59,sec[0] = 59;printf("\n");while(m[0]>=0){sec[0] = 59;while(sec[0] > 0){if(_kbhit())break;printf("\r%2d:%2d",m[0],sec[0]);Sleep(1000);sec[0]--;if(sec[0]%10==0){if(checkUdisk()){system("cls");while(checkUdisk()){Sleep(1);printf("禁止插入u盤,請拔下后重試\n");system("cls");}chongchuti(a);printf(" 剩余時間");}if(checkTask()){system("cls");while(checkTask()) {Sleep(1);printf("禁止使用word、ppt、txt文件,請關閉后重新登陸\n"); system("cls");}chongchuti(a);printf(" 剩余時間");} }} if(_kbhit())break; // printf("***%d\n",m[0]); // printf("***%d\n",sec[0]);if(m[0]==0&&sec[0]==1)break;m[0]--;} /* if(sec > 0){system("cls");//print_jiayou();}elseprintf("\n超時啦!");*/// getchar();if(m[0]!=0&&sec[0]!=1)getchar();}//如若超過一小時,最多允許20分鐘超時 void chaoshi(int a,int m1[0],int sec1[0]){m1[0]=19,sec1[0] = 59;printf("\n");while(m1[0]>=0){sec1[0] = 59;while(sec1[0] > 0){if(_kbhit())break;printf("\r%2d:%2d",m1[0],sec1[0]);printf(" 超時時間\n");Sleep(1000);sec1[0]--;if(sec1[0]%10==0){if(checkUdisk()){system("cls");while(checkUdisk()){Sleep(1);printf("禁止插入u盤,請拔下后重試\n");system("cls");}chongchuti(a);printf(" 超時時間");}if(checkTask()){system("cls");while(checkTask()) {Sleep(1);printf("禁止使用word、ppt、txt文件,請關閉后重新登陸\n"); system("cls");}chongchuti(a);printf(" 超時時間");} }} if(_kbhit())break; // printf("***%d\n",m[0]); // printf("***%d\n",sec[0]);if(m1[0]==0&&sec1[0]==1)break;m1[0]--;} /* if(sec > 0){system("cls");//print_jiayou();}elseprintf("\n超時啦!");*/// getchar();if(m1[0]!=0&&sec1[0]!=1)getchar();}int main(){char a[10000];int b[10],c[2];char d[4],e[14];char g[20];char f[12];char s[25];int n,x=0,l;int m[1],sec[1];int m1[1],sec1[1];xinxi();FILE *fx=fopen("d:\\數據結構技能考試\\xinxi.txt","r+");fgets(f,25,fx);fclose(fx);/*檢查是否有U盤及相關文件打開*/ if(checkUdisk()){printf("禁止插入u盤,請拔下后重試\n"); while(checkUdisk())Sleep(1); }if(checkTask()){printf("禁止使用word、ppt、txt文件,請關閉后重試\n"); while(checkTask())Sleep(1);}/*登錄界面*/ system("cls");denglu1(e);denglu2(d);int mg=d[10]+d[11]+d[12]+d[13];//獲取學生的學號 //生成學生學號的cpp文件 FILE *fc=fopen("d:\\數據結構技能考試\\xinxi.txt","r+");if(checkUdisk()){printf("禁止插入u盤,請拔下后重試\n"); while(checkUdisk())Sleep(1);}fgets(s,25,fc);/*用fgets讀第一行到數組s中*/n=strlen(s); x +=n;fseek(fc,x+1,SEEK_SET);/*將文件指針移到下一行*/fgets(s,25,fc);/*用fgets讀第二行到數組s中*/for(int v=0;v<15;v++){f[20+v]=s[v];}f[34]='.';f[35]='c';f[36]='p';f[37]='p';f[38]='\0';fflush(stdin);FILE *mv=fopen(f,"w+");fclose(mv);fclose(fc);if(checkUdisk()){printf("禁止插入u盤,請拔下后重試\n"); while(checkUdisk())Sleep(1);}chuti(mg);//抽題/*倒計時開始*/ printf("\n考試開始,時間為60分鐘,現剩余:");daojishi(mg,m,sec);m[0]=59-m[0];sec[0]=59-sec[0];if(m[0]==0&&sec[0]==58)//如果倒計時結束還未停止,則自動記錄超時時間 chaoshi(mg,m1,sec1);else{m1[0]=19;sec1[0]=59;}if(sec[0]==59){m[0]++;sec[0]=0;}m1[0]=19-m1[0];sec1[0]=59-sec1[0];if(sec1[0]==59){m1[0]++;sec1[0]=0;}fflush(stdin);//輸入選擇的題號 FILE *fg=fopen("d:\\數據結構技能考試\\xinxi.txt","a+");printf("請輸入選擇的題號:");scanf("%d",&l);while(l!=mg%8+1&&l!=mg%8+11){printf("請輸入選擇的題號:");scanf("%d",&l);}fprintf(fg,"%s","學生選擇的題號是:");fprintf(fg,"%d",l);fprintf(fg,"\n");fprintf(fg,"%s","學生做題時間為:");fprintf(fg,"%d",m[0]);fprintf(fg,"%s",":");fprintf(fg,"%d",sec[0]);fprintf(fg,"\n");fprintf(fg,"%s","學生做題超時時間為:");fprintf(fg,"%d",m1[0]);fprintf(fg,"%s",":");fprintf(fg,"%d",sec1[0]);fclose(fg);//上傳到局域網的教室端 string teachIp="\\\\172.17.1.41\\考生信息";string sss(f);string dosStr2="copy "+sss+" "+teachIp;if(system(dosStr2.c_str())!=0){printf("上傳失敗,請手動上傳");puts(f);}else printf("上傳成功\n");f[34]='.';f[35]='t';f[36]='x';f[37]='t';f[38]='\0';jiami();//生成學生信息文件并加密 rename( "d:\\數據結構技能考試\\xinxi.txt",f);fclose(fc);string ddd(f);string dosStr="copy "+ddd+" "+teachIp;if(system(dosStr.c_str())!=0){//上傳失敗,提示手動上傳及文件的位置 printf("上傳失敗,請手動上傳");puts(f);}else printf("上傳成功\n");Sleep(30000);return 0;}
?
?
教師端:
#include<stdio.h> #include<string.h> #include<io.h> #include <stdlib.h> #include<time.h> #include<windows.h> #include<iostream> #include<conio.h> #include<string.h> #define NORMAL_SIZ BUFSIZ #define CHMSK_KEY 0xa5 using namespace std; char buf[NORMAL_SIZ]; #define number 300 //導入的行數 //讀取文本內容 int duquwenben(string a) {FILE *fp;fp=fopen(a.c_str(),"r");char buf[1024];while((fgets(buf,1024,fp))!=NULL){printf("%s",buf);}printf("\n");return 0; }//將學生端的信息解密 void jiemi(char a[]){FILE *fp = fopen(a,"rb+"); int n; while ((n = fread(buf, 1, NORMAL_SIZ, fp)) > 0) { int i; for (i = 0; i < n; i++) { buf[i] ^= CHMSK_KEY; } if (fseek(fp, -n, SEEK_CUR) == -1) { perror("fseek"); } n = fwrite(buf, 1, n, fp); fflush(fp);//如果不加這句,那么文件大小如果小于庫函數緩沖(默認是BUFSIZ大小)時實際上面的寫操作并沒寫進去,從而導致下一次read還是成功,因此程序不會退出 buf[0] = 0; } fclose(fp);}//動態獲取學生的個數,直到滿足條件 int presencename(){system("dir d:\\數據結構技能考試\\考生信息\\*.cpp /b > d:\\數據結構技能考試\\考生信息\\cpp.dat"); FILE *fp=fopen("d:\\數據結構技能考試\\考生信息\\cpp.dat","r");char m[4],ch,s[100];int i=0,k=0,n,x=0,y,len,b;string note="d:\\數據結構技能考試\\考生信息\\cpp.dat";printf("請輸入學生的個數:"); scanf("%d",&b);while(1){if(_kbhit())break;i=0;fclose(fp);system("dir d:\\數據結構技能考試\\考生信息\\*.cpp /b > d:\\數據結構技能考試\\考生信息\\cpp.dat"); FILE *fp=fopen("d:\\數據結構技能考試\\考生信息\\cpp.dat","r");while(fgets(s,100,fp) != NULL){len = strlen(s);s[len-1] = '\0';i++;if(i>=b)break;}duquwenben(note);printf("現在的學生個數為:%d\n",i);if(i==b)break;Sleep(10000);system("cls");}getchar();return b; }//讀取學生信息,依次打開.cpp和相關信息文件,并錄入成績 void read(int num){/*將學生的信息的文件名放在一個txt文件中*/system("dir d:\\數據結構技能考試\\考生信息\\*.cpp /b > d:\\數據結構技能考試\\考生信息\\cpp1.dat");char str[50]={"d:\\數據結構技能考試\\考生信息\\"},str1[num][30],date[number][11],str2[50];double price[number][6];float z ;char f[40],m[1],n[15],v[7];;FILE *in,*fp,*fq;char ch;int j;in=fopen("d:\\數據結構技能考試\\考生信息\\cpp1.dat","r");if(in==NULL){//如果生成的新文件失敗,退出系統 printf("can't open the file999.");exit(0);}/*生成學生成績的Excel文件,名字為學生成績*/fq=fopen("d:\\數據結構技能考試\\學生成績.csv","w+");fprintf(fq,"%s","姓名");fprintf(fq,",");fprintf(fq,"%s","學號");fprintf(fq,",");fprintf(fq,"%s","成績");fprintf(fq,"\n");fclose(fq);for(int i=0;i<num;i++){ fflush(stdin);fq=fopen("d:\\數據結構技能考試\\學生成績.csv","a+");fscanf(in,"%s",&str1[i][0]);strcat(str,&str1[i][0]);system(str);//打開學生的cpp文件 for( j=0;str[j]!='\0';j++);strcpy(str2,str);str2[j-1]='t';str2[j-2]='x';str2[j-3]='t';jiemi(str2);system(str2);//打開學生的txt文件 fflush(stdin);fp=fopen(str2,"r");int k=0;fflush(stdin);fread(m,7,1,fp);m[6]='\0';fflush(stdin);fprintf(fq,m);//寫入學生的姓名 fflush(stdin);fclose(fq);fq=fopen("d:\\數據結構技能考試\\學生成績.csv","a+");fprintf(fq,",");fread(n,14,1,fp);n[14]='\0';fprintf(fq,"’");fprintf(fq,n);//寫入學生學號 for(int i=0;i<number;i++){fscanf(fp,"%s",&date[i][0]);for(j=0;j<6;j++)fscanf(fp,"%lf",&price[i][j]);}fclose(fp);fclose(fq);fflush(stdin);printf("請輸入成績:");scanf("%f",&z);fq=fopen("d:\\數據結構技能考試\\學生成績.csv","a+");fprintf(fq,",");fprintf(fq," %f",z);//寫入學生的成績 fprintf(fq,"\n");fclose(fq);strcpy(str,"d:\\數據結構技能考試\\考生信息\\");}fclose(in); } int main(){read(presencename());//自動獲取文件,并錄入 return 0;}
?
?
如若有什么問題,歡迎大家指出。
轉載于:https://www.cnblogs.com/yjh123/p/6261768.html
總結
以上是生活随笔為你收集整理的数据结构技能考试系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于stc89c52电子钟综合设计
- 下一篇: PFC控制系统的仿真+报告。 基于Boo