C程序设计实践_第1页
C程序设计实践_第2页
C程序设计实践_第3页
C程序设计实践_第4页
C程序设计实践_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

提纲目的与意义编程能力的重要性C语言的重要性C程序设计实践的目的几点希望主要知识点回顾用指针处理链表文件操作目的与意义编程能力的重要性工科专业离不开编程电子信息类专业更离不开编程除管理、销售类职位外,所有电子信息类职位都需要具备一定的编程能力所有研究生都需要编程几乎所有大公司的笔试题中,编程都占有一定比重目的与意义C语言的重要性编程语言的典型代表所有流行的编程语言中都有C语言的影子C++、C#、Java、ASP……Verilog、SystemC…电子信息类专业通用编程语言DSP开发算法仿真目的与意义C程序设计实践的目的巩固所学知识深入理解结构体、指针、链表、动态分配内存和文件操作等C程序设计中的中高级技术熟练掌握C语言的调试方法初步培养良好的编程习惯和编程风格初步学习程序文档的撰写方法目的与意义几点希望团队协作;所有同学要付出劳动;互帮互学;杜绝抄袭;尽可能提高代码可读性;规范化的文档;题目实验室物料管理系统航班信息管理系统个人记账系统运动会管理系统完成方式以分组形式完成,每组3人,每组推选组长一名(最好在小班范围内组合)。分组名单请各小班学委在第一周周三前上报,指导老师确认后给各组分配组号。考核方式总评分分为两部分分组答辩:占60%程序检查以各组依次答辩的方式进行,根据每组的整体成绩及每个组员的个人分工与贡献,分别给定每个同学的成绩实验报告:占40%。时间安排第一周的第一天:上课,说明课程设计要求,讲解题目第一周的其余时间:学生调研、进行可行性研究、确定程序的系统框架。第二周:学生根据所选题目开发出一个基本系统,进行调试和测试,并加以完善。其他说明实验场地主楼1121机房,凭学生证免费上机。机房开放时间:课程设计两周中,上午8:30~11:30,下午1:30~4:30。调试环境:VC++2008QQ群:115144918FTP:地址9

端口:21user:cprogram111pswd:bupt111文件夹:cprogram111用指针处理链表

链表是一种常见的重要的数据结构,是动态地进行存储分配的一种结构。链表的组成:头指针:存放一个地址,该地址指向一个元素

结点:用户需要的实际数据和链接节点的指针用指针处理链表

用结构体建立链表:

struct

student{int

num;

float

score;

struct

student*next;};

其中成员num和score用来存放结点中的有用数据(用户需要用到的数据),next是指针类型的成员,它指向structstudent类型数据(这就是next所在的结构体类型)用指针处理链表

简单链表举例

#include<stdio.h>

#defineNULL0

structstudent

{longnum;floatscore;structstudent*next;};

main()

{structstudenta,b,c,*head,*p;

a.num=99101;a.score=89.5;

b.num=99103;b.score=90;

c.num=99107;c.score=85;

head=&a;a.next=&b;b.next=&c;

c.next=NULL;p=head;

do{printf("%ld%5.1f\n",p->num,p->score);

p=p->next;}while(p!=NULL);}用指针处理链表程序分析:开始时使head指向a结点,a.next指向b结点,b.next指向c结点,这就构成链表关系。“c.next=NULL”的作用是使c.next不指向任何有用的存储单元。在输出链表时要借助p,先使p指向a结点,然后输出a结点中的数据,“p=p->next”是为输出下一个结点作准备。p->next的值是b结点的地址,因此执行“p=p->next”后p就指向b结点,所以在下一次循环时输出的是b结点中的数据。用指针处理链表

处理动态链表所需的函数库函数提供动态地开辟和释放存储单元的有关函数:malloc函数其函数原型为void*malloc(unsignedintsize);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的值(即“返回值”)是一个指向分配域起始地址的指针(类型为void)。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。需强制类型转换

用指针处理链表

(2)calloc函数其函数原型为void*calloc(unsignedn,unsignedsize);其作用是在内存的动态存储区中分配n个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size用指针处理链表

(3)free函数其函数原型为voidfree(void*p);其作用是释放由p指向的内存区,使这部分内存区能被其他变量使用。p是最近一次调用malloc或caloc函数时返回的值free函数无返回值.

