沈阳航空航天大学
课 程 设 计 报 告
课程设计名称:C语言课程设计
课程设计题目:通用排序程序的设计与实现
院(系):计算机学院
专 业:计算机科学与技术
班 级:1434010105
学 号:143401010516
姓 名:徐建磊
指导教师:
完成日期: 2015年7月2日
目 录
第1章 概要设计... 1
1.1题目的内容与要求 1
1.2总体结构 1
第2章 详细设计... 3
2.1选择模块 3
2.2输入模块 4
2.3文件写入模块 4
2.4排序模块 5
2.5输出模块 7
第3章 调试分析... 8
第4章 使用说明与执行结果... 9
参考文献... 10
附 录(程序清单)... 11
总 结........................................................................................................................... 15
第1章 概要设计
1.1题目的内容与要求
课程设计的内容是设计一个通用的排序程序,这个程序可以对任意类型的数值常数或者字符串构成的行进行排序,此程序需要通过人机对话选择程序是按照数值进行排序还是按照字符顺序进行排序,排序针对文本文件进行的。
要求:
(1)程序的算法思路必须清晰,同时需要用自然语言与流程图对算法进行描述。
(2)程序需要将用户输入的一串数字或者字符存入文本文件中。
(3)程序需要根据用户选择的不同排序方式进行排序,并将排序的结果保存到同一个文件中。
(4)源程序需要写有一定的注释。
(5)按照要求写课程设计报告。
1.2总体结构
本程序主要分为五个模块:选择模块,输入模块,排序模块,文件写入模块,输出模块。功能模块图如图1.1所示。
图1.1 功能模块图
选择模块:输入数字选择退出程序或者进入程序,进入程序后输入数字选择数值排序或者字符排序。
输入模块:根据选择得排序方式输入数字或者字符。
排序模块:程序根据用户的选择利用不同的函数对用户输入的数值或者字符进行排序。
文件写入模块:程序将用户输入的内容与排序后的内容写入文件,并保存。
输出模块:将排序后的数值或者字符输出。
第2章 详细设计
2.1选择模块
控制整个程序的运行,通过主函数模块分别调用各个模块,实现各项功能,流程如图2.1所示。
图2.1 选择模块流程图
注释:
1.先定义整型变量flag=0,type。
2.无限循环进行,打印主菜单,输入falg值,判断,用户选择退出时,程序结束,用户选择继续时进入选择排序模式选择。
3.提示用户输入数值,选择排序模式,用户输入1时,为数值排序,用户输入2时为字符排序,用户输入其他时,提示用户输入错误。
2.2输入模块
用户根据自己选择的排序方式输入数值或者字符,程序接收用户的输入存入整型数组或者字符型数组中,并利用函数对数组中元素进行排序,流程如图2.2所示。
图2.2 输入模块流程图
注释:
- 定义一个整型变量x与字符变量s。
- 数值排序模式时输入x,字符排序模式时输入s。
- 数值排序时判断x是否为-1,字符排序模式时判断s是否为#。
- 否定时,将x存入整型数组dig,或者将s存入字符型数组str。
- 肯定时,进入文件写入模块。
2.3文件写入模块
用户选择的是数值排序模式时,程序先打开文本文件,如果失败则退出,如果成功,则依次从整型数组中取出有效数值并以追加方式写入指定的文件中,写入完毕后进入排序模块。用户选择的是字符排序模式是,程序先打开文本文件,如果失败则退出,如果成功,则依次从字符型数组中取出有效的字符,并以追加方式写入指定的文件中,写入完毕后进入排序模块。流程图如图2.3所示。
图2.3 文件写入模块流程图
注释:
1. 宏定义文件名filename。
2. 以追加模式打开文件时,如果文件不存在,程序会自己创建一个文本文件。
3. 写入文件时使用的库函数是相同的,在数值排序模式时,写入文件的元素是整型的,在字符排序模式时,写入文件的元素是字符型的。
4. 在将数组中的元素写入文件时,程序并不会将数组中的元素值或者顺序改变。
2.4排序模块
程序根据用户选择的排序模式利用不同的排序函数对整型数组或者字符型数组中的元素进行排序。具体的排序过程为:利用两层循环从数组中的第一个有效元素到最后一个有效元素为止,分别比较相邻两个元素的大小,如果后面的元素小于前面的元素,利用临时变量temp交换两个元素的值,否则不交换。流程图如图2.4所示。
图2.4 排序模块流程图
注释:
1. 定义临时变量用于temp用于交换两个数组元素的值。
2. 定义i与j用于控制数组元素的移动。
3. 此模块运行后再次进入文件写入模块,将排序完成的数组写入同一个文件中,然后再进入输出模块,将排序完成的数组输出。
2.5输出模块
输出最简单,利用循环将数组中有效的元素依次输出。流程图如图2.5所示。
图2.5 输出模块流程图
注释:
1.定义n,n的值为数组中有效元素的个数,i用于控制元素的位置。
2.利用循环输出数组中排序后的有效元素。
3.判断i是否小于n,即判断此元素是否为有效元素。
4. 当元素为有效元素时,输出。
5. 当元素无效时,退出循环,进入选择模块。
第3章 调试分析
问题1.自己对于文件操作不会。
解决办法:从书中和网上查找解决办法,最后找到的是可以对文件进行写入的函数fprintf ( )。
问题2.文件操作出现错误,之前写入的信息,再一次写入后,之前的信息消失了。
解决办法:从书中和网上查找解决办法,最后找到的是对于文件的写入方式出现错误,原来使用的是“w”即写入模式,后来改为“a”即追加模式就正确了。
问题3.在测试过程中,选择字符比较模式,输入字符后,输出结果的前面总是会有空白,后来发现scanf ( ) 将字符中的空格也作为一个字符。
解决办法:添加提示信息,当用户选择字符比较模式,提示输入字符时不要在字符间输入空格。
第4章 使用说明与执行结果
运行操作及结果:
主菜单如图4.1。
图4.1
输入1选择按数值大小排序如图4.2。
图4.2
输入2选择按字符大小排序如图4.3。
图4.3
输入数字不符合要求如图4.4。
图4.4
参考文献
[1] 张长海. C语言程设计[M] . 北京:高等教育出版社,2006
[2] 谭浩强. C程序设计(第四版)[J]. 计算机教育, 2010, No.128(20):113-113.
[3] 谭浩强, 鲍有文, 周海燕. C程序设计试题汇编[M]. 清华大学出版社, 2012.
[4] 霍尔顿, I.), 杨浩. C语言入门经典(第5版)[J]. 中国科技信息, 2014(2):44-44.
[5] 张凯. VC++程序设计[M]. 大连理工大学出版社, 2002.
[6] 明日科技. C语言从入门到精通(第2版)[M]. 清华大学出版社, 2012.
附 录(程序清单)
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
char filename[] = "XJL.txt";//文件名字
void sortdig(int* a, int max)//数值排序函数
{
int temp;
for (int i = 0; i<max; i++)
for (int j = i + 1; j<max; j++)
{
if (a[j] < a[i])//由小到大
{
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
void sortchar(char a[], int max)//字符排序函数
{
int temp;
for (int i = 0; i<max; i++)
for (int j = i + 1; j<max; j++)
{
if (a[j] < a[i])//由小到大
{
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
void filewritechar(char str[],int n, char filename[])
{ //将数组写入文件函数
FILE *pfile1 = fopen(filename, "a");//追加形式打开文件
if (pfile1 == NULL)
{
printf("不能打开文件");
return;
}
for (int i = n-1; i >= 0; i--)
{ fprintf(pfile1, "%c\n", str[i]); }//写入文件中
fclose(pfile1);//关闭文件,保存
}
void filewritedig(int dig[],int n, char filename[])
{ //将字符写入文件函数
FILE *pfile1 = fopen(filename, "a");//追加形式打开文件
if (pfile1 == NULL)
{
printf("不能打开文件");
return;
}
for (int i = n - 1; i >= 0; i--)
{ fprintf(pfile1, "%d\n", dig[i]); }//写入文件中
fclose(pfile1);//关闭文件,保存
}
void main()
{
char s, str[50];//字符型数组
int type, n = 0, dig[50], flag=1, i, j, x;//排序类型,数组元素的总数,整型数组
printf("\n请选择:0 退出 1或其他数字 继续\n");
scanf_s("%d", &flag);
while (flag)
{
printf("通用排序,请选择排序类型:1.按数值大小 2.按字符串大小\n");
scanf_s("%d", &type);
if (type == 1)//数值排序
{
printf("请输入100个个数以内的整数,以空格隔开,以-1结束\n");
scanf_s("%d", &x);
while (x != -1)
{
dig[n] = x;
scanf_s("%d", &x);
n++;
}
printf("输入完成,进行排序\n");
filewritedig(dig, n, filename);//利用函数将数组写入文件
sortdig(dig, n); //利用排序函数进行排序
filewritedig(dig, n, filename);//利用函数将数组写入文件
printf("从小到大的排序结果如下:\n");
for (i = 0; i < n; i++)
{ printf("%d ", dig[i]); }
}
else if (type == 2)//字符排序
{
printf("请输入100个个数以内的字符串,字符之间不要有空格,以#结束\n");
scanf_s("%c", &s);
while (s != '#')
{
str[n] = s;
scanf_s("%c", &s);
n++;
}
printf("输入完成,进行排序...\n");
filewritechar(str, n, filename);//将初始数组写入文件中
sortchar(str, n); //利用排序函数进行排序
filewritechar(str, n, filename);//将初始数组写入文件中
printf("从大到小的排序结果如下:\n");
for (i = 0; i < n; i++)
{ printf("%c ", str[i]); }
}
else
{ printf("选择错误!"); }
printf("\n请选择:0 退出 1 继续\n");
scanf_s("%d", &flag);
}
}
课程设计总结: 在拿到课程设计的题目后刚开始准备入手时,觉得有些盲目和无助,也许这就是“万事开头难”吧。忙碌了很长时间也是一无所获,后来经过静心思考,确定了程序的整体框架,然后再从细节着手,逐渐完善程序,直到达到题目中的要求,感觉也还不错。 在完成课程设计的过程中我发现自己在很多方面都有漏洞,尤其是对于文件的操作不是很熟悉。但是我经过自己处理问题时从网上查找解决方法的过程中,我也学到了不少的知识,也巩固了之前所学的知识,同时我也意识到书本上的理论知识是不足以解决实际问题的。只有实践才能将理论运用,同时也可以查找自己在理论知识方面的不足。 总之编程需要不断地在实践中积累经验,不断改进。 |
|
指导教师评语:
指导教师(签字): 年 月 日
|
|
课程设计成绩 |
|