1设计目的
1.通过本项课程设计,可以培养独立思考、 综合运用所学有关相应知识的能力,能更好的巩固《C语言程序设计》课程学习的内容,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!
2. 通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。
2基础题
2.1题目
从键盘上输入字符数组,并对数组中的元素进行排序。
2.2解题思路
通过定义一个字符数组a[]来存放字符变量,通过使用符号常量来规定字符的长度,即定义一个全局变量N,利用N对字符数组的长度进行定义。然后使用for循环来读入字符常量。
起泡就是冒泡排序依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
利用起泡法对字符数组中的各个字符常量来进行排序,起泡法是从一端开始比较的,第一次循环就是把最大数放到最后一个位置,第二次循环就是把第二最大数放到倒数第二位置。整个过程就像烧开水一样,较小值像水中的气泡一样逐趟往上冒,每一趟都有一块“最大”的石头沉到水底。如此循环实现数据的排序。其中起泡法用两个for循环来完成,即for循环的嵌套,最后继续使用for循环对排好的字符数组元素输出。
2.3流程图
基础流程图如图2.1所示:
图2.1 基础题流程图
2.4源程序
#include<stdio.h>
#include<string.h>
#define N 100 //定义全局变量
int main()
{
int i,j,n;
char t,a[N+1]; //定义字符数组
printf("请输入数组长度:");
scanf("%d",&n); //确定字符数组长度
printf("请输入字符:\n");
for(i=0;i<n+1;i++) //输入字符
scanf("%c",&a[i]);
printf("\n");
for(j=0;j<n;j++) //使用起泡法进行排序
{
for(i=0;i<n-j;i++)
if(a[i]>a[i+1]) //通过ASCII码比较
{
t=a[i]; //交换顺序
a[i]=a[i+1];
a[i+1]=t;
}
}
printf("正确顺序是:\n");
for(i=0;i<n+1;i++) //输出正确顺序
printf("%3c",a[i]);
printf("\n");
return 0;
}
2.5运行结果
基础题运行结果如图2.2(a)2.2(b)所示:
图2.2(a) 基础题运行结果图
图2.2(b) 基础题运行结果图
2.6设计困难
在设计过程中,遇到了数组的长度定义,刚开始定义数组为a[n],但是在编译的时候系统显示出现错误,后来通过查找资料和询问同学,知道了数组的定义中数组的长度应该为静态的,也就是说定义数组时括号内长度应该为常量,不能为变量,否则系统会报错。通过使用全局变量来定义数组的长度解决了这个问题。
3改错题
3.1题目
#include <stdio.h>
#include <conio.h>
void fun(int a, b)
{
int t;
t = b; b = a ; a = t;
}
main( )
{
int a, b;
clrscr( );
printf("Enter a,b :"); scanf("%d%d", &a, &b);
fun(&a, &b);
printf("a=%d b=%d\n", a, b);
}
3.2错误分析
首先,通过观察这个程序,此程序的功能是将输入的两个整数a、b调换位置后输出a、b,起一个换位作用。在程序中,错误有:
1.在fun函数中,b没有定义,应该把b定义为int。
2.在主函数中,清屏(clrscr)没有意义,应该删除。
3.fun传过去的是a、b的地址,所以在fun函数中接收的应该是地址,所以使用整型变量接收不了,只能使用指针来进行接收,应该定义为int *a,int *b,而t也为*t.最后使用指针对位置进行改变。
3.3流程图
改错题流程图如图3.1(a)3.1(b)所示:
图3.1(a) 改错题主流程图 图3.1(b) 改错题fun函数流程图
3.4改正的源程序
#include <stdio.h> //删除清屏函数
void fun(int *a,int *b) //定义b的类型
{
int *t;
t = *b; //使用指针,改变其位置
*b = *a ;
*a = t;
}
main( )
{
int a, b;
printf("Enter a,b :");
scanf("%d%d", &a, &b);
fun(&a, &b); //使用函数将a,b地址传送到过程函数
printf("a=%d b=%d\n", a, b);
}
3.5运行结果
改错题运行结果如图3.2所示:
图3.2 改错题运行结果图
4综合题
4.1题目
设计课题六:通讯录管理系统
1.问题描述:
通过该系统实现对通讯录信息进行录入、显示、修改、删除、插入、排序、保存等操作的管理。
2.功能要求:
1.本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:编号、姓名、电话号码、地址。
本系统显示这样的菜单:
请选择系统功能项:
g. 通讯信息录入
h. 通讯信息显示
i. 通讯信息保存
j. 通讯信息删除
k. 通讯信息修改
l. 通讯信息查询
(1) 按编号查询
(2) 按姓名查询
(3) 按电话号码查询
g. 退出系统
4.2解题分析
修改和查询要进行循环和比对,所以要使用while语句进行循环。在修改程序中,首先需要定义一个字符数组来存放需要修改的信息,但在修改之前应该先要找到其内容,因此,通信录中信息的修改和查询其实是相互联系在一起的。输入完信息后,需要借用while语句来在结构体中进行查找,如果输入的信息在数据库中不存在,使用if语句进行输出“通讯录中没有此人!”并返回。如果存在,则通过scanf函数将信息修改并保存。
查询函数与修改函数十分相似,可以说是查询函数是修改函数的基础。查询函数也是通过借助while语句进行的,当查到之后,使用printf函数将其相关的数据进行输出,然后返回主函数。
4.3流程图
修改函数流程图: 查询函数的流程图:
图4.1 综合题修改程序流程图 图4.2 综合题查询程序流程图
4.4源程序
#include<stdio.h> //头文件
#include<stdlib.h>
#include<string.h>
typedef struct //定义结构体
{
char score[10];
char name[20];
char num[15];
char adds[20];
}Person;
Person pe[20];
void main()
{
system("color 0A");
int menu(); //定义系列功能函数
int Input(Person per[],int n);
void Display(Person per[],int n);
void WritetoText(Person per[],int n);
int Delete_a_record(Person per[],int n);
void Change(Person per[],int n);
void Query_a_record(Person per[],int n);
int n=0;
printf("\n\n\n\t\t\t 欢迎进入通讯录管理系统\n\n"); //登录界面
printf("\n\t\t\t 版本号:1.0\n\n");
printf("\n\n\n\n\n\t\t\t 20##年7月12日\n\n");
printf("\n\t\t\t程序设计者:****\n");
printf("\n\t\t\t 控1201班和控1203班\n");
for(;;)
{
switch(menu())
{
case 1:
printf("\n\t添加记录到通讯录\n");
n=Input(pe,n);
break;
case 2:
printf("\n\t\t\t 通讯录记录表\n");
Display(pe,n);
break;
case 3:
printf("\n\t保存功能\n");
WritetoText(pe,n);
printf("\t");
break;
case 4:
printf("\n\t从通讯录中删除记录\n");
n=Delete_a_record(pe,n);
printf("\t");
break;
case 5:
printf("\n\t修改通讯录中的记录\n");
Change(pe,n);
printf("\t");
break;
case 6:
printf("\n\t在通讯录中查找记录\n");
Query_a_record(pe,n);
printf("\t");
break;
case 0:
printf("\n\t\t谢谢使用,再见!\n");
printf("\n\t\t");
system("pause");
exit(0); //退出程序
}
}
}
int menu() //菜单函数
{ char c;
system("pause"); //暂停函数,输出按任意键
do
{
system("cls"); //清楚屏幕
printf("\n\t**********************************************************\n");
printf("\n\t***** ^_^ 通讯录管理系统 ^_^ *****\n");
printf("\n\t@~~~~~~~~~~~~~~~~~~~^_^~~~~~~~^_^~~~~~~~~~~~~~~~~~~~@\n");
printf("\t******* + 1. 添加记录 + *******\n");
printf("\t****** + ^_^ ^_^ + ******\n");
printf("\t***** + 欢 2. 显示记录 迎 + *****\n");
printf("\t**** + + ****\n");
printf("\t*** + 3. 保存记录 + ***\n");
printf("\t** + + **\n");
printf("\t* + 4. 删除记录 ^_^ + *\n");
printf("\t* + ^_^ + *\n");
printf("\t** + 光 5. 修改记录 临 + **\n"); printf("\t*** + + ***\n");
printf("\t**** + 6. 查询记录 ^_^ + ****\n");
printf("\t***** + ^_^ + *****\n"); printf("\t****** + 0. 退出程序 + ******\n");
printf("\n\t**********************************************************\n");
printf("\t\t请您选择(0-6):");
c=getchar ();
}
while(c<'0'||c>'6');
return(c-'0');
}
int Input(Person per[],int n) //录入函数
{
int i=0;
char ch;
while(ch!='n'&&ch!='N')
{
printf("\t编号:");
scanf("\t%s",per[n+i].score);
printf("\t姓名:");
scanf("\t%s",per[n+i].name);
printf("\t电话号码:");
scanf("\t%s",per[n+i].num);
printf("\t地址:");
scanf("\t%s",per[n+i].adds);
printf("\n\t是否继续添加?(Y/N)");
scanf("\t%c",&ch);
i++;
}
return(n+i);
}
void Display(Person per[],int n) //显示通讯录的函数
{
int i;
printf("@--------------------------------------------------------------@\n");
printf(" 编号 姓名 电话号码 地址 \n");
printf("@--------------------------------------------------------------@\n");
for(i=1;i<n+1;i++)
{
printf(" %-5s %-10s%-13s%-15s\n",per[i-1].score,per[i-1].name,per[i-1].num,per[i-1].adds);
if(i>1&&i%10==0)
{
printf("\t-----------------------------------\n");
printf("\t");
system("pause");
printf("\t-----------------------------------\n");
}
}
printf("@--------------------------------------------------------------@\n");
}
void WritetoText(Person per[],int n) //保存函数
{
int i=0;
FILE *fp;
char filename[20];
printf("\t保存到文件\n");
printf("\t请输入所保存的文件名:");
scanf("\t%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("\t无法打开文件\n");
system("pause");
return;
}
fprintf(fp,"******************************************通讯录******************************************\n");
fprintf(fp,"编号 姓名 电话号码 地址 \n");
fprintf(fp,"------------------------------------------------------------------------------------------\n");
while(i<n)
{
fprintf(fp,"%-3s\t%-6s\t%-13s\t%-20s\t\n",per[i].score,per[i].name,per[i].num,per[i].adds);
i++;
}
fprintf(fp,"------------------------------------------------------------------------------------------\n");
fprintf(fp,"***************************************共有%d条记录****************************************\n",n);
fclose(fp);
printf("保存成功!\n");
}
int Delete_a_record(Person per[],int n) //删除函数
{
char s[20];
int i=0,j;
printf("\t请输入想删除记录中的名字:");
scanf("%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return(n);
}
for(j=i;j<n-1;j++)
{ strcpy(per[j].score,per[j+1].score);
strcpy(per[j].num,per[j+1].num);
strcpy(per[j].name,per[j+1].name);
strcpy(per[j].adds,per[j+1].adds);
}
printf("\t\t\t已经成功删除!\n");
return(n-1);
}
void Change(Person per[],int n) //修改通讯录函数
{
char s[20]; //定义字符数组s
int i=0;
printf("\t请输入想修改的记录中的名字:");
scanf("%s",s); //输入查询的名字
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n) //判断记录中是否有此信息
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t编号:");
scanf("\t%s",per[i].score); //修改编号
printf("\t姓名:");
scanf("\t%s",per[i].name); //修改姓名
printf("\t电话号码:");
scanf("\t%s",per[i].num); //修改电话号码
printf("\t通讯住址:");
scanf("\t%s",per[i].adds); //修改住址
printf("\t修改成功!");
}
void Query_a_record(Person per[],int n) //查询函数
{
int m;
printf("\t\n请选择查询方式:\n");
printf("\t┌----------------┐\n");
printf("\t│1------编号 │\n");
printf("\t│2------姓名 │\n");
printf("\t│3------电话号码 │\n");
printf("\t│4------返回 │\n");
printf("\t└----------------┘\n");
printf("请选择:");//
scanf("%d",&m); //通过四种方式之一查询
while(m!=1&&m!=2&&m!=3&&m!=4) //判断是否正确
{
printf("输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1) //通过编号查询
{
char s[10];
int i=0;
printf("\t请输入想查询的编号:");
scanf("\t%s",s);
while(strcmp(per[i].score,s)!=0&&i<n) i++;
if(i==n) //判断是否有此人
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号: %s\n",per[i].score); //输出此人信息
printf("\t此人姓名: %s\n",per[i].name);
printf("\t电话号码: %s\n",per[i].num);
} ;
if(m==2) //通过姓名查询
{
char s[20];
int i=0;
printf("\t请输入想查询的姓名:");
scanf("\t%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号: %s\n",per[i].score);
printf("\t电话号码: %s\n",per[i].num);
printf("\t通讯地址: %s\n",per[i].adds);
} ;
if(m==3) //通过电话查询
{
char s[15];
int i=0;
printf("\t请输入想查询的电话:");
scanf("\t%s",s);
while(strcmp(per[i].num,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号: %s\n",per[i].score);
printf("\t此人姓名: %s\n",per[i].name);
printf("\t通讯地址: %s\n",per[i].adds);
}
}
4.5运行结果
综合题运行结果如图下图所示:
菜单目录如图4.3所示:
图4.3 综合题运行结果图
添加联系人如图4.4所示:
图4.4综合题运行结果图
查询联系人如图4.5所示:
图4.5 综合题运行结果图
修改联系人如图4.6所示:
图4.6 综合题运行结果图
修改成功如图4.7所示:
图4.7综合题运行结果图
5总结
两周课程设计即将过去,回想学习C语言的过程中,即有快乐又有烦劳。从刚开始的迷茫不知如何下手到最后看到自己的程序按自己的想法运行,心里时不时的有一种喜悦。通过这两周的课程设计,我认识到书上和老师教的内容是有限的,要想掌握更多的知识我们必须多动脑,多思考,不断地靠自己去学习,同时我们还应向他人请教,从而了解更多自己不知道的知识。回头看来,编写这个程序并不像原来想像的那么难,我们要相信自己,无论做什么事,只要我们仔细的思考了,认真的去做了,我们就一定能做好。
通过这两周的编程我发现了自己的一些不足,在编写时经常犯一些低级错误,由于自己的马虎而浪费了不少时间。在不知如何进行的时候有一种不自信,总想别人正在做什么,这些不足既然被发现就得在以后的做事中注意,争取改掉。
经过两周的努力我掌握了一些基本的C语言进行程序设计的技巧,更深的理解和运用结构化程序设计的思想和方法,掌握开发一个小型实用系统的基本方法,同时学会了一些调试一个较长程序的基本方法,提高了书写程序设计开发文档的能力(书写课程设计报告)。这一周的实践让我受益匪浅,在此我要感谢孜孜不倦指导我们的老师,感谢在我困惑时给我帮助的同学,使我们在理论与实践相结合方面又得到了一次很好的锻炼,让我们得到很大的收获。