用指针处理链表

建立动态链表所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相连的关系写一函数建立一个有3名学生数据的单向动态链表.算法如图图11-12用指针处理链表

算法的实现:我们约定学号不会为零,如果输入的学号为0,则表示建立链表的过程完成,该结点不应连接到链表中。如果输入的p1->num不等于0,则输入的是第一个结点数据(n=1),令head=p1,即把p1的值赋给head,也就是使head也指向新开辟的结点p1所指向的新开辟的结点就成为链表中第一个结点用指针处理链表

算法的实现:

再开辟另一个结点并使p1指向它,接着输入该结点的数据.如果输入的p1->num≠0,则应链入第2个结点(n=2),将新结点地址赋给第一个结点的next成员.接着使p2=p1,也就是使p2指向刚才建立的结点用指针处理链表

算法的实现:再开辟一个结点并使p1指向它,并输入该结点的数据.在第三次循环中,由于n=3(n≠1),又将p1的值赋给p2->next,也就是将第3个结点连接到第2个结点之后,并使p2=p1,使p2指向最后一个结点.图11-15用指针处理链表

算法的实现:再开辟一个新结点,并使p1指向它,输入该结点的数据。由于p1->num的值为0,不再执行循环,此新结点不应被连接到链表中.将NULL赋给p2->next.建立链表过程至此结束,p1最后所指的结点未链入链表中,第三个结点的next成员的值为NULL,它不指向任何结点。用指针处理链表

建立链表的函数如下:

#include<stdio.h>#include<malloc.h>#defineNULL0//令NULL代表0,用它表示空地址#defineLENsizeof(structstudent)//令LEN代表struct//student类型数据的长度

structstudent{longnum;floatscore;structstudent*next;};intn;//n为全局变量,本文件模块中各函数均可使用它用指针处理链表

structstudent*creat(){structstudent*head;structstudent*p1,*p2;n=0;

p1=p2=(structstudent*)malloc(LEN);scanf("%ld,%f",&p1->num,&p1->score);head=NULL;while(p1->num!=0){

n=n+1; if(n==1)head=p1; elsep2->next=p1;

p2=p1; p1=(structstudent*)malloc(LEN); scanf("%ld,%f",&p1->num,&p1->score); }p2->next=NULL;return(head);}用指针处理链表

输出链表首先要知道链表第一个结点的地址,也就是要知道head的值。然后设一个指针变量p,先指向第一个结点,输出p所指的结点,然后使p后移一个结点,再输出,直到链表的尾结点。用指针处理链表

对链表的删除操作从一个动态链表中删去一个结点,并不是真正从内存中把它抹掉,而是把它从链表中分离开来,只要撤销原来的链接关系即可。用指针处理链表

对链表的插入操作

对链表的插入是指将一个结点插入到一个已有的链表中。为了能做到正确插入,必须解决两个问题:①怎样找到插入的位置;②怎样实现插入。用指针处理链表

先用指针变量p0指向待插入的结点,p1指向第一个结点将p0->num与p1->num相比较,如果p0->num>p1->num,则待插入的结点不应插在p1所指的结点之前。此时将p1后移,并使p2指向刚才p1所指的结点.用指针处理链表

再将p1->num与p0->num比,如果仍然是p0->num大,则应使p1继续后移,直到p0->num<=p1->num为止。这时将p0所指的结点插到p1所指结点之前。但是如果p1所指的已是表尾结点,则p1就不应后移了。如果p0->num比所有结点的num都大,则应将p0所指的结点插到链表末尾。

如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将p0的值赋给p2->next,使p2->next指向待插入的结点,然后将p1的值赋给p0->next,使得p0->next指向p1指向的变量用指针处理链表

算法:C文件概述文件的定义所谓文件一般指存储在外部介质(如磁盘磁带)上数据的集合.操作系统是以文件为单位对数据进行管理的.文件程序数据区输出文件缓冲区输入文件缓冲区C文件概述根据数据的组织形式,文件可分为ASCII文件,即文本文件每个字节存放一个ASCII代码,代表一个字符二进制文件把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放可节省存储空间,但一个字节并不对

