#include#include#include#includetypedef struct CHOOSE
{
int n;
char a[10000];
char b[10000];
char c[10000];
char d[10000];
char e[10000];
char A[10000];
struct CHOOSE *k;
}X;
typedef struct HOOL
{
int n;
char a[10000];
char A[10000];
struct HOOL *k;
}Y;
int a=1;
void r1(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
char z;
printf("新增題目的題號是%d\n",a);
printf("這道題的題型是( 1 是選擇 , 2 是填空 )\n");
scanf("%c",&z);
getchar();
if(z=='1')
{
c1=(X*)malloc(sizeof(X));
if(h1==NULL)
h1=c1;
else
t1->k=c1;
c1->k=NULL;
c1->n=a;
printf("題干:\n");
gets(c1->a);
printf("選項:\n");
gets(c1->b);
gets(c1->c);
gets(c1->d);
gets(c1->e);
printf("答案:\n");
gets(c1->A);
t1=c1;
a++;
}
else if(z=='2')
{
c2=(Y*)malloc(sizeof(Y));
if(h2==NULL)
h2=c2;
else
t2->k=c2;
c2->k=NULL;
c2->n=a;
printf("題干:\n");
gets(c2->a);
printf("答案:\n");
gets(c2->A);
t2=c2;
a++;
}
else if(z!='1'&&z!='2')
printf("錯了錯了,重新來過吧,勇者,試煉之路還很長呢~\n");
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
void r2(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
int q,u=0;
printf("您要將圣劍斬向何處(請選擇您要刪除的題號)\n");
scanf("%d",&q);
getchar();
c1=h1,c2=h2;
if(h1==NULL)
{
printf("此處黑暗不復存在,但滿是陰霾(題庫 1 已經清空了)\n");
}
else
{
if(h1->n==q)
{
h1=h1->k;
printf("光明已斬盡黑暗\n");
u++;
}
else
{
while(c1->k!=NULL)
{
if(c1->k->n==q)
{
c1->k=c1->k->k;
printf("光明已斬盡黑暗\n");
u++;
}
else
c1=c1->k;
}
}
}
if(h2==NULL)
{
printf("此處黑暗不復存在,但滿是陰霾(題庫 2 已經清空了)\n");
}
else
{
if(h2->n==q)
{
h2=h2->k;
printf("光明已斬盡黑暗\n");
u++;
}
else
{
while(c2->k!=NULL)
{
if(c2->k->n==q)
{
c2->k=c2->k->k;
printf("光明已斬盡黑暗\n");
u++;
}
else
c2=c2->k;
}
}
}
if(u==0)
printf("此處黑暗已消失殆盡(題庫中沒有此題,刪除失敗)\n");
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
void r3(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
h1=NULL;
h2=NULL;
a=1;
printf("當前世界已被刷新(題庫已經清空)\n");
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
void r4(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
FILE *e1=fopen("T1 copy.txt","w+"),*e2=fopen("T2 copy.txt","w+");
c1=h1;
c2=h2;
while(c1!=NULL&&c1->n!=0)
{
fprintf(e1,"%d\n",c1->n);
fprintf(e1,"%s\n",c1->a);
fprintf(e1,"%s\n",c1->b);
fprintf(e1,"%s\n",c1->c);
fprintf(e1,"%s\n",c1->d);
fprintf(e1,"%s\n",c1->e);
fprintf(e1,"%s\n",c1->A);
c1=c1->k;
}
while(c2!=NULL&&c2->n!=0)
{
fprintf(e2,"%d\n",c2->n);
fprintf(e2,"%s\n",c2->a);
fprintf(e2,"%s\n",c2->A);
c2=c2->k;
}
printf("剛剛在地圖上標記好了你的進程(備份完畢)\n");
fclose(e1);
fclose(e2);
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
void r5(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
int i,r=0;
printf("簡要展示一下你的風之印記(請輸入需要修改的題號)\n");
scanf("%d",&i);
getchar();
if(h1==NULL)
{
printf("不好,此處所有風之印記都被巨龍摧毀了(題庫 1 是空的)\n");
}
else
{
if(h1->n==i)
{
printf("看來這道題是個選擇題\n");
printf("修改題干吧\n");
gets(h1->a);
printf("修改選項吧\n");
gets(h1->b);
gets(h1->c);
gets(h1->d);
gets(h1->e);
printf("修改答案吧\n");
gets(h1->A);
printf("風之印記已經更改了\n");
r++;
}
else
{
while(c1!=NULL)
{
if(c1->n==i)
{
printf("看來這道題是個選擇題\n");
printf("修改題干吧\n");
gets(c1->a);
printf("修改選項吧\n");
gets(c1->b);
gets(c1->c);
gets(c1->d);
gets(c1->e);
printf("修改答案吧\n");
gets(c1->A);
printf("風之印記已經更改了\n");
r++;
break;
}
else
c1=c1->k;
}
}
}
if(h2==NULL)
{
printf("不好,此處所有風之印記都被巨龍摧毀了(題庫 2 是空的)\n");
}
else
{
if(h2->n==i)
{
printf("看來這道題是個填空題\n");
printf("修改題干吧\n");
gets(h2->a);
printf("修改答案吧\n");
gets(h2->A);
printf("風之印記已經更改了\n");
r++;
}
else
{
while(c2!=NULL)
{
if(c2->n==i)
{
printf("看來這道題是個填空題\n");
printf("修改題干吧\n");
gets(c2->a);
printf("修改答案吧\n");
gets(c2->A);
printf("風之印記已經更改了\n");
r++;
break;
}
else
c2=c2->k;
}
}
}
if(r==0)
printf("你并沒有在這個地方標記風之印記\n");
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
void r6(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
int i,r=0;
printf("請選擇你想看的魔法在《魔法禁書目錄》的代碼(請輸入需要查看的題目的題號)\n");
scanf("%d",&i);
getchar();
if(h1==NULL)
{
printf("不好,《魔法禁書目錄(上)》全破損了(題庫 1 是空的)\n");
}
else
{
if(h1->n==i)
{
printf("題目是\n");
puts(h1->a);
printf("選項是\n");
puts(h1->b);
puts(h1->c);
puts(h1->d);
puts(h1->e);
printf("答案是\n");
puts(h1->A);
printf("已經找到了,希望你好好學習,成為不講武德的黏氰人\n");
r++;
}
else
{
while(c1!=NULL)
{
if(c1->n==i)
{
printf("題目是\n");
puts(c1->a);
printf("選項是\n");
puts(c1->b);
puts(c1->c);
puts(c1->d);
puts(c1->e);
printf("答案是\n");
puts(c1->A);
printf("已經找到了,希望你好好學習,成為不講武德的黏氰人\n");
r++;
break;
}
else
c1=c1->k;
}
}
}
if(h2==NULL)
{
printf("不好,《魔法禁書目錄(下)》全破損了(題庫 2 是空的)\n");
}
else
{
if(h2->n==i)
{
printf("看來這道題是個填空題\n");
printf("題目是\n");
puts(h2->a);
printf("答案是\n");
puts(h2->A);
printf("已經找到了,希望你好好學習,成為不講武德的黏氰人\n");
r++;
}
else
{
while(c2!=NULL)
{
if(c2->n==i)
{
printf("看來這道題是個填空題\n");
printf("題目是\n");
puts(c2->a);
printf("答案是\n");
puts(c2->A);
printf("已經找到了,希望你好好學習,成為不講武德的黏氰人\n");
r++;
break;
}
else
c2=c2->k;
}
}
}
if(r==0)
printf("年輕人,你是不是記錯了呀,希望你耗子尾汁\n");
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
void r7(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
printf("讓DIO統計一下你一共吃了多少塊史萊姆小面包吧(統計題庫中所有試題的數量)\n");
int r=0;
c1=h1,c2=h2;
while(c1!=NULL)
{
c1=c1->k;
r++;
}
while(c2!=NULL)
{
c2=c2->k;
r++;
}
printf("嗯,一共是 %d 噠!\n",r);
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
void r8(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
printf("請描述一下那位神秘人的特征(輸入部分信息以搜題)\n");
char s[100];
gets(s);
int r=0;
c1=h1,c2=h2;
while(c1!=NULL)
{
if(strstr(c1->a,s)!=NULL&&c1->n!=0)
{
puts("||||||||這是一位嫌疑人:||||||||");
puts("題號是");
printf("%d\n",c1->n);
puts("題干是");
puts(c1->a);
puts("選項是");
puts(c1->b);
puts(c1->c);
puts(c1->d);
puts(c1->e);
puts("答案是");
puts(c1->A);
r++;
c1=c1->k;
}
else
{
c1=c1->k;
}
}
while(c2!=NULL)
{
if(strstr(c2->a,s)!=NULL&&c2->n!=0)
{
puts("||||||||這是一位嫌疑人:||||||||");
puts("題號是");
printf("%d\n",c2->n);
puts("題干是");
puts(c2->a);
puts("答案是");
puts(c2->A);
r++;
c2=c2->k;
}
else
{
c2=c2->k;
}
}
if(r==0)
printf("俺們村可沒有這一號人(未找到符合條件的題目)\n");
else
printf("就這些了,我可沒有故意隱瞞啊,勇者大人\n");
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
void r9(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
int h[100],w=0,k=0,l=0;
FILE *v=fopen("TEST.txt","w+");
FILE *g=fopen("ANSWER.txt","w+");
int e,r;
c1=h1,c2=h2;
while(c1!=NULL)
{
c1=c1->k;
k++;
}
while(c2!=NULL)
{
c2=c2->k;
l++;
}
printf("你終于想要進行最終考驗了,勇者!\n");
printf("輸入你要生成的選擇題的數量\n");
scanf("%d",&e);
getchar();
printf("輸入你要生成的填空題的數量\n");
scanf("%d",&r);
getchar();
if(e>k||r>l)
{
if(e>k)
printf("要求生成的選擇題數量超過了題庫保存的總額\n");
if(r>l)
printf("要求生成的填空題數量超過了題庫保存的總額\n");
}
else
{
printf("要開始了呦\n");
for(int d=0;dn==w)
{
fprintf(v,"%d\n",h1->n);
fprintf(v,"%s\n",h1->a);
fprintf(v,"%s\n",h1->b);
fprintf(v,"%s\n",h1->c);
fprintf(v,"%s\n",h1->d);
fprintf(v,"%s\n",h1->e);
fprintf(v,"\n");
fprintf(g,"%d\n",h1->n);
fprintf(g,"%s\n",h1->A);
fprintf(g,"\n");
printf("2\n");
r++;
}
else
{
while(c1!=NULL)
{
if(c1->n==w)
{
fprintf(v,"%d\n",c1->n);
fprintf(v,"%s\n",c1->a);
fprintf(v,"%s\n",c1->b);
fprintf(v,"%s\n",c1->c);
fprintf(v,"%s\n",c1->d);
fprintf(v,"%s\n",c1->e);
fprintf(v,"\n");
fprintf(g,"%d\n",c1->n);
fprintf(g,"%s\n",c1->A);
fprintf(g,"\n");
printf("3\n");
r++;
break;
}
else
c1=c1->k;
}
}
if(r==0)
{
d--;
printf("4\n");
continue;
}
}
printf("又開始了呦\n");
for(int c=e;cn==w)
{
fprintf(v,"%d\n",h2->n);
fprintf(v,"%s\n",h2->a);
fprintf(v,"\n");
fprintf(g,"%d\n",h2->n);
fprintf(g,"%s\n",h2->A);
fprintf(g,"\n");
r++;
printf("22\n");
}
else
{
while(c2!=NULL)
{
if(c2->n==w)
{
fprintf(v,"%d\n",c2->n);
fprintf(v,"%s\n",c2->a);
fprintf(v,"\n");
fprintf(g,"%d\n",c2->n);
fprintf(g,"%s\n",c2->A);
fprintf(g,"\n");
r++;
printf("33\n");
break;
}
else
c2=c2->k;
}
}
if(r==0)
{
c--;
printf("44\n");
continue;
}
}
printf("結束了。。。。\n");
}
fclose(v);
fclose(g);
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
void r0(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
FILE *o1=fopen("T1.txt","w+"),*o2=fopen("T2.txt","w+");
c1=h1;
c2=h2;
while(c1!=NULL&&c1->n!=0)
{
fprintf(o1,"%d\n",c1->n);
fprintf(o1,"%s\n",c1->a);
fprintf(o1,"%s\n",c1->b);
fprintf(o1,"%s\n",c1->c);
fprintf(o1,"%s\n",c1->d);
fprintf(o1,"%s\n",c1->e);
fprintf(o1,"%s\n",c1->A);
c1=c1->k;
}
while(c2!=NULL&&c2->n!=0)
{
fprintf(o2,"%d\n",c2->n);
fprintf(o2,"%s\n",c2->a);
fprintf(o2,"%s\n",c2->A);
c2=c2->k;
}
fclose(o1);
fclose(o2);
printf("那就好好休息吧,勇者也要好好睡一覺呢(程序結束)\n");
}
int main()
{
srand((unsigned)time(NULL));//播種,使得rand()函數在程序運行的每個時刻生成的隨機數都是不同的
FILE *p1=fopen("T1.txt","r+"),*p2=fopen("T2.txt","r+");
X *h1,*t1,*c1;
Y *h2,*t2,*c2;
h1=NULL,h2=NULL;
t1=(X*)malloc(sizeof(X)),t2=(Y*)malloc(sizeof(Y));
int x,y;
int c,d;
c=feof(p1),d=feof(p2);
while(fscanf(p1,"%d\n",&a)!=EOF)
{
c1=(X*)malloc(sizeof(X));
if(h1==NULL)
h1=c1;
else
t1->k=c1;
c1->k=NULL;
fscanf(p1,"%s\n",c1->a);
fscanf(p1,"%s\n",c1->b);
fscanf(p1,"%s\n",c1->c);
fscanf(p1,"%s\n",c1->d);
fscanf(p1,"%s\n",c1->e);
fscanf(p1,"%s\n",c1->A);
c1->n=a;
t1=c1;
a++;
}
while(fscanf(p2,"%d\n",&a)!=EOF)
{
c2=(Y*)malloc(sizeof(Y));
if(h2==NULL)
h2=c2;
else
t2->k=c2;
c2->k=NULL;
fscanf(p2,"%s\n",c2->a);
fscanf(p2,"%s\n",c2->A);
c2->n=a;
t2=c2;
a++;
}
fclose(p1);
fclose(p2);
while(1)
{
printf("來吧,年輕的小小勇者,每個人都需要在某個時候打破自己的局限,不是嗎\n");
printf("/\n");
printf("輸入 1 添加題目\n");
printf("輸入 2 刪除指定題目\n");
printf("輸入 3 刪除所有題目\n");
printf("輸入 4 備份所有題目\n");
printf("輸入 5 修改指定題目\n");
printf("輸入 6 查詢指定題目\n");
printf("輸入 7 統計題目總數\n");
printf("輸入 8 模糊查找題目\n");
printf("輸入 9 生成一套自定義各種類型題目數量的試卷\n");
printf("輸入 0 終止此次冒險\n");
printf("/\n");
printf("What's your choice?\n");
scanf("%d",&x);
getchar ();
if(x==1)
r1(h1,t1,c1,h2,t2,c2);
else if(x==2)
r2(h1,t1,c1,h2,t2,c2);
else if(x==3)
r3(h1,t1,c1,h2,t2,c2);
else if(x==4)
r4(h1,t1,c1,h2,t2,c2);
else if(x==5)
r5(h1,t1,c1,h2,t2,c2);
else if(x==6)
r6(h1,t1,c1,h2,t2,c2);
else if(x==7)
r7(h1,t1,c1,h2,t2,c2);
else if(x==8)
r8(h1,t1,c1,h2,t2,c2);
else if(x==9)
r9(h1,t1,c1,h2,t2,c2);
else if(x==0)
{
r0(h1,t1,c1,h2,t2,c2);
break;
}
else
{
printf("錯了錯了,重新來過吧,勇者,試煉之路還很長呢~\n");
printf("請輸入「回車」以繼續您的征程\n");
getchar();
}
}
return 0;
}
(用適當的形式表達算法設計思想與算法實現步驟) 步驟及思路: 前期 為了模擬真實出題情況,系統自帶題庫(當然,也選擇清空題庫,即一開始就讓題庫是空的) 題庫有兩個,一個是選擇題題庫,另一個是填空題題庫 創建兩種鏈表分別對應兩種題型 開始 打開兩個題庫文件,創建鏈表頭指針 申請動態內存 將題庫中原有的題讀入鏈表中(此過程需要間接結構體指針) 將最后一個結點的指向下一個結點的指針為空 設置一個循環,對于想要執行的操作輸入相對應的字符,?進行判斷,執行完操作之后返回菜單,直到輸入結束的指令 按照依次增大的方式生成升序題號 “添加題目”選項 先判斷頭指針是否為空(兩個鏈表分別判斷) 選則需要添加的題型,判斷寫入那個指針 將添加的題型寫入指針儲存起來 “刪除題目”選項 令中介指針等于頭指針,依次尋找下一個結點,判斷題號是否等于需要刪除的題號,如果是,則令結點指針跳過這個結點,指向下一個結點(這樣鏈表中就刪除了這個結點);如果在兩個題庫中遍歷之后沒有找到,則回復?沒有這道題?;如果有一個題庫是空的,就回復?選擇題(或填空題)題庫是空的 “刪除題庫”選項 令頭指針為空,實現丟棄鏈表,題庫就被清空了 “備份題庫”選項 定義兩個文件指針,新開兩個備份題庫的文件,分別備份選擇題和填空題,把兩個鏈表內容分別寫入對應的文件中 “根據題號查找題目”選項 令中介指針等于頭指針,遍歷鏈表,查找是否有題號等于需要查找的題號,如果有,則將鏈表對應的內容打印出來;若沒有,則反饋查無此題;若題庫為空,則反饋題庫為空 “模糊查找以實現搜題”選項 使用字符串函數strstr()進行模糊查找,令中介指針等于頭指針,遍歷鏈表,若有相同內容則返回非空,則將內容打印出來;若沒有找到相應內容,則反饋查無此題;若題庫為空則反饋題庫為空 “統計題目數量”選項 遍歷兩個鏈表,若鏈表指針不為空,則被統計為一個題,依次增加,達到計數的目的 “生成試卷” 輸入需要生成的選擇題數目和填空題數目,統計選擇題以及填空題的總題目數量,如果少于要生成的題目,則進行反饋?選擇/填空題庫題數不足;結合隨機數函數隨機生成題號,并進行查重,如果某道題已經出過則不再生成 “程序終止” 這一步操作較為關鍵,在實行操作終止時,以寫入的方式,會先將鏈表寫入題庫,實現題庫的更新 |
(詳細記錄在調試過程中出現的問題及解決方法。記錄實驗執行的結果) 如何做到生成題號且不重復 定義一個全局變量a,并令a為1,每次添加一個完題目,就令a增加1,這樣實現生成的題目的題號都是升序的且不重復的 在讀取題庫中原有的題目的時候,令a等于讀取到的題目的序號,并在讀取完一個題之后令a加一,這樣就實現了保證每次新增題目題號都是順序且為大的題號 判斷是否出錯(安全性常規檢查) 檢查的內容主要有: 1.是否在選擇執行哪種操作時輸入了規定選項以外的內容,此時應報錯,并跳過此次循環 2.在查詢、修改、刪除以及生成試卷操作時,要判斷是否有此題以及題庫是否為空,解決方法就是遍歷鏈表,如果鏈表頭指針是空,則為題庫空,如果鏈表無需要查找的題目,則為無此題 |
(對實驗結果進行分析,問題回答,實驗心得體會及改進意見) 實驗結果分析: 能滿足實驗所有要求 回答問題: 問題一: 怎么實現的刪除指定題目,并且進行安全性檢查 令中介指針等于頭指針,依次尋找下一個結點,判斷題號是否等于需要刪除的題號,如果是,則令結點指針跳過這個結點,指向下一個結點(這樣鏈表中就刪除了這個結點);如果在兩個題庫中遍歷之后沒有找到,則回復?沒有這道題?;如果有一個題庫是空的,就回復?選擇題(或填空題)題庫是空的 問題二: 如何做到生成題號且不重復 定義一個全局變量a,并令a為1,每次添加一個完題目,就令a增加1,這樣實現生成的題目的題號都是升序的且不重復的 在讀取題庫中原有的題目的時候,令a等于讀取到的題目的序號,并在讀取完一個題之后令a加一,這樣就實現了保證每次新增題目題號都是順序且為大的題號 心得總結: 這個實驗我寫了三遍,每一遍都有不同的感悟,在寫第一遍的時候,對于指針安排比較混亂,并且內存分配邏輯不清晰,以至于程序寫完之后反復出現bug,但是很難找到錯誤的地方;第二遍的時候優化了內存分配,使得程序可讀性增強,容易找到指針位置,但是有缺點就是都寫在了main函數里面,導致運行效率低且main函數內部冗雜;第三遍將各個操作都寫在了自定義函數里面,并且這樣寫有利于后期優化修改。 通過寫這次實驗,我更好地理解了動態內存分配,并對鏈表有了更深刻的認識,提高了我的邏輯性。通過修改子函數,提高了我對傳參的理解。另外還學習到了模糊查找字符串內容的函數strstr()。 |
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網站標題:【程序設計實驗報告(2)試卷管理系統】(中二版)-創新互聯
本文來源:http://vcdvsql.cn/article22/dspjjc.html
成都網站建設公司_創新互聯,為您提供品牌網站制作、服務器托管、網站收錄、域名注冊、網站內鏈、手機網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