完成所有预设功能,未调试:bug:容易出现数据库锁死。

This commit is contained in:
xianya 2024-12-31 03:36:09 +08:00
parent 2a8ed8f1a3
commit 28108cee69
11 changed files with 2457 additions and 232 deletions

View File

@ -10,12 +10,11 @@ add_executable(o
include/sqlite3.h include/sqlite3.h
include/sqlite3ext.h include/sqlite3ext.h
include/extern.h include/extern.h
include/myerror.h
main.c main.c
sqlite3.c sqlite3.c
login.c
ui.c ui.c
signin.c
include/ui.h include/ui.h
) o.c
calculate.c
)
target_link_libraries(o "${LIBRARY_PATH}/${LIBRARY_NAME}") target_link_libraries(o "${LIBRARY_PATH}/${LIBRARY_NAME}")

204
calculate.c Normal file
View 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);
}

View File

@ -4,5 +4,14 @@
#ifndef EXTERN_H #ifndef EXTERN_H
#define 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 #endif //EXTERN_H

View File

@ -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 Signin(const char *username,const char*password,int *recall,char *errmsg);
void myexit(); 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 #endif //FUNCTION_H

View File

@ -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

View File

@ -14,5 +14,15 @@ int TeachersDesktop_ui();
int Welcome_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 #endif //O_UI_H

56
login.c
View File

@ -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;
}

109
main.c
View File

@ -6,68 +6,71 @@
#include <windows.h> #include <windows.h>
#include "./include/function.h" #include "./include/function.h"
#include "./include/ui.h" #include "./include/ui.h"
#include "./include/myerror.h"
#include "./include/extern.h" #include "./include/extern.h"
#include "./include/curses.h" #include "./include/curses.h"
#define WELCOME_UI 1 char Username[15];
#define LOGIN_UI 2 char class[15];
#define SIGNIN_UI 3 void mytest();
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;
//}
int main() { 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(); int code=Welcome_ui();
while(1){ while(1){
switch(code){ switch(code){
case WELCOME_UI:code=Welcome_ui();break; case WELCOME_UI:code=Welcome_ui();break;
case LOGIN_UI:code=Login_ui();break; case LOGIN_UI:code=Login_ui();break;
case SIGNIN_UI:code=Signin_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
View 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;
}

View File

@ -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;
}

1691
ui.c

File diff suppressed because it is too large Load Diff