应一个字符文件指针在缓冲文件系统中,每个被使用的文件都要在内存中开辟一个区,存放文件的有关信息.这些信息保存在一个结构体变量中,该结构体类型由系统定义,取名为FILEVisualC++在stdio.h文件中有以下的文件类型声明:#ifndef_FILE_DEFINEDstruct_iobuf{char*_ptr;int_cnt;char*_base;int_flag;int_file;int_charbuf;int_bufsiz;char*_tmpfname;};typedefstruct_iobufFILE;#define_FILE_DEFINED#endif文件类型指针文件型指针变量:FILE*fp;fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。如果有n个文件,一般应设n个指针变量,使它们分别指向n个文件,以实现对文件的访问。文件的打开与关闭一.文件的打开(fopen函数)函数调用:FILE*fp;fp=fopen(文件名,使用文件方式);①需要打开的文件名,也就是准备访问的文件的名字;②使用文件的方式(“读”还是“写”等);③让哪一个指针变量指向被打开的文件。

文件的打开与关闭文件使用方式含义 “r”(只读)为输入打开一个文本文件“w”(只写)为输出打开一个文本文件“a”(追加)向文本文件尾增加数据“rb”(只读)为输入打开一个二进制文件“wb”(只写)为输出打开一个二进制文件"ab“(追加)向二进制文件尾增加数据"r+“(读写)为读/写打开一个文本文件"w+”(读写)为读/写建立一个新的文本文件"a+”(读写)为读/写打开一个文本文件"rb+“(读写)为读/写打开一个二进制文件“wb+“(读写)为读/写建立一个新的二进制文件“ab+”(读写)为读/写打开一个二进制文件文件的打开与关闭打开文件常用方法:if((fp==fopen(“file1”,”r”))==NULL){

printf(“Cannotopenthisfile\n”);exit(0);}文件的打开与关闭二.文件的关闭(fclose函数)函数调用:fclose(文件指针);函数功能:

使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作

返回值:关闭成功返回值为0;否则返回EOF(-1)

文件的读写一.字符输入输出函数(fputs()和fgets())fputs函数函数调用:fputs(ch,fp);函数功能:

将字符(ch的值)输出到fp所指向的文件中去。返回值:如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个EOF.文件的读写fgets函数函数调用:ch=fgets(fp);函数功能:

从指定的文件读入一个字符,该文件必须是以读或读写方式打开的。

返回值:读取成功一个字符,赋给ch。如果遇到文件结束符,返回一个文件结束标志EOF。文件的读写二.数据块读写函数(fread()和fwrite())函数调用:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);参数说明:buffer:是一个指针。对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址(均指起始地址)。size:

要读写的字节数。count:

要进行读写多少个size字节的数据项。fp:

文件型指针。文件的读写

使用举例:若文件以二进制形式打开:

fread(f,4,2,fp);

此函数从fp所指向的文件中读入2个4个字节的数据,存储到数组f中。文件的读写使用举例:若有如下结构类型:structstudent_type{charname[10];intnum;intage;charaddr[30];}stud[40];可以用fread和fwrite来进行数据的操作:for(i=0;i<40;i++)

fread(&stud[i],sizeof(structstudent_type),1,fp);

for(i=0;i<40,i++)fwrite(&stud[i],sizeof(structstudent_type),1,fp);

文件的读写使用举例:从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去。

#include<stdio.h>#defineSIZE4structstudent_type{ charname[10];intnum;intage;charaddr[15];}stud[SIZE];/*定义结构*/§13.4文件的读写(续)voidsave(){FILE*fp;inti;if((fp=fopen("stu_list","wb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)/*二进制写*/if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1)printf(“filewriteerror\n”);/*出错处理*/fclose(fp);}/*关闭文件*/

main(){inti;for(i=0;i<SIZE;i++)/*从键盘读入学生信息*/scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);save();}/*调用save()保存学生信息*/验证在磁盘文件“stu_list”中是否已存在此数据,用以下程序从“stu_list”文件中读入数据,然后在屏幕上输出。

#include<stdio.h>#defineSIZE4structstudent_type{ charname[10];intnum;intage;charaddr[15];}stud[SIZE];main(){ inti; FILE*fp; fp=fopen("stu_list","rb"); for(i=0;i<SIZE;i++)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论