不知道哪里出問題了,求大神指點
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TEST struct test
#define SIZE sizeof(struct test)
struct test
{
char main[1000];
char answer[4][80];
int rightanswer;
struct test *next;
};
int menu();//選擇選單
TEST *print(TEST *head,const TEST *p);//將檔案中題目輸出
TEST *taketest(TEST *test,int size);//隨機選擇題目
void addtest(TEST *test);//向題庫中添加題目
void save(const TEST *head,FILE *fp);//將獲取的題目保存到檔案
TEST *load(TEST *head,FILE *fp);//讀取檔案
int myanswer();//用戶輸入答案
void answer(const TEST *head,int n);//用戶答題
main()
{
TEST *head=NULL,temp;
int choice,len=0,c;
FILE *fp=fopen("test.dat","a");
head=load(head,fp);
while((choice=menu())!=3)
if(choice==1)
{
addtest(&temp);
head=print(head,&temp);
++len;
}
else if(choice==2)
{
c=600;
while(c>500 ||c>len)
{
printf("請輸入要回答的題的數量:");
scanf("%d",&c);
taketest(head,c);
}
}
save(head,fp);
fclose(fp);
return 0;
}
TEST *taketest(TEST *test,int size)//從檔案中隨機抽取題目
{
int i;
int seed=1000; // 種子
int m[16];
int nn=1;
double r;
srand(seed); // 初始化亂數生成器
for (i=0;i <size;i++)
m[i]=0;
while(nn <10)// r 是雙精度浮點亂數,范圍0.0到1.0
{
r=((double)rand()/((double)(RAND_MAX)+(double)(1)));
i=(int)(r*size);
if(m[i]==0)
{
m[i]=1;
nn=nn+1;
}
test->next=test;
answer(test,size);
}
return test;
}
void answer(const TEST *head,int n)
{
int i=0,t=n;
char result[1001],*p=result;
for(i=0;n--;head=head->next)
{
printf("%s\nA.%s\nB.%s\nC.%s\nD.%s\n\n",head->main,head->answer[0],head->answer[1],head->answer[2],head->answer[3]);
if((*p=head->rightanswer)==(*(p+1)=myanswer()))
++i;
p+=2;
}
*p='\0';
printf("\n%-13s%-13s%s\n", "標準答案", "您的答案", "評價");
for(p=result;*p!='\0';p+=2)
printf("%-13c%-13c%s\n",*p,*(p+1),*p==*(p+1)?"正確":"錯誤");
printf("\n您回答了%d道題, 答對%d道題目,得分:%.2f\n\n",t,i,(float)i/t*100.00);
}
TEST *print(TEST *head,const TEST *p)
{
TEST *p1=(TEST *)malloc(SIZE);
if(p1==NULL)
exit(0);
*p1=*p;
p1->next=head;
return p1;
}
void addtest(TEST *test)
{
int i=0;
printf("輸入題干:\n");
scanf("%s",test->main);
while(i <4)
{
printf("請輸入選項%c的答案:\n",i+'A');
scanf("%s",test->answer[i++]);
fflush(stdin);
}
test->rightanswer=myanswer();
}
TEST *load(TEST *head,FILE *fp)
{
TEST temp;
while(fread(&temp,SIZE,1,fp))
head=print(head,&temp);
return head;
}
void save(const TEST *head,FILE *fp)
{
fclose(fp);
if((fp=fopen("test.dat","w"))==NULL)
return;
while(head)
{
fwrite(head,SIZE,1,fp);
head=head->next;
}
}
int myanswer()
{
char c='a'; // here
fflush(stdin);
if((c>='A'&&c <='D') ||(c>='a'&&c <='d')) // here
{
printf("請輸入A、B、C、D或a、b、c、d:");
scanf("%c",&c);
}
return c;
}
int menu()
{
int value;
printf("1 - 添加選擇題\n2 - 回答選擇題\n3 - 退出\n");
scanf("%d",&value);
return value;
}
uj5u.com熱心網友回復:
首先不知道檔案是否正確打開了就讀資料了, 要做個檢測的其次
TEST *print(TEST *head,const TEST *p)
{
TEST *p1=(TEST *)malloc(SIZE);
if(p1==NULL)
exit(0);
*p1=*p;
這樣直接賦值不可以, 結構里面含有陣列的部分,需要復制過去,不是賦值過去
用memcpy,strcpy等函式去復制陣列的內容
p1->next=head;
return p1;
}
uj5u.com熱心網友回復:
大一小白用函式復制陣列內容不是很會,求幫忙
uj5u.com熱心網友回復:
看著沒嘛問題啊
uj5u.com熱心網友回復:
選擇2回答問題無論答對答錯都會一直重復剛才出現的題轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67720.html
標籤:C語言
上一篇:C語言函式 關于素數判斷
下一篇:求問一道基礎題
