经过几个星期的努力,通过对c语言的学习,终于将课程设计完成。这中间也少不了前辈和百度的指导
写课程设计初,我当然也是一筹莫展,没有一丢丢思路。但是嘞,我经过看前辈写的代码和百度,知道了大概的思路于是开始了我的课程设计
首先我先是由简入蘩,先把牌面写出来了(23333,难得实在麻烦,还有个爱心呦),首先要把每一项功能构思好,到后来再补充。基本的主线思路要有。
这个应该是最简单的过程了不多说 开始下一项
目录出来了,下面把选择写出来
简单的选择功能,当你输入的数不在菜单内是将会提示出错,用do while 进行,然后主体就是switch-case 将选择程序写了出来,这样就有了一个顺序,于是我开始一个一个功能向下进行。
接下来我将最重要的结构体打了出来,由于我写的是学生信息管理系统,因此也就没有什么求平均分了,但是排序还是要考察的,结构体中应注意这些字符串当信息进行传递时用的是=还是strcpy,向其中传入信息又应该怎么传,这个就不用多说了
接下来就是建立动态链表,我基本是根据书的内容,进行改动,搬过来的(首先还是要理解的),书上的方法也是构建动态链表的基本套路。先建立一个空间来存储信息,让开辟的空间等于你需要的空间,然后将表头带着其后的数据输入。在结束时应输入0.当然这里面也有许多可以节省的方法比如在输入信息时,完全可以再构建一个函数,因为在还未出现的各种功能中,大多数需要输入信息,我这个也是我的初代版本,有很多地方可以简化。通过malloc创建一个空间,比较基础的构建链表的方式。
通过这个函数已经足够将信息输入了。
下面的操作修改学生信息 首先按照学号查找信息,链表是一串信息,我通过查找表头即可获得接下来的一系列信息。
删除 先通过表头查询相应的数据,通过free函数释放空间
刚开始在写查找程序的时候,无意中把内容会删掉。后来虽然是试出来的哪里错了
但是也发现了不足。通过调出表头,将后面的内容调出
简书写完总感觉少了什么,才发现排序这个过程居然忘打上去了,。
我用的排序方法思路比较清楚,先将第一个当做最小的,然后通过for循环的嵌套进行比较和更换注意字符串的copy不是=。可以说这个方法是简单粗暴。
增添,我这个与1过程相似,基本是相同的思路。
存于文件,fwrite为二进制存取 在记事本中会出现乱码的情况,可通过使用fprinft。
里面有一个过程是比较常见的了 for循环 从表头开始将后面的内容存入文件
这个功能是后来补加的找学长验课程设计的时候,学长给出的一些建议,将内容存于文件的目的就是为了读取,因此后来将这个功能也是补了出来
void duqu(struct student *head)
{
struct student *pt,*p1;
FILE *fp;
head=NULL;
p1=pt=(struct student*)malloc(sizeof(struct student));
if((fp=fopen("C:\\informatin.txt","rb"))==NULL)
{
printf("打开文件失败\n");
return;
}
while(!feof(fp))
{
if(fread(pt,sizeof(struct student),1,fp)!=1)
{
free(pt);
break;
}
else
{
printf("\t学号为:%d\n",p1->num );
printf("\t姓名为:%s\n",p1->name );
printf("专业:%s\n",p1->specialty);
printf("生日: %d\n",p1->birthday);
printf("住址: %s\n",p1->address);
printf("成绩: %d\n",p1->score);
}
if(head==NULL)
{
head=pt;
}
else{
p1->next=pt;
}
p1=pt;
pt=(struct student*)malloc(sizeof(struct student));
}
pt=NULL;
free(pt);
fclose(fp);
}
课程设计中的一些问题
一.出现 error:conflicting types for XXX
原因一:
原来是因为没有先做函数声明,而函数位于main()之后。
在main函数前声明了函数原型后,一切ok.
原因二:
头文件的被循环引用,在引用时考虑清楚包含顺序
原因三:
头文件声明和定义参数稍有不同
最终我将结构体至之前的目录 等等全部移到最后 使问题解决
二. 'p1' undeclared (first use in this function)|
“p1”未声明(在这个函数中首次使用)
p1在使用时发现看似相同实际不一样
我通过将首个p1为标准 后面通过复制粘贴替换 使问题解决
关于课程设计中的赋值
三 今天在写课程设计的修改这一环节中出现了error: assignment to expression with array type,出现了这样一种复制错误,原因是因为,在给字符串赋值时使用“=”进行赋值。
于是我总结了字符串赋值的方法
1. 字符串数组不能用"="直接赋值, 即s="Good News!"是不合法的。所以应分
清字符串数组和字符串指针的不同赋值方法。
2. 对于长字符串, Turbo C2.0同意使用下述方法:
比如:
main()
{
char s[100];
strcpy(s, "The writer would like to thank you for"
"your interest in his book. He hopes you"
"can get some helps from the book.");
}
3.指针数组赋值
比如:
main()
{
char *f[2];
int *a[2];
f[0]="thank you"; /*给字符型数组指针变量赋值*/
f[1]="Good Morning";
*a[0]=1, *a[1]=-11; /*给整型数数组指针变量赋值*/
}
4.不管是静态,局部还是全局数组仅仅有在定义时才干初始话,否则必须通过其他方法,比方循环操作实现。
不论什么
int a[3];
static int b[3];
a[3] = {1, 2, 3};
b[3] = {1, 2, 3};
没有在定义时初始化都是错误的!