程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c++-求大神幫我把這機構化的C++程序改成C++面向對象的程序,有酬謝(單項選擇題標准化考試系統)

c++-求大神幫我把這機構化的C++程序改成C++面向對象的程序,有酬謝(單項選擇題標准化考試系統)

編輯:編程綜合問答
求大神幫我把這機構化的C++程序改成C++面向對象的程序,有酬謝(單項選擇題標准化考試系統)
 #include<stdio.h>
#include<stdlib.h>//應用動態存儲分配函數//
#include<time.h>
# define LEN sizeof(struct question)
struct question
{
    char ask[200];//選擇題題目//
    char answer[4][80];//選擇題選項,每個答案的長度//
    int right;//正確答案//
    struct question *next;//next是指針類型的成員,
    //它指向struct question類型數據(即next所在的結構體類型)
    //使用指針類型成員存放下一個結點的地址
    //此步驟實現了問題的連續輸入輸入
};
    int menu(void);//聲明菜單選擇函數
    struct question *seek(struct question *seek,long len,long max);//尋找讀取答案的位置
    struct question *insert(struct question *fst,const struct question *ad);//插入試題
    void getquestion(struct question *s);//獲取問題,選項,以及正確答案
    void savefile(const struct question *a,FILE *sf);//保存最佳答案在文件中//
    struct question *loadfile(struct question *b,FILE *lf);//讀取題目,將題目添加到列表中
    int getanswer(void);//得到答案
    int getyouranswer(void);//得到考生答案
    void explainquestion(const struct question *q,int n);//統計答對題目數,顯示得分
//選擇菜單//
int menu(void)
{
    int v;
    printf("1—添加選擇題\n2—回答選擇題\n3—退出\n");
    scanf("%d",&v);
    return v;
}
//seek函數確定一個讀取答案的位置,len代表要讀取的答案數,max代表列表的長度//
struct question *seek(struct question *seek,long len,long max)
{
    int i;
    srand(time(NULL));
    while(i=rand()%max+len<max);//隨機選取一個讀題目的位置//
    while(i--)
        seek=seek->next;//找到指定的位置//
    return seek;
}
//向列表中插入試題//
struct question *insert(struct question *fst,const struct question *ad)
{
    struct question *newptr=(struct question *)malloc(LEN);//分配新的內存空間//
    if (newptr==NULL)
        exit(0);
    *newptr=*ad;
    newptr->next=fst;
    return newptr;
}
//獲取問題,選項,以及正確答案//
void getquestion(struct question *s)
{
    int i=0;
    printf("請輸入選擇題題目:\n");
    scanf("%s",s->ask);//指向結構體中的成員//
    while(i<4)
    {
        printf("請輸入選項%c的答案:\n",i+'A');
        scanf("%s",s->answer[i++]);
    }
    s->right=getanswer();
}
//試題保存//
void savefile(const struct question *a,FILE *sf)//使用const說明成員函數//
{
    fclose(sf);
    if((sf=fopen("kstm.dat","w"))==NULL)//以寫的方式重新打開文件//
    return;
    while(a)
    {
    fwrite(a,sizeof(struct question),1,sf);
    a=a->next;
    }
}
//從文件中讀取題目,將題目添加到列表中//
struct question *loadfile(struct question *b,FILE *lf)
{
    struct question temp;
    while (fread(&temp,sizeof(struct question),1,lf))
        b=insert(b,&temp);
    return b;
}

//統計答對題目數,顯示得分//
void explainquestion(const struct question *que,int n)
{
    int i=0,t=0;
    char result[1001],*p=result;
    for(i=0;t<n;que=que->next,t++)
    {
    printf("%s\nA.%s\nB.%s\nC.%s\nD.%s\n\n",que->ask,que->answer[0],que->answer[1],que->answer[2],que->answer[3]);
    if((*p=que->right)==(*(p+1)=getyouranswer()))
    ++i;
    p+=2;
    }
    *p='\0';
    printf("\n%-20s%-20s%s\n","標准答案","你的答案","評價");
    for(p=result;*p!='\0';p+=2)
        printf("%-20c%-20c%s\n",*p,*(p+1),*p==*(p+1)?"正確":"錯誤");
    printf("\n你回答了%d道題,答對%d道題目,得分:%.2f\n\n",n,i,(float)(i*100.00/n));
}
//得到選擇題的答案//
int getanswer(void)
{   
    static int i=1; 
    int c=0;//必須進行初始化,避免出現偶然性的錯誤//
    while(c<'A'||c>'D')//確保輸入的答案是ABCD中的一個//
    {
    printf("請輸第%d題的正確答案:",i);
    scanf("%c",&c);
    printf("\n");
    if(c>96)
        c=c-32;//實現小寫向大寫的轉換//
    }i++;
    return c;
}
int getyouranswer(void)
{   
    int c=0;//必須進行初始化,避免出現偶然性的錯誤//
    while(c<'A'||c>'D')//確保輸入的答案是ABCD中的一個//
    {
    printf("請輸入你的答案:");
    scanf("%c",&c);
    if(c>96)
        c=c-32;//實現小寫向大寫的轉換//
    }
    return c;
}
main()
{
    struct question *start=NULL,temp;
    long int choice,line=0,c;
    FILE *fp=fopen("kstm.dat","a+");//用'a+'方式打開文件名為'kstm.dat'文件,可添可讀//
    start=loadfile(start,fp);
    printf("           *****歡迎使用此考試系統,請輸入你要執行的步驟的編號*****\n");
    while((choice=menu())!=3)//如果考生不選3-退出//
        if(choice==1)
        {
            getquestion(&temp);
            start=insert(start,&temp);
            ++line;//統計列表的長度//
        }
        else if(choice==2)
        {
            printf("請輸入要回答的問題數量:");
            scanf("%d",&c);
            start=seek(start,c,line);
            explainquestion(start,c);
    }
    savefile(start,fp);
    fclose(fp);
    return 0;
}

