完成所有预设功能,未调试:bug:容易出现数据库锁死。
This commit is contained in:
parent
2a8ed8f1a3
commit
28108cee69
@ -10,12 +10,11 @@ add_executable(o
|
||||
include/sqlite3.h
|
||||
include/sqlite3ext.h
|
||||
include/extern.h
|
||||
include/myerror.h
|
||||
main.c
|
||||
sqlite3.c
|
||||
login.c
|
||||
ui.c
|
||||
signin.c
|
||||
include/ui.h
|
||||
)
|
||||
o.c
|
||||
calculate.c
|
||||
)
|
||||
target_link_libraries(o "${LIBRARY_PATH}/${LIBRARY_NAME}")
|
204
calculate.c
Normal file
204
calculate.c
Normal file
@ -0,0 +1,204 @@
|
||||
//参考文章:https://blog.csdn.net/lei20172017/article/details/116404682
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include<windows.h>
|
||||
#define MAX_SIZE 1000
|
||||
/*定义一个运算符栈*/
|
||||
typedef struct {
|
||||
char Operator[MAX_SIZE];
|
||||
int top;
|
||||
} OptorStack;
|
||||
/*定义一个操作数栈*/
|
||||
typedef struct {
|
||||
double Operand[MAX_SIZE];
|
||||
int top;
|
||||
} OpndStack;
|
||||
/*初始化运算符栈*/
|
||||
void InitOptor(OptorStack *S) {
|
||||
S->top = -1;
|
||||
}
|
||||
/*初始化操作数栈*/
|
||||
void InitOpnd(OpndStack *S) {
|
||||
S->top = -1;
|
||||
}
|
||||
/*运算符出栈*/
|
||||
int PopOptor(OptorStack *S,int *recall,char *errmsg) {
|
||||
if(S->top==-1) {
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"Wrong input.");
|
||||
return -1;
|
||||
}
|
||||
S->top--;
|
||||
return 1;
|
||||
}
|
||||
/*操作数出栈*/
|
||||
int PopOpnd(OpndStack *S,int *recall,char *errmsg) {
|
||||
if(S->top==-1) {
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"Wrong input.");
|
||||
return -1;
|
||||
}
|
||||
S->top--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*运算符入栈*/
|
||||
int PushOptor(OptorStack *S,char ch,int *recall,char *errmsg) {
|
||||
if(S->top==MAX_SIZE-1) {
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"Wrong input.");
|
||||
return -1;
|
||||
}
|
||||
S->top++;
|
||||
S->Operator[S->top]=ch;
|
||||
return 1;
|
||||
}
|
||||
/*操作数入栈*/
|
||||
int PushOpnd(OpndStack *S,double ch,int *recall,char *errmsg) {
|
||||
if(S->top==MAX_SIZE-1) {
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"Wrong input.");
|
||||
return -1;
|
||||
}
|
||||
S->top++;
|
||||
S->Operand[S->top]=ch;
|
||||
return 1;
|
||||
}
|
||||
/*取运算符栈栈顶元素*/
|
||||
char GetOptor(OptorStack *S,int *recall,char *errmsg) {
|
||||
if(S->top==-1) {
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"Wrong input.");
|
||||
return -1;
|
||||
}
|
||||
return S->Operator[S->top];
|
||||
}
|
||||
/*取操作数栈栈顶元素*/
|
||||
double GetOpnd(OpndStack *S,int *recall,char *errmsg) {
|
||||
if(S->top==-1) {
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"Wrong input.");
|
||||
return -1;
|
||||
}
|
||||
return S->Operand[S->top];
|
||||
}
|
||||
/*表达式运算函数*/
|
||||
double Calculate(double a,double b,char op,int *recall,char *errmsg) {
|
||||
double result;
|
||||
if(op=='+') result=a+b;
|
||||
if(op=='-') result=a-b;
|
||||
if(op=='*') result=a*b;
|
||||
if(op=='/') { //要防止除数为0
|
||||
if(b==0) {
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"Wrong input.The divisor is not 0");
|
||||
return -1;
|
||||
}
|
||||
result=a/b;
|
||||
}
|
||||
return result; //返回结果result
|
||||
}
|
||||
|
||||
int change(char ch) {
|
||||
switch(ch) {
|
||||
case '+':
|
||||
return 0;
|
||||
case '-':
|
||||
return 1;
|
||||
case '*':
|
||||
return 2;
|
||||
case '/':
|
||||
return 3;
|
||||
case '(':
|
||||
return 4;
|
||||
case ')':
|
||||
return 5;
|
||||
case '#':
|
||||
return 6;
|
||||
}
|
||||
}
|
||||
/*定义一个算符优先关系矩阵*/
|
||||
char cmp[7][8]= {">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=?",">>>>?>>","<<<<<?="};
|
||||
/*算符比较函数,返回优先级:>或<或=*/
|
||||
int Compare(char ch1,char ch2,int *recall,char *errmsg) {
|
||||
if(cmp[change(ch1)][change(ch2)]=='?') {
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"Wrong input.");
|
||||
return -1;
|
||||
}
|
||||
return cmp[change(ch1)][change(ch2)];
|
||||
}
|
||||
/*检查函数,用来检查输入的表达式的操作数和运算符的合法性*/
|
||||
int Check(char *S,int len) {
|
||||
int i;
|
||||
for(i=0; i<len; i++) {
|
||||
if(S[i]>='0'&&S[i]<='9')continue;
|
||||
if(S[i]=='('||S[i]==')'||S[i]=='*'||S[i]=='/'||S[i]=='+'||S[i]=='-'||S[i]=='.')continue;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void calculate(char *expre,int *recall,char *errmsg,double *answer) {
|
||||
SetConsoleOutputCP(65001);
|
||||
char opd[9999]; //opd用来存操作数
|
||||
int len;
|
||||
OptorStack Optor;
|
||||
OpndStack Opnd;
|
||||
InitOptor(&Optor);
|
||||
InitOpnd(&Opnd);
|
||||
PushOptor(&Optor,'#',recall,errmsg);
|
||||
len = strlen(expre);
|
||||
int kk=0;
|
||||
for(int i=0;i<len;i++){
|
||||
if(expre[len]>='0'&&expre[len]<='9')continue;
|
||||
else kk=1;
|
||||
}
|
||||
if(kk==0){
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"you should make sure this is a expression.");
|
||||
return;
|
||||
}
|
||||
if (Check(expre,len) == 0) {
|
||||
*recall=-1;
|
||||
strcpy(errmsg,"Wrong input.");
|
||||
return;
|
||||
}
|
||||
int i,j=0,k=0;
|
||||
double x,y;
|
||||
expre[len] = '#'; //在expre数组后加个#结尾标志
|
||||
for (i=0; i<=len; i++) {
|
||||
if ((expre[i]>='0' && expre[i]<='9') || expre[i] == '.') {
|
||||
opd[k++] = expre[i]; //将数字字符存入操作数数组opd中
|
||||
j = 1;
|
||||
continue;
|
||||
}
|
||||
if(j) {
|
||||
opd[k] = '\0';
|
||||
PushOpnd(&Opnd,atof(opd),recall,errmsg);
|
||||
j=0;
|
||||
k=0;
|
||||
}
|
||||
switch (Compare(GetOptor(&Optor,recall,errmsg),expre[i],recall,errmsg)) { //比较运算符栈的栈顶运算符和运算符expre[i]的优先级
|
||||
case '<':
|
||||
PushOptor(&Optor,expre[i],recall,errmsg);
|
||||
break;
|
||||
case '=':
|
||||
PopOptor(&Optor,recall,errmsg);
|
||||
break;
|
||||
case '>':
|
||||
y = GetOpnd(&Opnd,recall,errmsg),PopOpnd(&Opnd,recall,errmsg);
|
||||
x = GetOpnd(&Opnd,recall,errmsg),PopOpnd(&Opnd,recall,errmsg);
|
||||
PushOpnd(&Opnd,Calculate(x,y,GetOptor(&Optor,recall,errmsg),recall,errmsg),recall,errmsg);
|
||||
PopOptor(&Optor,recall,errmsg);
|
||||
i--;
|
||||
break;
|
||||
default:break;
|
||||
}
|
||||
}
|
||||
if(recall==-1)return;
|
||||
*answer = GetOpnd(&Opnd,recall,errmsg);
|
||||
}
|
@ -4,5 +4,14 @@
|
||||
|
||||
#ifndef EXTERN_H
|
||||
#define EXTERN_H
|
||||
extern char *Username;
|
||||
#define WELCOME_UI 1
|
||||
#define LOGIN_UI 2
|
||||
#define SIGNIN_UI 3
|
||||
#define STUDENT_UI 4
|
||||
#define TEACHER_UI 5
|
||||
#define STU_TEST_UI 6
|
||||
#define STU_HIS_SC_UI 7
|
||||
#define STU_EXC 8
|
||||
#define T_PROBLEM_UI 9
|
||||
#define ADD_UI 10
|
||||
#endif //EXTERN_H
|
||||
|
@ -14,4 +14,14 @@ void Login(char *username,char*password,int *recall,char *errmsg);
|
||||
void Signin(const char *username,const char*password,int *recall,char *errmsg);
|
||||
|
||||
void myexit();
|
||||
|
||||
void db_create(int *recall,char *errmsg);
|
||||
|
||||
int stu_type_check();
|
||||
|
||||
void stu_type_insert(char *name,char *class,char *majority,int *recall,char *errmsg);
|
||||
|
||||
void add(char* test,int *recall,char* errmsg);
|
||||
|
||||
void calculate(char *expre,int *recall,char *errmsg,double *answer);
|
||||
#endif //FUNCTION_H
|
||||
|
@ -1,20 +0,0 @@
|
||||
//
|
||||
// Created by zhang on 2024/12/25.
|
||||
//
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "function.h"
|
||||
|
||||
#ifndef MYERROR_H
|
||||
#define MYERROR_H
|
||||
|
||||
void Error_Invalid_input();
|
||||
void Error_Invalid_input(){
|
||||
fprintf(stdout,"Error:不合法的输入!输入'0'以继续");
|
||||
while(getchar() != '0');
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
10
include/ui.h
10
include/ui.h
@ -14,5 +14,15 @@ int TeachersDesktop_ui();
|
||||
|
||||
int Welcome_ui();
|
||||
|
||||
void stu_test_ui(int *recall,char *errmsg,char *class);
|
||||
|
||||
void stu_his_sc_ui();
|
||||
|
||||
void stu_exercise_ui();
|
||||
|
||||
int t_problem_ui();
|
||||
|
||||
void create_ui();
|
||||
|
||||
int add_ui();
|
||||
#endif //O_UI_H
|
||||
|
56
login.c
56
login.c
@ -1,56 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include<string.h>
|
||||
#include "./include/function.h"
|
||||
#include "./include/ui.h"
|
||||
void Login(char *username,char*password,int *recall,char *errmsg){
|
||||
sqlite3 *db;
|
||||
int rc;
|
||||
|
||||
// 打开数据库
|
||||
rc = sqlite3_open("./data/msg.db", &db);
|
||||
if (rc) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
|
||||
// SQL 查询语句:查找用户及其密码
|
||||
const char *sql = "SELECT user, password FROM users WHERE user = ?;";
|
||||
|
||||
sqlite3_stmt *stmt;
|
||||
|
||||
// 编译 SQL 语句
|
||||
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
|
||||
// 绑定查询参数
|
||||
sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);
|
||||
|
||||
rc = sqlite3_step(stmt);
|
||||
if (rc == SQLITE_ROW) {
|
||||
// 查找到用户,获取密码
|
||||
const char *db_password = (const char *)sqlite3_column_text(stmt, 1);
|
||||
|
||||
// 如果密码匹配
|
||||
if (db_password && strcmp(db_password, password) == 0) {
|
||||
*recall=0;
|
||||
} else {
|
||||
strcpy(errmsg,"Incorrect username or password.");
|
||||
*recall=-1;
|
||||
}
|
||||
} else {
|
||||
strcpy(errmsg,"Incorrect username or password.");
|
||||
*recall=-1;
|
||||
}
|
||||
// 绑定查询参数
|
||||
// 清理资源
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
|
||||
return;
|
||||
}
|
111
main.c
111
main.c
@ -6,68 +6,71 @@
|
||||
#include <windows.h>
|
||||
#include "./include/function.h"
|
||||
#include "./include/ui.h"
|
||||
#include "./include/myerror.h"
|
||||
#include "./include/extern.h"
|
||||
#include "./include/curses.h"
|
||||
#define WELCOME_UI 1
|
||||
#define LOGIN_UI 2
|
||||
#define SIGNIN_UI 3
|
||||
void myexit() {
|
||||
endwin();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
//void test() {
|
||||
// // 初始化 ncurses
|
||||
// initscr();
|
||||
// cbreak(); // 禁用行缓冲
|
||||
// noecho(); // 不显示输入字符
|
||||
// curs_set(0); // 隐藏光标
|
||||
//
|
||||
// // 启用所有鼠标事件
|
||||
// mousemask(ALL_MOUSE_EVENTS, NULL);
|
||||
//
|
||||
// // 创建一个新的窗口
|
||||
// WINDOW *win = newwin(10, 30, 5, 5);
|
||||
// box(win, 0, 0); // 为窗口添加边框
|
||||
// mvwprintw(win, 1, 1, "Click inside this window.");
|
||||
// keypad(win,TRUE);
|
||||
// wrefresh(win); // 刷新窗口以显示内容
|
||||
//
|
||||
// MEVENT event; // 用于存储鼠标事件
|
||||
//
|
||||
// while (1) {
|
||||
// int ch = wgetch(win); // 从指定窗口获取输入
|
||||
//
|
||||
// if (ch == KEY_MOUSE) {
|
||||
// if (nc_getmouse(&event) == OK) {
|
||||
// // 打印鼠标事件的信息
|
||||
// mvwprintw(win, 3, 1, "Mouse at (%d, %d), button %d", event.x, event.y, event.bstate);
|
||||
// wrefresh(win); // 刷新窗口以显示鼠标点击位置
|
||||
// }
|
||||
// } else {
|
||||
// mvwprintw(win, 4, 1, "You pressed a key: %c", ch);
|
||||
// wrefresh(win); // 刷新窗口以显示按键信息
|
||||
// break; // 按键退出循环
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // 等待用户按键后退出
|
||||
// getch();
|
||||
//
|
||||
// // 清理和结束程序
|
||||
// endwin();
|
||||
// return;
|
||||
//}
|
||||
|
||||
char Username[15];
|
||||
char class[15];
|
||||
void mytest();
|
||||
int main() {
|
||||
initscr(); // 初始化curses
|
||||
cbreak(); // 禁用行缓冲
|
||||
noecho(); // 不显示输入字符
|
||||
curs_set(0); // 隐藏光标
|
||||
keypad(stdscr, TRUE); // 启用键盘按键的特殊处理
|
||||
mousemask(ALL_MOUSE_EVENTS, NULL); // 启用鼠标事件
|
||||
timeout(100); // 设置输入超时,防止程序卡死
|
||||
int recall;
|
||||
char *errmsg[100];
|
||||
db_create(&recall,errmsg);
|
||||
if(recall!=0){
|
||||
fprintf(stderr,"%s\ninput any key to exit.",errmsg);
|
||||
getchar();
|
||||
exit(0);
|
||||
}
|
||||
//int code=TEACHER_UI;
|
||||
int code=Welcome_ui();
|
||||
while(1){
|
||||
switch(code){
|
||||
case WELCOME_UI:code=Welcome_ui();break;
|
||||
case LOGIN_UI:code=Login_ui();break;
|
||||
case SIGNIN_UI:code=Signin_ui();break;
|
||||
case 0:myexit();
|
||||
case STUDENT_UI:code=StudentsDesktop_ui();break;
|
||||
case TEACHER_UI:code=TeachersDesktop_ui();break;
|
||||
case T_PROBLEM_UI:code=t_problem_ui();break;
|
||||
case ADD_UI:code=add_ui();break;
|
||||
case 0:myexit();return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void mytest(){
|
||||
// sqlite3 *db;
|
||||
// char *errMsg = 0;
|
||||
// int rc;
|
||||
// // 打开数据库,如果数据库文件不存在则创建它
|
||||
// rc = sqlite3_open("./data/msg.db", &db);
|
||||
// for(int i=1;i<=100;i++){
|
||||
// char *sql_insert="INSERT INTO tests (test_name,Creater) VALUES (?, 'xianya');";
|
||||
// sqlite3_stmt *insert;
|
||||
// char test[10];
|
||||
// snprintf(test,7,"test%d",i);
|
||||
// rc = sqlite3_prepare_v2(db, sql_insert, -1, &insert, 0);
|
||||
// if (rc != SQLITE_OK) {
|
||||
// sqlite3_close(db);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// // 将第一个参数 (username) 绑定到 SQL 语句中的第一个 "?"
|
||||
// sqlite3_bind_text(insert, 1, test, -1, SQLITE_STATIC);
|
||||
//
|
||||
// rc = sqlite3_step(insert);
|
||||
// if (rc != SQLITE_DONE) {
|
||||
// sqlite3_free(errMsg);
|
||||
// sqlite3_finalize(insert);
|
||||
// sqlite3_close(db);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// printf("OK");
|
||||
// sqlite3_close(db);
|
||||
// return;
|
||||
//}
|
506
o.c
Normal file
506
o.c
Normal file
@ -0,0 +1,506 @@
|
||||
//
|
||||
// Created by zhang on 2024/12/29.
|
||||
//
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <windows.h>
|
||||
#include "./include/function.h"
|
||||
#include "./include/extern.h"
|
||||
#include "./include/curses.h"
|
||||
#include "./include/sqlite3.h"
|
||||
extern char Username[15];
|
||||
extern char class[15];
|
||||
void myexit() {
|
||||
endwin();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void Login(char *username,char*password,int *recall,char *errmsg){
|
||||
if(!username[0]){
|
||||
strcpy(errmsg,"The username is empty!");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
if(!password[0]){
|
||||
strcpy(errmsg,"The password is empty!");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
sqlite3 *db;
|
||||
int rc;
|
||||
|
||||
// 打开数据库
|
||||
rc = sqlite3_open("./data/msg.db", &db);
|
||||
if (rc) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
|
||||
// SQL 查询语句:查找用户及其密码
|
||||
const char *sql = "SELECT password, type FROM users WHERE user = ?;";
|
||||
|
||||
sqlite3_stmt *stmt;
|
||||
|
||||
// 编译 SQL 语句
|
||||
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
|
||||
// 绑定查询参数
|
||||
sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);
|
||||
|
||||
rc = sqlite3_step(stmt);
|
||||
if (rc == SQLITE_ROW) {
|
||||
// 查找到用户,获取密码
|
||||
const char *db_password = (const char *)sqlite3_column_text(stmt, 0);
|
||||
|
||||
// 如果密码匹配
|
||||
if (db_password && strcmp(db_password, password) == 0) {
|
||||
const char *db_type = (const char *)sqlite3_column_text(stmt, 1);
|
||||
strcpy(Username,username);
|
||||
*recall = db_type[0]-'0';
|
||||
} else {
|
||||
strcpy(errmsg,"Incorrect username or password.");
|
||||
*recall=-1;
|
||||
}
|
||||
} else {
|
||||
strcpy(errmsg,"Incorrect username or password.");
|
||||
*recall=-1;
|
||||
}
|
||||
// 绑定查询参数
|
||||
// 清理资源
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void Signin(const char *username,const char*password,int *recall,char *errmsg){
|
||||
if(!username[0]){
|
||||
strcpy(errmsg,"The username is empty!");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
if(!password[0]){
|
||||
strcpy(errmsg,"The password is empty!");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
sqlite3 *db;
|
||||
char *errMsg = 0;
|
||||
int rc;
|
||||
// 打开数据库,如果数据库文件不存在则创建它
|
||||
rc = sqlite3_open("./data/msg.db", &db);
|
||||
if (rc) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
const char *sql = "SELECT user FROM users WHERE user = ?;";
|
||||
|
||||
sqlite3_stmt *stmt;
|
||||
|
||||
// 编译 SQL 语句
|
||||
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
|
||||
// 绑定查询参数
|
||||
sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);
|
||||
|
||||
rc = sqlite3_step(stmt);
|
||||
if (rc == SQLITE_ROW) {
|
||||
// 查找到用户
|
||||
strcpy(errmsg,"Username has been used.");
|
||||
*recall=-1;
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
else sqlite3_finalize(stmt);
|
||||
char *sql_insert="INSERT INTO users (user,password,type) VALUES (?, ? ,'4');";
|
||||
sqlite3_stmt *insert;
|
||||
rc = sqlite3_prepare_v2(db, sql_insert, -1, &insert, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
|
||||
// 将第一个参数 (username) 绑定到 SQL 语句中的第一个 "?"
|
||||
sqlite3_bind_text(insert, 1, username, -1, SQLITE_STATIC);
|
||||
|
||||
// 将第二个参数 (password) 绑定到 SQL 语句中的第二个 "?"
|
||||
sqlite3_bind_text(insert, 2, password, -1, SQLITE_STATIC);
|
||||
|
||||
rc = sqlite3_step(insert);
|
||||
if (rc != SQLITE_DONE) {
|
||||
strcpy(errmsg,"Error:database error");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(insert);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(insert);
|
||||
sqlite3_close(db);
|
||||
*recall=0;
|
||||
return;
|
||||
}
|
||||
|
||||
void db_create(int *recall,char *errmsg){
|
||||
sqlite3 *db;
|
||||
char *errMsg = 0;
|
||||
int rc;
|
||||
// 打开数据库,如果数据库文件不存在则创建它
|
||||
rc = sqlite3_open("./data/msg.db", &db);
|
||||
if (rc) {
|
||||
strcpy(errmsg,"database error.");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const char *sql_create_table =
|
||||
"CREATE TABLE IF NOT EXISTS users "
|
||||
"("
|
||||
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"user TEXT UNIQUE,"
|
||||
"password TEXT,"
|
||||
"type TEXT"
|
||||
");";
|
||||
|
||||
// 执行 SQL 语句
|
||||
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
|
||||
|
||||
sql_create_table="CREATE TABLE IF NOT EXISTS tests "
|
||||
"("
|
||||
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"test_name TEXT,"
|
||||
"Creater TEXT,"
|
||||
"class TEXT,"
|
||||
"problems_count INTEGER"
|
||||
");";
|
||||
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
|
||||
|
||||
sql_create_table="CREATE TABLE IF NOT EXISTS timu "
|
||||
"("
|
||||
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"text TEXT UNIQUE,"
|
||||
"answer INTEGER"
|
||||
");";
|
||||
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
|
||||
|
||||
sql_create_table="CREATE TABLE IF NOT EXISTS stu"
|
||||
"("
|
||||
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"majority TEXT,"
|
||||
"class TEXT,"
|
||||
"name TEXT,"
|
||||
"test_index INTEGER,"
|
||||
"test_name TEXT,"
|
||||
"user TEXT,"
|
||||
"score INTEGER"
|
||||
");";
|
||||
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
|
||||
|
||||
sql_create_table="CREATE TABLE IF NOT EXISTS students "
|
||||
"("
|
||||
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"user TEXT UNIQUE,"
|
||||
"name TEXT,"
|
||||
"class TEXT,"
|
||||
"majority TEXT"
|
||||
");";
|
||||
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
|
||||
sql_create_table="CREATE TABLE IF NOT EXISTS class "
|
||||
"("
|
||||
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"name TEXT"
|
||||
");";
|
||||
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
|
||||
|
||||
sql_create_table="CREATE TABLE IF NOT EXISTS majority "
|
||||
"("
|
||||
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"name TEXT"
|
||||
");";
|
||||
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
sql_create_table="CREATE TABLE IF NOT EXISTS test_include "
|
||||
"("
|
||||
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"text TEXT ,"
|
||||
"answer INTEGER,"
|
||||
"test_index INTEGER"
|
||||
");";
|
||||
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
}
|
||||
|
||||
int stu_type_check(){
|
||||
sqlite3 *db;
|
||||
char *errMsg = 0;
|
||||
int rc;
|
||||
// 打开数据库,如果数据库文件不存在则创建它
|
||||
rc = sqlite3_open("./data/msg.db", &db);
|
||||
if (rc) {
|
||||
sqlite3_close(db);
|
||||
return -1;
|
||||
}
|
||||
const char *sql = "SELECT class FROM students WHERE user = ?;";
|
||||
|
||||
sqlite3_stmt *stmt;
|
||||
|
||||
// 编译 SQL 语句
|
||||
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 绑定查询参数
|
||||
sqlite3_bind_text(stmt, 1, Username, -1, SQLITE_STATIC);
|
||||
|
||||
rc = sqlite3_step(stmt);
|
||||
|
||||
if(rc==SQLITE_ROW){
|
||||
char *cl=(const char *)sqlite3_column_text(stmt, 0);
|
||||
strcpy(class,cl);
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
return 1;
|
||||
}
|
||||
else{
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void stu_type_insert(char *name,char *class,char *majority,int *recall,char *errmsg) {
|
||||
if(!name[0]){
|
||||
strcpy(errmsg,"The name is empty!");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
if(!class[0]){
|
||||
strcpy(errmsg,"The class is empty!");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
if(!majority[0]){
|
||||
strcpy(errmsg,"The majority is empty!");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
|
||||
sqlite3 *db;
|
||||
char *errMsg = 0;
|
||||
int rc;
|
||||
// 打开数据库,如果数据库文件不存在则创建它
|
||||
rc = sqlite3_open("./data/msg.db", &db);
|
||||
if (rc) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
const char *sql = "SELECT name FROM class WHERE name = ?;";
|
||||
|
||||
sqlite3_stmt *stmt;
|
||||
|
||||
// 编译 SQL 语句
|
||||
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
|
||||
// 绑定查询参数
|
||||
sqlite3_bind_text(stmt, 1, class, -1, SQLITE_STATIC);
|
||||
|
||||
rc = sqlite3_step(stmt);
|
||||
|
||||
if(rc!=SQLITE_ROW){
|
||||
strcpy(errmsg,"Unaccepted class.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
sql = "SELECT name FROM majority WHERE name = ?;";
|
||||
|
||||
// 编译 SQL 语句
|
||||
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
|
||||
// 绑定查询参数
|
||||
sqlite3_bind_text(stmt, 1, majority, -1, SQLITE_STATIC);
|
||||
|
||||
rc = sqlite3_step(stmt);
|
||||
|
||||
if(rc!=SQLITE_ROW){
|
||||
strcpy(errmsg,"Unaccepted majority.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
|
||||
sql="INSERT INTO students (user,name,class,majority) VALUES(?,?,?,?)";
|
||||
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
sqlite3_bind_text(stmt, 1, Username, -1, SQLITE_STATIC);
|
||||
sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC);
|
||||
sqlite3_bind_text(stmt, 3, class, -1, SQLITE_STATIC);
|
||||
sqlite3_bind_text(stmt, 4, majority, -1, SQLITE_STATIC);
|
||||
rc = sqlite3_step(stmt);
|
||||
if (rc != SQLITE_DONE) {
|
||||
strcpy(errmsg,"Error:database error");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(stmt);
|
||||
sqlite3_close(db);
|
||||
*recall=0;
|
||||
return;
|
||||
}
|
||||
|
||||
void add(char* test,int *recall,char* errmsg){
|
||||
if(!test[0]){
|
||||
*recall=1;
|
||||
return;
|
||||
}
|
||||
double ans;
|
||||
char *test2[9999];
|
||||
strcpy(test2,test);
|
||||
calculate(test2,recall,errmsg,&ans);
|
||||
if(*recall==-1)return;
|
||||
sqlite3 *db;
|
||||
char *errMsg = 0;
|
||||
int rc;
|
||||
// 打开数据库,如果数据库文件不存在则创建它
|
||||
rc = sqlite3_open("./data/msg.db", &db);
|
||||
if (rc) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
char *sql_insert="INSERT INTO timu (text,answer) VALUES (?, ?);";
|
||||
sqlite3_stmt *insert;
|
||||
rc = sqlite3_prepare_v2(db, sql_insert, -1, &insert, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
|
||||
// 将第一个参数 (username) 绑定到 SQL 语句中的第一个 "?"
|
||||
sqlite3_bind_text(insert, 1, test, -1, SQLITE_STATIC);
|
||||
|
||||
// 将第二个参数 (password) 绑定到 SQL 语句中的第二个 "?"
|
||||
sqlite3_bind_double(insert, 2, ans);
|
||||
|
||||
rc = sqlite3_step(insert);
|
||||
if (rc != SQLITE_DONE) {
|
||||
strcpy(errmsg,"Error:database error");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(insert);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(insert);
|
||||
sqlite3_close(db);
|
||||
*recall=0;
|
||||
return;
|
||||
}
|
63
signin.c
63
signin.c
@ -1,63 +0,0 @@
|
||||
//
|
||||
// Created by zhang on 2024/12/29.
|
||||
//
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "./include/function.h"
|
||||
#include "./include/sqlite3.h"
|
||||
|
||||
void Signin(const char *username,const char*password,int *recall,char *errmsg){
|
||||
sqlite3 *db;
|
||||
char *errMsg = 0;
|
||||
int rc;
|
||||
// 打开数据库,如果数据库文件不存在则创建它
|
||||
rc = sqlite3_open("./data/msg.db", &db);
|
||||
if (rc) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
return;
|
||||
}
|
||||
const char *sql_create_table =
|
||||
"CREATE TABLE IF NOT EXISTS users "
|
||||
"("
|
||||
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||
"user TEXT UNIQUE,"
|
||||
"password TEXT"
|
||||
");";
|
||||
|
||||
// 执行 SQL 语句
|
||||
rc = sqlite3_exec(db, sql_create_table, 0, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
const char *sql_insert="INSERT INTO users (user, password) VALUES (?, ?);";
|
||||
sqlite3_stmt *insert;
|
||||
rc = sqlite3_prepare_v2(db, sql_insert, -1, &insert, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,"Error:database error.");
|
||||
*recall=-1;
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
|
||||
// 将第一个参数 (name) 绑定到 SQL 语句中的第一个 "?"
|
||||
sqlite3_bind_text(insert, 1, username, -1, SQLITE_STATIC);
|
||||
|
||||
// 将第二个参数 (email) 绑定到 SQL 语句中的第二个 "?"
|
||||
sqlite3_bind_text(insert, 2, password, -1, SQLITE_STATIC);
|
||||
|
||||
rc = sqlite3_exec(db,insert,0,0,&errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
strcpy(errmsg,errMsg);
|
||||
sqlite3_free(errMsg);
|
||||
sqlite3_finalize(insert);
|
||||
sqlite3_close(db);
|
||||
*recall=-1;return;
|
||||
}
|
||||
sqlite3_close(db);
|
||||
*recall=0;
|
||||
return;
|
||||
}
|
Loading…
Reference in New Issue
Block a user