zoukankan      html  css  js  c++  java
  • 考试机

    学c语言有一阵子了。想测试一下技能。

    正好单位组织安全人员考试,2300多道题,我晕,何不借此机会写一个考试机?说来就来

    准备

    语言 c语言

    数据库 sqlite

    要求

    显示题目   显示选项  答错将该题放入错题库。单选30,多选20,判断30 ,随机出题

    sqlite第一次用。学一学吧,用的sql语言,应该没啥大问题

     我以为没有多大问题,结果问题大大的大大的。

    dos命令下操作sqlite没啥大问题,用c来连接,可真是费劲了。当然你要是明白了,也就不费劲了,要是你跟我一样第一次用,好吧,费劲吧。

    一开始,我以为要将sqlite.c文件等复制到工程中就可以用,结果。。。。。全是错误,而且这些错误还是莫名其妙的。。。。无语。

    后来百度到了一篇有用的文章。。。花了我两天时间找到了这篇文章解决了问题。。。。(转载地址 https://www.iteye.com/blog/972169909-qq-com-1677691)

     

    http://www.sqlite.org/download.html下载:

    解压后得到sqlite3.h,得到的其他文件这里不会用到

    下载第二个,解压后得到sqlite3.dll和sqlite3.def

     

    下面要做的是:利用sqlite3.def生成sqlite3.lib

    ①把sqlite3.def放到VC6的LIB.exe所在目录,例如我的VC是装在G盘的:G:Microsoft Visual StudioVC98Bin

    ②开始菜单->运行->cmd,打开cmd命令行

    (以下括号里的黑色字体是输入的内容)

    ③输入(g:)然后回车切换到g盘目录(因为我VC装在g盘)

    ④输入(cd Microsoft Visual StudioVC98Bin)然后回车切换到LIB.exe所在目录

    ⑤输入命令(LIB /MACHINE:IX86 /DEF:sqlite3.def)然后回车,在同一目录下就会生成了sqlite3.lib文件了,当然还生成了sqlite3.exp,不过这里没用到

    (如果提示丢失mspd60.dll,请到Microsoft Visual StudioCommonMSDev98Bin目录找到mspd60.dll,然后再把它复制到Microsoft Visual StudioVC98Bin目录)

    参考截图:


     

    ⑥用VC6新建一个空的控制台工程,把(sqlite3.h、sqlite3.dll、sqlite3.lib)放到工程文件夹里,

    选择菜单栏的工程-->设置:在连接的(对象/库模块)后面加上sqlite3.lib,然后点确定


    通过上述,解决了问题,不报错了。但是总是提示一个问题就是      应用程序无法正常启动     搞了老半天,明明程序没问题,为什么老是无法启动呢?然后百度了一下,有位同志别的程序也出现了问题,他说是dll的版本跟系统版本不一致导致的。。。。

    不可能啊,我系统64位,我在sqlite官网下的也是64位的,为啥会有问题呢?

    难道是我下错了?好吧,全删了,再重新下载,然后又重新生成了一遍,结果老样子。。。。难道是让我用32位?我系统是64的啊。。。苍天啊,试一下吧,下载了32位的dll,然后生成一个32位lib,好吧,成功了,成功了,这是什么鬼。。。见鬼了啊。

    。再找找原因,难道是我的vc的编译版本的问题?结果找到了,看到了么?32位。。然后去百度了一下vc6是否支持64.。。好吧,原始版本只支持32位系统。。。。我服了,要学的东西好多啊。。。

    现在基本的判断题功能已经实现,还有单选和多选,所以想单独拿出来做方法,这样代码看起来更调理,可是。。。不幸的事情发生了

    ,错误原因  error C2371: 'Panduanti' : redefinition; different basic types。 

    无奈之际,自己试错,是需要在程序头部加方法的定义。。。但是我以前的方法都没有加定义运行没问题,为什么单独拿出来就有问题呢?这个问题以后再仔细研究,先把程序写完

     
    关于  char *p 和 char aaaa[]的区别。
    我以为这俩东东是一样的,但是程序给了我回复。然后百度了一下,了解了二者之间的不同。贴一下说明

    char *p = " hello world "; 和 char p[ ] = " hello world ! ";

    所有的字符串常量存放在静态存储区。【字符串常量是贯穿整个程序的生命周期的】,所以1,2只是是否能够访问到的问题,

    1.    字符串常量的地址赋值给指针常量,改指针常量指向的字符串的字符不允许修改。不同的字符串指针指向同一个字符串时候,所有的指针指向同一个地址。

    2.    将字符串的每个字符赋值给数组,该指针指向数组的首地址,

    在 char p [ ] = "heloo "; 中, ” hello “ 是一个字符串常量,存放在静态数据区,但是把一个字符串常量赋值给了一个局部变量(char p [ ] 型数组),该局部变量是存放在栈中的。这样子就有两块内容一样的内存,意思就是说 : char p [ ] = :hello  : 这条语句让 ”hello“ 在内存中有两条拷贝,一份在动态分布的栈中,一份在静态存储区。而char *p = ''hello ''  第二个是指向静态存储区的指针,此变量指向的内存在程序运行中不会被清空。



    作者:少年英雄房飞冯
    链接:https://www.jianshu.com/p/b5c49b747fbf
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
     
     
    终于将程序搞完了。期间遇到很多问题,确实都是以前学习的时候没注意的,通过这个程序,让我加深了对c语言的认识。程序本身还有很多不完善的地方,但是功能都已经OK。
     
    主程序
    #include <stdio.h>
    #include <stdlib.h>
    #include "sqlite3.h"
    #include "strParse.h"
    
    #define DB_NAME "anquanc.db"
    #define DANXUAN_NAME "aaa.csv"
    #define DUOXUAN_NAME "bbb.csv"
    #define PANDUANXUAN_NAME "ccc.csv"
    
    void printPanduan(char *ta,char *id,char *type);
    void panduanTi(FILE *fp,char *p);
    void danxuanTi(FILE *fp,char *p);
    void duoxuanTi(FILE *fp,char *p);
    void printPanduan(char *ta);
        sqlite3 *conn = NULL;  
        char *err_msg = NULL;  
        char *sqlT;
        char sql[2000] = "";  
        /*bool skip(){
    scanf("%*[A-E]");
    return true;
    }*/
        int sqlite3_exec_callback (void *data, int nColumn, char **colValues, char **colNames)  
        {  
            int i;
            char *answerA;
            char *answerB;
            char *answerC;
            char *answerD;
            char *answerE;
            char *trueAnswer;
            char *type;
            char *id;
        //    printf("%d
    ",nColumn);
            for ( i = 0; i < nColumn; i++)  
            {
                switch(i)
                {
                    case 0:
                    id=colValues[i];
                //    printf("id:%s	",colValues[i]);  
                    break;
                    case 1:
                        printf ("%s	
    ", colValues[i]);  
                        break;
                    case 2:
                        answerA=colValues[i];
                        break;
                    case 3:
                        answerB=colValues[i];
                        break;
                    case 4:
                        answerC=colValues[i];
                        break;
                    case 5:
                        answerD=colValues[i];
                        break;
                    case 6:
                        answerE=colValues[i];
                        break;
                    case 7:
                        trueAnswer=colValues[i];
                        break;
                    case 8:
                        type=colValues[i];
                        break;
                    default:
                        //type=colValues[i];
                        //printf("%s",type);
                        break;
                }
    
            }
            if(strcmp(type,"1")==0)
            {
                printf ("%s	
    ", colValues[2]);  
                printf ("%s	
    ", colValues[3]);  
                printf ("%s	
    ", colValues[4]);  
                printf ("%s	
    ", colValues[5]);  
                printPanduan(trueAnswer,id,type);
                
            }
            if(strcmp(type,"2")==0)
            {
                printf ("%s	
    ", colValues[2]);  
                printf ("%s	
    ", colValues[3]);  
                printf ("%s	
    ", colValues[4]);  
                printf ("%s	
    ", colValues[5]);  
                printf ("%s	
    ", colValues[6]);  
                printPanduan(trueAnswer,id,type);
                
            }
            if(strcmp(type,"3")==0)
            {
                printPanduan(trueAnswer,id,type);
                
            }
                printf ("
    ");  
                return 0;  
        }  
    
      void panduanTi(FILE *fp,char *p)
      {
        char text[2400][400];
        
        char *ques;
        char *ans;   
        char *pd="o";
        char Aanswer='A';
        char Banswer='B';
        char Canswer='C';
        char Danswer='D';
            int i=0;
        int j=0;
        while(fp!=NULL && i<2000 && !feof(fp))
        {    
            fscanf(fp,"%s",&text[i]);
            if(strstr(text[i],p))
            {
            //    printf("baohan
    ");
                i++;
            }
            else
            {
                if(i!=0 && !strstr(text[i-1],p))
                strcat(text[i-1], text[i]);
                else
                    i++;
            //    printf("bubaohan
    ");
            }
            if(feof(fp))
            {
                //printf("wenjianjieshu");
                strcat(text[i], pd);
            }
        //    fscanf(fp,"%s",text1);
        //    fseek(fp,2L,SEEK_CUR);
        //    printf("%d
    ",i);
        }
        for(j=0;j<i;j++)
        {
            if(!strstr(text[j],p))
            {
                ques=text[j];
                ans=text[j+1];
            //    printf("11111%s
    ",text[i]);
            }
            
        //    printf("%s",ques);
            sprintf (sql, "INSERT INTO test (question, trueAnswer, questionType) VALUES ('%s', '%s', %c)", ques, ans, '3');  
    
            if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)  
            {  
                printf ("操作失败,错误代码:%s
    ", err_msg);  
                exit(-1);  
            }  
            j++;
        //    printf("%s
    ",text[i]);
        //    printf("%d
    ",i);
        }
      }
    
        void printPanduan(char *ta,char *id,char *type)
        {
            char str,ctr[5],*actr;
            if(strchr(type,'1'))
            {
                        do{
                    printf("单选题:请输入答案,以回车结束
    ");
                    scanf("%c", &str);
                    str=toUper(str);
                    while(getchar() != '
    ');
                }
                while(str<'A'||str>'D' || str =='0');
                if(strchr(ta,str))
                {
                    printf("回答正确
    ");
                    sprintf (sql, "update test set AnswerRight=1 where id=%s",id);  
            if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)  
                            {  
                            //    printf(sql);
                                printf ("操作失败,错误代码:%s
    ", err_msg);  
                                exit(-1);  
                            } 
                }
                else
                {
                    printf("回答错误
    ");
                }
            }
            else if(strchr(type,'2'))
            {
                printf("多选题:请输入答案 以回车结束
    ");
                while (scanf("%[A-E]%[A-E]%[A-E]%[A-E]%[A-E]", &ctr) != 1)
                {
                    while(getchar() != '
    ');
                    printf("输入错误,请输入A,B,C,D,E
    ");
                }
            //    scanf("%[A-E],%[A-E],%[A-E],%[A-E],%[A-E]",&ctr); //不是A-Z就结束
            
                if(getEnglish(ta,ctr)==0)
                {
                    printf("回答正确
    ");
                    sprintf (sql, "update test set AnswerRight=1 where id=%s",id);  
            if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)  
                            {  
                                //printf(sql);
                                printf ("操作失败,错误代码:%s
    ", err_msg);  
                                exit(-1);  
                            } 
                }
                else
                {
                    printf("回答错误
    ");
                }
            }
            else
            {
                        do{
                    printf("判断题:请输入答案 正确输入A错误输入B,以回车结束
    ");
                    scanf("%c", &str);
                    str=toUper(str);
                    while(getchar() != '
    ');
                }
                while(str!='a' &&str!='b'&&str!='A' &&str!='B');
                if(strchr(ta,str))
                {
                    printf("回答正确
    ");
                    sprintf (sql, "update test set AnswerRight=1 where id=%s",id);  
            if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)  
                            {  
                                //printf(sql);
                                printf ("操作失败,错误代码:%s
    ", err_msg);  
                                exit(-1);  
                            } 
                }
                else
                {
                    printf("回答错误
    ");
                }
            }
    
            //    printf(strchr(trueAnswer,str));
                
        }
     //读取excel写入数据库
     void getExcel(char fileName[10])
     {
    //
        char *p="正确答案";
    //    system("chcp 65001");
        FILE *filepipe=fopen(fileName,"r");
        fseek(filepipe,0L,SEEK_SET);
    //    Panduan(filepipe);
        if(strstr(fileName,DANXUAN_NAME))
        {
            danxuanTi(filepipe,p);
        }
        else if(strstr(fileName,DUOXUAN_NAME))
        {
            duoxuanTi(filepipe,p);
        }
        else
        {
            panduanTi(filepipe,p);    
        }
        
        //    printf("%s",text1);
    
     }
     char* intArrayPriseStr(int array[100])
     {
         int i;
         char str[1000]={''};
         char pstr[1000]={''};
         for(i=0;i<100;i++)
         {
    
                sprintf(pstr,"%d",array[i]);
                strcat(str,pstr);
                if(i<99)
                strcat(str,",");
                
         }
         //printf("%s
    ",str);
        return str;
     }
    
    void duoxuanTi(FILE *fp,char *p)
      {
        char getCell[400];
        char answerA[400];
        char answerB[400];
        char answerC[400];
        char answerD[400];
        char answerE[400];
        char ques[400];
        char ans[400];   
        char Aanswer='A';
        char Banswer='B';
        char Canswer='C';
        char Danswer='D';
        char Eanswer='E';
        int i=0;
        int j=0;
        while(fp!=NULL && !feof(fp))
        {
            fscanf(fp,"%s",&getCell);
            if(strstr(getCell,p))
            {
            //    printf("baohan
    ");
                strcpy(ans, getCell);
                //ans=getCell;
                i=0;
            }
            else if(strchr(getCell,Aanswer))
            {
                strcpy(answerA, getCell);
                i=2;
            }
            else if(strchr(getCell,Banswer))
            {
                strcpy(answerB, getCell);
                i=3;
            }
            else if(strchr(getCell,Canswer))
            {
                strcpy(answerC, getCell);
                i=4;
            }
            else if(strchr(getCell,Danswer))
            {
                strcpy(answerD, getCell);
                i=5;
            }
            else if(strchr(getCell,Eanswer))
            {
                strcpy(answerE, getCell);
                i=6;
            }
            else
            {
                if(i>0)
                {
                    switch(i)
                    {
                        case 2:
                        strcat(answerA, getCell);
                        break;
                        case 3:
                        strcat(answerB, getCell);
                        break;
                        case 4:
                        strcat(answerC, getCell);
                        break;
                        case 5:
                        strcat(answerD, getCell);
                        break;
                        case 6:
                        strcat(answerE, getCell);
                        break;
                        default:
                        strcat(ques, getCell);
                            break;
                    }
                }
                else
                {
                    strcpy(ques, getCell);
                    i=1;
                }
                
            }
        
        //    sprintf (sql, "INSERT INTO test (question, trueAnswer, questionType) VALUES ('%s', '%s', %c)", ques, ans, '1');  
        if(i==0)
        {sprintf (sql, "INSERT INTO test (question,answerA,answerB,answerC,answerD,answerE, trueAnswer, questionType) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', %c)", ques, answerA,answerB,answerC,answerD,answerE,ans, '2');  
            if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)  
                            {  
                            //    printf(sql);
                                printf ("操作失败,错误代码:%s
    ", err_msg);  
                                exit(-1);  
                            }  
            j++;
            printf("%d",j);
        }
        
                        }
                    
      }
    
    void danxuanTi(FILE *fp,char *p)
      {
        char getCell[400];
        char answerA[400];
        char answerB[400];
        char answerC[400];
        char answerD[400];
        char ques[400];
        char ans[400];   
        char Aanswer='A';
        char Banswer='B';
        char Canswer='C';
        char Danswer='D';
        int i=0;
        int j=0;
        while(fp!=NULL && !feof(fp))
        {
            fscanf(fp,"%s",&getCell);
            if(strstr(getCell,p))
            {
            //    printf("baohan
    ");
                strcpy(ans, getCell);
                //ans=getCell;
                i=0;
            }
            else if(strchr(getCell,Aanswer))
            {
                strcpy(answerA, getCell);
                i=2;
            }
            else if(strchr(getCell,Banswer))
            {
                strcpy(answerB, getCell);
                i=3;
            }
            else if(strchr(getCell,Canswer))
            {
                strcpy(answerC, getCell);
                i=4;
            }
            else if(strchr(getCell,Danswer))
            {
                strcpy(answerD, getCell);
                i=5;
            }
            else
            {
                if(i>0)
                {
                    switch(i)
                    {
                        case 2:
                        strcat(answerA, getCell);
                        break;
                        case 3:
                        strcat(answerB, getCell);
                        break;
                        case 4:
                        strcat(answerC, getCell);
                        break;
                        case 5:
                        strcat(answerD, getCell);
                        break;
                        default:
                        strcat(ques, getCell);
                            break;
                    }
                }
                else
                {
                    strcpy(ques, getCell);
                    i=1;
                }
                
            }
        
        //    sprintf (sql, "INSERT INTO test (question, trueAnswer, questionType) VALUES ('%s', '%s', %c)", ques, ans, '1');  
        if(i==0)
        {sprintf (sql, "INSERT INTO test (question,answerA,answerB,answerC,answerD, trueAnswer, questionType) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', %c)", ques, answerA,answerB,answerC,answerD,ans, '1');  
            if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)  
                            {  
                            //    printf(sql);
                                printf ("操作失败,错误代码:%s
    ", err_msg);  
                                exit(-1);  
                            }  
            j++;
            printf("%d",j);
        }
        
                        }
                    
      }
    
    
    int main()
    {    
    
        int a[100];
        char excelOrAnswer;
        char *randnumber;
        int i;srand(time(0)); /*初始化种子*/
        for( i = 0; i < 100; i++ ) 
        {
            a[i]=rand()%2301;
            //printf("%d
    ",a[i]);
        }
        //打开数据库,创建连接  
        if (sqlite3_open(DB_NAME, &conn) != SQLITE_OK) puts ("无法打开!");  
        printf("请选择操作:A 导入单选题  B 进行答题  C 导入多选题  D 导入判断题  
    ");
        scanf("%c",&excelOrAnswer);
        excelOrAnswer=toLower(excelOrAnswer);
        while(getchar() != '
    ');
        if('a'==excelOrAnswer)
        {
            //printf("单选");
            getExcel(DANXUAN_NAME);    
        }
         if('c'==excelOrAnswer)
        {
            //printf("多选");
            getExcel(DUOXUAN_NAME);
        }
         if('d'==excelOrAnswer)
        {
                //printf("判断");
            getExcel(PANDUANXUAN_NAME);
        }
        if('b'==excelOrAnswer) 
        {
            //查询  
            randnumber=intArrayPriseStr(a);
            strcpy(sql, "SELECT * FROM test where ANSWERRIGHT=0  and id in (");
            strncat(sql, randnumber,1000);
            strncat(sql, ")",10);
        //    printf(sql);
            if (sqlite3_exec (conn, sql, &sqlite3_exec_callback, 0, &err_msg) != SQLITE_OK)  
            {  
                printf ("操作失败,错误代码:%s
    ", err_msg);  
              //  exit(-1);  
            }  
            
         }
        //关闭连接  
        if (sqlite3_close(conn) != SQLITE_OK)  
        {  
            printf ("无法关闭,错误代码:%s
    ", sqlite3_errmsg(conn));  
            exit(-1);  
        }  
        
        puts ("操作成功");  
        scanf("%s",&excelOrAnswer);
        return 0;  
    }

    调用了sqlite3.dll,就不提了,上面都有介绍

    处理字符串的头文件

    int getEnglish(char *p,char *ctr);
    char toLower(char a);
    char toUper(char a);
    char* toUpestrr(char a[5]);

    字符串处理程序 主要是大小写 还有截断提取英文字符

    char toLower(char a)
    {
            if (a >= 'A' && a <= 'Z')
            {
                a = a + 32;      //大写转小写
               // printf("%c", a);
            }
            else if (a >= 'a' && a <= 'z')
            {
              //  a = a - 32;      //小写转大写
               // printf("%c", a);
            }
            else
            {
                printf("输入错误
    ");
                a='0';
            }
            return a;
    }
    char toUper(char a)
    {
        if (a >= 'A' && a <= 'Z')
            {
               // a = a + 32;      //大写转小写
              //  printf("%c", a);
            }
            else if (a >= 'a' && a <= 'z')
            {
                a = a - 32;      //小写转大写
              //  printf("%c", a);
            }
            else
            {
                printf("输入错误
    ");
                a='0';
            }
            return a;
    }
    char* toUpestrr(char a[5])
    {
        int i;
        for(i=0;i<5;i++)
        {
            a[i]=toUper(a[i]);
        }
        return a;
    }
    
    int getEnglish(char *p,char *ctr)
    {
        char str[6];
        int j=0,inx,x;
    
        int limit = strlen(p);
        for (inx=0;inx!=limit; ++inx)     
        {
            if('A'<=p[inx]&&p[inx]<='Z')
            {
                str[j]=p[inx];
                j++;
            }
        }
    //    x=strcmp(str,ctr);
    //    printf("%d",x);
        str[j]='';
        return strcmp(str,ctr);
    }

    小程序告一段落。

    总结:遇到的问题很基础,但是在学习的时候不会考虑到,经过这次程序的编写,对基础有了更深的理解,尤其是数组,字符串,字符等内容。并对指针的知识有了些迷茫,还需要再加深学习
         sqlite3数据库,确实是个好东西,用起来也比较简单。就是配置稍微麻烦点。
         基础是最重要的,基础牢固就能够更快更好的解决问题
         有问题自己思考,查资料,会学习的更快,实在没有头绪,可以加群向其他朋友请教。
     
  • 相关阅读:
    软件开发和机械制造的核心差别
    不做纯技术导向的程序员与中国特色的社会主义
    从代码里你可以看到什么?
    多少钱才可让人重拾理想
    项目经理一定比码农好么?
    技术还是管理?
    评李彦宏先生的内部邮件
    组织行为学对项目管理的意义(1)
    组织行为学对项目管理的意义:动机理论
    Silverlight与ashx通讯序列化DateTime时需注意的细节
  • 原文地址:https://www.cnblogs.com/Lonelychampion/p/11451255.html
Copyright © 2011-2022 走看看