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数据库,确实是个好东西,用起来也比较简单。就是配置稍微麻烦点。
         基础是最重要的,基础牢固就能够更快更好的解决问题
         有问题自己思考,查资料,会学习的更快,实在没有头绪,可以加群向其他朋友请教。
     
  • 相关阅读:
    Atitit 趋势管理之道 attilax著
    Atitit 循环处理的新特性 for...else...
    Atitit 2017年的技术趋势与未来的大技术趋势
    atitit 用什么样的维度看问题.docx 如何了解 看待xxx
    atitit prj mnrs 项目中的几种经理角色.docx
    Atitit IT办公场所以及度假村以及网点以及租房点建设之道 attilax总结
    Atitit 工具选型的因素与方法 attilax总结
    Atitit.团队文化建设影响组织的的一些原理 法则 定理 效应 p826.v4
    Atiitt 管理方面的误区总结 attilax总结
    Atitit 未来趋势把控的书籍 attilax总结 v3
  • 原文地址:https://www.cnblogs.com/Lonelychampion/p/11451255.html
Copyright © 2011-2022 走看看