【实验目的】
1. 理解和掌握线性关系的数据的顺序结构组织;
2. 设计算法。
【实验内容】
一、汉字输入法。
1. 附件程序201中,原程序只能显示1个汉字对应的五笔输入码,修改程序,实现命令行对输入的多个汉字,显示它们的五笔输入码。
2. 把一个由汉字组成的文本文件,转换成对应的五笔输入码,存在另一个文件中。
3. 输入汉字的五笔输入码,输出对应的汉字。
二、用顺序存储结构(动态数组)存储超长整数,实现加法和减法运算。
1.附件程序202中,已经提供程序的基本框架,请按要求完善各个函数,写出函数代码,加上必要的注释。
2.画出加法、减法函数的算法流程图。
3.写出测试用例,包括输入的数据、预期的结果、实际的结果、结果分析。设计尽量严密的用例,覆盖所有情况。
【实验要求】
1.按【实验内容】要求编程,加上必要的注释。写出测试用例,包括输入的数据、预期的结果、实际的结果、结果分析。设计尽量严密的用例,覆盖所有情况。附上程序运行结果的截图。(在【实验结果】中体现)
2.回答问题:(在【回答问题】中体现)
(1)数据结构包括什么内容?
(2)顺序存储方式的优点、缺点?
(3)分析程序202中加法、减法算法的时间复杂度和空间复杂度。
3.能否实现各项实验目标?实验过程碰到什么问题?怎么解决?实验的完成,有什么收获?(重要!在【总结反思】中体现)
【实验结果】
第一大问(汉字输入法)
1、多汉字转换五笔输入法
1.1程序部分:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
// 如果命令行参数个数小于 2
if (argc < 2) {
printf("错误:未提供输入!\n");
exit(1);
}
FILE* fp = fopen("WB.IMD", "rb");
// 如果打开文件失败
if (fp == NULL) {
printf("错误:无法打开文件 WB.IMD\n");
exit(1);
}
for (int j = 1; j < argc; j++) {
char* input = argv[j];
while (*input!= '\0') {
unsigned char ch = *input;
// 获取下一个字符的无符号字符表示
unsigned char nextCh = *(input + 1);
unsigned char ch1 = 0, ch2 = 0;
// 如果当前字符是有效的中文字符
if (ch >= 0xa0) {
ch1 = ch - 0xa0;
if (nextCh >= 0xa0) {
ch2 = nextCh - 0xa0;
input++;
}
}
if (ch1!= 0 && ch2!= 0) {
// 输出信息
printf("对于字符 '%c%c':\n", ch, nextCh);
printf("ch1=%d, ch2=%d\n", ch1, ch2);
printf("该汉字的五笔输入码为:");
int i = (ch1 - 16) * 94 + ch2 - 1;
// 将文件指针移动到指定位置
fseek(fp, 128 + i * 4, SEEK_SET);
// 循环读取并输出四个字符
for (int k = 0; k < 4; k++) {
printf("%c", fgetc(fp));
}
printf("\n");
}
else if (ch1!= 0) {
// 输出信息
printf("对于字符 '%c':\n", ch);
printf("ch1=%d, ch2=0\n", ch1);
int i = (ch1 - 16) * 94;
// 将文件指针移动到指定位置
fseek(fp, 128 + i * 4, SEEK_SET);
// 循环读取并输出四个字符
for (int k = 0; k < 4; k++) {
printf("%c", fgetc(fp));
}
printf("\n");
}
// 如果不是中文字符
else {
// 输出信息
printf("字符 '%c'不是中文字符。\n", ch);
}
// 将输入指针指向下一个字符
input++;
}
}
// 关闭文件
fclose(fp);
return 0;
}