最佳回答:


大體的實現我沒改你的

#include
#include//應用動態存儲分配函數//
#include

define LEN sizeof(struct question)

struct question
{
char ask[200];//選擇題題目//
char answer[4][80];//選擇題選項,每個答案的長度//
int right;//正確答案//
struct question *next;//next是指針類型的成員,
//它指向struct question類型數據(即next所在的結構體類型)
//使用指針類型成員存放下一個結點的地址
//此步驟實現了問題的連續輸入輸入
};

class Question
{
private:
struct question *head;
public:
Question():head(NULL){}
int menu(void);//聲明菜單選擇函數
struct question *seek(long len,long max);//尋找讀取答案的位置
struct question *insert(const struct question *ad);//插入試題
void getquestion(struct question *s);//獲取問題,選項,以及正確答案
void savefile(FILE *sf);//保存最佳答案在文件中//
void loadfile(FILE *lf);//讀取題目,將題目添加到列表中
int getanswer(void);//得到答案
int getyouranswer(void);//得到考生答案
void explainquestion(int n);//統計答對題目數,顯示得分
};

//選擇菜單//
int Question::menu(void)
{
int v;
printf("1—添加選擇題\n2—回答選擇題\n3—退出\n");
scanf("%d",&v);
return v;
}
//seek函數確定一個讀取答案的位置,len代表要讀取的答案數,max代表列表的長度//
struct question * Question::seek(long len,long max)
{
int i;
struct question* seek=head;
srand(time(NULL));
while(i=rand()%max+len while(i--)
seek=seek->next;//找到指定的位置//
return seek;
}
//向列表中插入試題,使用頭插法//
struct question * Question::insert(const struct question *ad)
{
struct question *newptr=(struct question *)malloc(LEN);//分配新的內存空間//
if (newptr==NULL)
exit(0);
*newptr=*ad;
newptr->next=head;
head=newptr;
return newptr;
}
//獲取問題,選項,以及正確答案//
void Question::getquestion(struct question *s)
{
int i=0;
printf("請輸入選擇題題目:\n");
scanf("%s",s->ask);//指向結構體中的成員//
while(i {
printf("請輸入選項%c的答案:",i+'A');
scanf("%s",s->answer[i++]);
}
s->right=getanswer();
}
//試題保存//
void Question::savefile(FILE *sf)//使用const說明成員函數//
{
const struct question *a=head;
fclose(sf);
if((sf=fopen("kstm.dat","w"))==NULL)//以寫的方式重新打開文件//
return;
while(a)
{
fwrite(a,sizeof(struct question),1,sf);
a=a->next;
}
}
//從文件中讀取題目,將題目添加到列表中//
void Question::loadfile(FILE *lf)
{
struct question temp;
while (fread(&temp,sizeof(struct question),1,lf))
insert(&temp);
}

//統計答對題目數,顯示得分//
void Question::explainquestion(int n)
{
int i=0;
struct question que=head;
char result[1001],*p=result;
for(;que!=NULL;que=que->next)
{
printf("%s\nA.%s\nB.%s\nC.%s\nD.%s\n\n",que->ask,que->answer[0],que->answer[1],que->answer[2],que->answer[3]);
if((*p=que->right)==(
(p+1)=getyouranswer()))
++i;
p+=2;
}
p='\0';
printf("\n%-20s%-20s%s\n","標准答案","你的答案","評價");
for(p=result;*p!='\0';p+=2)
printf("%-20c%-20c%s\n",*p,
(p+1),*p==*(p+1)?"正確":"錯誤");
printf("\n你回答了%d道題,答對%d道題目,得分:%.2f\n\n",n,i,(float)(i*100.00/n));
}
//得到選擇題的答案//
int Question::getanswer(void)
{
static int i=1;
int c=0;//必須進行初始化,避免出現偶然性的錯誤//
while(c<'A'||c>'D')//確保輸入的答案是ABCD中的一個//
{
printf("請輸第%d題的正確答案:",i);
scanf("%c",&c);
printf("\n");
if(c>96)
c=c-32;//實現小寫向大寫的轉換//
}i++;
return c;
}
int Question::getyouranswer(void)
{
int c=0;//必須進行初始化,避免出現偶然性的錯誤//
while(c<'A'||c>'D')//確保輸入的答案是ABCD中的一個//
{
printf("請輸入你的答案:");
scanf("%c",&c);
if(c>96)
c=c-32;//實現小寫向大寫的轉換//
}
return c;
}
main()
{
Question start;
struct question temp;
long int choice,line=0,c;
FILE fp=fopen("kstm.dat","a+");//用'a+'方式打開文件名為'kstm.dat'文件,可添可讀//
start.loadfile(fp);
printf(" *
***歡迎使用此考試系統,請輸入你要執行的步驟的編號*****\n");
while((choice=start.menu())!=3)//如果考生不選3-退出//
if(choice==1)
{
start.getquestion(&temp);
start.insert(&temp);
++line;//統計列表的長度//
}
else if(choice==2)
{
printf("請輸入要回答的問題數量:");
scanf("%d",&c);
start.seek(c,line);
start.explainquestion(c);
}
start.savefile(fp);
fclose(fp);
return 0;
}

我不得不說你的代碼寫得不太好啊

IT142546355
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved