#include <stdio.h> #include <stdlib.h> #include <string.h> #pragma warning (disable:4996) #define MAXN 10001 typedef struct { char ch[MAXN]; int length; }List; List Dictionary[MAXN], InPut; int n = 0; void InitList(List InPut) { int i, j, k, count, flag = 1; for (i = 0; i < n; i++) { if (strcmp(Dictionary[i].ch, InPut.ch) == 0) { printf("%s is correct\n", InPut.ch); flag = 0; break; } } if (flag) { printf("%s:", InPut.ch); for (i = 0; i < n; i++) { if (InPut.length == Dictionary[i].length + 1) { count = 0; for (j = 0, k = 0; Dictionary[i].ch[j] != '\0'; j++, k++) { if (Dictionary[i].ch[j] != InPut.ch[k]) { count++; j--; } if (count >= 2) break; } if (count <= 1) printf(" %s", Dictionary[i].ch); } if (InPut.length == Dictionary[i].length - 1) { count = 0; for (j = 0, k = 0; InPut.ch[k] != '\0'; j++, k++) { if (Dictionary[i].ch[j] != InPut.ch[k]) { count++; k--; } if (count >= 2) break; } if (count <= 1) printf(" %s", Dictionary[i].ch); } if (InPut.length == Dictionary[i].length) { count = 0; for (j = 0, k = 0; Dictionary[i].ch[j] != '\0'; j++, k++) { if (Dictionary[i].ch[j] != InPut.ch[k]) count++; if (count >= 2) break; } if (count <= 1) printf(" %s", Dictionary[i].ch); } } printf("\n"); } } int main() { while (scanf("%s", Dictionary[n].ch) != EOF) { if (Dictionary[n].ch[0] == '#') break; Dictionary[n].length = strlen(Dictionary[n].ch); n++; } while (scanf("%s", InPut.ch) != EOF) { if (InPut.ch[0] == '#') break; InPut.length = strlen(InPut.ch); InitList(InPut); } return 0; } 描述上述代码的ADT设计
时间: 2023-10-23 21:11:55 浏览: 79
该代码没有设计特定的 ADT(抽象数据类型),而是实现了一个简单的单词纠错程序。该程序的功能是:
1. 读取一个单词列表(由用户输入),保存在一个 List 数组中。
2. 读取一个用户输入的单词,查找该单词是否在单词列表中出现过。
3. 如果该单词在列表中出现过,则输出 "单词是正确的" 的提示信息。
4. 如果该单词在列表中未出现,则输出 "单词:" 和一些相关的单词列表,这些列表包括:
- 长度比该单词多 1 个字符的单词列表;
- 长度比该单词少 1 个字符的单词列表;
- 长度与该单词相同的单词列表。
5. 每个列表中的单词都与该单词最多只有一个字符不同,且仅输出这些满足条件的单词。
该程序的 List 结构体包含两个成员变量:一个 char 数组 ch,用于存储单词;一个 int 变量 length,用于存储单词的长度。InitList 函数是程序的主要部分,用于初始化单词列表和输出单词纠错的结果。该函数的输入参数是一个 List 类型的变量 InPut,表示用户输入的单词。函数首先遍历单词列表,查找该单词是否在列表中出现过。如果出现过,则输出 "单词是正确的" 的提示信息;否则,输出相关的单词列表。输出列表的方法是,分别遍历单词列表中的每个单词,分类讨论它们与用户输入的单词的长度关系,并分别计算它们与用户输入的单词的差别程度。若差别程度不超过 1,则将这些单词输出到结果中。最后,将结果输出到屏幕上。
相关问题
解释代码:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:4996) #ifdef _WIN32 #define strcasecmp _stricmp #endif // 词典节点结构 typedef struct TreeNode { char word[50]; char translation[100]; int height; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 获取节点的高度 int getHeight(TreeNode* node) { if (node == NULL) return 0; return node->height; } // 获取两个数中的较大值 int max(int a, int b) { return (a > b) ? a : b; }
这是一段 C 语言代码,包含了头文件的引用和一些宏定义。其中:
- `#include` 语句用于引入标准库和一些系统头文件;
- `#define` 语句用于定义宏,例如 `_CRT_SECURE_NO_WARNINGS` 和 `#pragma warning(disable:4996)`,用于禁用某些编译器的警告信息;
- `#ifdef` 和 `#endif` 语句用于条件编译,当 `_WIN32` 宏被定义时,将 `strcasecmp` 宏定义为 `_stricmp`。
接下来是一个结构体类型 `TreeNode`,用于定义词典的节点结构,包含单词、翻译、高度和左右子节点。
然后是两个函数:
- `getHeight` 函数用于获取节点的高度,如果节点为空则返回 0;
- `max` 函数用于获取两个数中的较大值,用于 AVL 树的平衡操作。
修改以下代码,并解释改正的原因:#define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include <stdio.h> #include <stdlib.h> #include <mysql.h> #include <string.h> #define N 3 MYSQL* conn; MYSQL m; void initialize() { // 初始化链接 conn = mysql_init(NULL); mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk"); // 连接数据库 if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) { printf("连接数据库失败: %s\n", mysql_error(conn)); exit(1); } else printf("数据库连接成功!\n"); } //录入学生信息 void Insert(MYSQL* mysql) { int i = 0; char* str1 = "insert into student(id,name,chengji) values("; char sql_insert[200]; for (i = 1; i <= N; i++) { char id[12], name[9]; char chengji=0; printf("请输入学生学号:"); gets_s(id, 12); printf("请输入学生姓名:"); gets_s(name, 9); printf("请输入学生成绩:"); gets_s(chengji, 9); int n = getchar(); sprintf(sql_insert," %s'%s', %5s", str1, id, name, chengji); mysql_query(mysql, sql_insert); printf("录入信息成功!\n"); } return; } // 显示学生信息 void Display(MYSQL* mysql) { char* str = "select from student"; MYSQL_RES* res; //一个结果集结构体 MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息) char id[12], name[9]; char chengji; //向HySQL发送SQL语句 mysql_query(mysql, str); //获取结果集 res = mysql_store_result(mysql); //打印 printf("id\t name\t chengji\t"); while (row = mysql_fetch_row(res)) { for (int i = 0; i < mysql_num_fields(res); i++) { switch (i) { case 0: { strcpy(id, row[i]); break; } case 1: { strcpy(name, row[i]); break; } case 2: { strcpy(chengji, row[i]); break; } break; } } } printf("10s\t, %11s\t,%4s\n", id, name,chengji); nysql_free_result(res); } void finalize(){ // 关闭连接 mysql_close(conn); printf("已关闭数据库"); } int main() { initialize(); insert(); finalize(); return 0; }
下面是修改后的代码,同时也会解释改正的原因:
```c
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#include <string.h>
#define N 3
MYSQL* conn;
MYSQL m;
void initialize() {
// 初始化链接
conn = mysql_init(NULL);
mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk");
// 连接数据库
if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) {
printf("连接数据库失败: %s\n", mysql_error(conn));
exit(1);
}
else printf("数据库连接成功!\n");
}
//录入学生信息
void Insert(MYSQL* mysql) {
int i = 0;
char* str1 = "insert into student(id,name,chengji) values(";
char sql_insert[200];
for (i = 1; i <= N; i++) {
char id[12], name[9];
char chengji[9];
printf("请输入学生学号:");
fgets(id, 12, stdin);
printf("请输入学生姓名:");
fgets(name, 9, stdin);
printf("请输入学生成绩:");
fgets(chengji, 9, stdin);
int n = getchar();
sprintf(sql_insert, " %s'%s', '%s', '%s')", str1, id, name, chengji);
mysql_query(mysql, sql_insert);
printf("录入信息成功!\n");
}
return;
}
// 显示学生信息
void Display(MYSQL* mysql) {
char* str = "select * from student";
MYSQL_RES* res; //一个结果集结构体
MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息)
char id[12], name[9];
char chengji[9];
//向MySQL发送SQL语句
mysql_query(mysql, str);
//获取结果集
res = mysql_store_result(mysql);
//打印
printf("id\t name\t chengji\t\n");
while (row = mysql_fetch_row(res)) {
for (int i = 0; i < mysql_num_fields(res); i++) {
switch (i) {
case 0: {
strcpy(id, row[i]);
break;
}
case 1: {
strcpy(name, row[i]);
break;
}
case 2: {
strcpy(chengji, row[i]);
break;
}
}
}
printf("%s\t %s\t %s\t\n", id, name, chengji);
}
mysql_free_result(res);
}
void finalize() {
// 关闭连接
mysql_close(conn);
printf("已关闭数据库");
}
int main() {
initialize();
Insert(conn);
Display(conn);
finalize();
return 0;
}
```
改正的原因如下:
1. `MYSQL* conn; MYSQL m;` 这一行代码中,`MYSQL m;`是不需要的,因为我们只需要一个`MYSQL*`类型的指针即可。
2. `mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk");` 中的`&m`应该改为`conn`,因为我们要设置的是`conn`这个MySQL连接的属性,而不是`m`这个无用的变量。
3. `gets_s`函数不是标准C函数,且存在安全问题,所以应该使用更安全的`fgets`函数。同时,`chengji`应该是一个字符串类型,而不是字符类型。
4. `mysql_query`函数执行的SQL语句中,缺少了一个右括号`)`,导致语法错误。
5. `Display`函数中的SQL语句缺少了`*`,导致无法获取到所有的学生信息。
6. `Display`函数中打印学生信息的语句格式不正确,应该为`"%s\t %s\t %s\t\n"`。
7. `mysql_free_result`函数的名称拼写错误,应该为`mysql_free_result`。
阅读全文