C语言课程设计指导书.docx
《C语言课程设计指导书.docx》由会员分享,可在线阅读,更多相关《C语言课程设计指导书.docx(42页珍藏版)》请在冰豆网上搜索。
C语言课程设计指导书
程序设计课程设计指导书
数字媒体技术专业
陈万军编
二OO九年六月
印刷包装工程学院信息科学系
第1章设计大纲
1.1设计目的
本课程设计是《C语言程序设计》课程实践环节的深化和延续。
此次课程设计的目的是以C程序设计语言为基础,通过完成具有一定难度的课程设计题目的功能描述、总体设计、程序编写及调试工作,加深对C语言相关知识的理解与VisualC++集成开发环境的使用,重点掌握文件操作函数的熟练运用,并养成良好的程序设计习惯,提高自我分析问题、解决问题的能力,为进一步学习《高级编程技术》及其相关课程打下良好基础。
1.2设计平台
操作系统:
MicrosoftWindowsVISTA/WindowsXP/WindowsNT
开发环境:
MicrosoftVisualC++6.0/VisualC++2005;MSDN
1.3设计要求
1、严格按照选题要求进行选题,原则上小题目一人一组,大题目两人一组,最多不超过3人。
2、课程设计期间使用固定的计算机。
3、程序代码要有必要的注释说明,以提高程序的可读性。
1.4环节安排及进度
本次课程设计时间为2周,10个工作日。
具体进度安排如下:
时间
任务
第1天
上午
课程设计任务安排;
文件操作相关概念的学习;
打开、关闭文件函数的学习与使用。
下午
字符读/写函数的学习与使用;
字符串读/写函数的学习与使用;
当天小结。
第2天
上午
数据块读/写函数的学习与使用;
格式化读/写函数的学习与使用。
下午
文件定位函数的学习与使用;
当天小结。
第3天
上午
文件定位函数的学习与使用;
文件操作实例一。
下午
文件操作实例二;
当天小结。
第4天
上午
文件操作实例二;
文件操作实例三。
下午
文件操作实例三;
当天小结。
第5天
上午
选题、分组;
查找资料。
下午
课题任务功能描述。
第6天
上午
总体设计:
功能模块设计;
下午
总体设计:
数据结构设计;
总体设计:
函数功能描述。
第7天
上午
程序实现。
下午
程序实现。
第8天
上午
程序实现。
下午
程序实现。
各功能模块测试及结果分析。
第9天
上午
各功能模块测试及结果分析。
下午
撰写课程设计报告。
第10天
上午
撰写课程设计报告。
下午
提交课程设计程序及设计报告;
答辩、总结。
1.5纪律要求
1、每位参加课程设计的同学必须认真对待,积极参加。
2、从严要求自己,不随意迟到、早退和旷课,有事需例行请假手续,在实验室不得玩计算机游戏。
3、在课程设计中应积极发挥个人主观能动性,勤于思考,虚心向指导教师、实验室教师请教,服从实验室教师的安排。
4、爱护实验室的所有财产,不得私自删除机器上系统文件。
5、保持实验室的整洁卫生。
凡违反课程设计纪律者,指导教师或实验室教师有权进行批评教育或终止其课程设计,成绩以零分记。
1.6成绩评定方式
根据平时完成课程设计任务情况、工作态度、纪律、课程设计程序及设计报告等指标综合评定成绩。
成绩不合格者,按照学校相关规定,自费随下一届学生补作该环节课程设计。
1、总分100分:
其中出勤20分,程序40分,设计报告40分;
2、出勤每天上、下午2次,每次1分;
3、如果发现有严重抄袭者,个人或该组总成绩以0分计;
4、课程设计说明书以准确、规范、认真等指标进行打分,不得抄袭,否则总成绩按0分计;
5、答辩成绩按照答辩表述和提问等环节进行评分。
第2章C语言文件操作函数
2.1文件相关概念
文件是为了某种目的系统地把数据组织起来而构成的数据集合。
1文件指针
C语言编译系统为了处理文件,为每个文件在内存中开辟一个区域,用来存放文件的有关信息,如文件名、文件状态以及文件当前位置等。
这个区域被作成一个称为FILE类型的结构体。
FILE的类型由系统定义,保存在头文件stdio.h中,它的具体结构暂时不用关心。
C程序中用指向FILE类型变量的指针变量(简称“文件指针”)来标识具体文件。
声明
FILE*stream;
声明了一个文件指针变量,以后stream可以用来标识具体文件。
2标记(文件读/写位置指针)
C语言编译系统把文件一律都看成是“字节流”,在该字节流上有一个隐含的暗标记,该标记总是指向文件中正要操作的字节,即下一个将要操作的字节,称该标记为文件读/写位置指针。
例如:
3几个常量
C语言编译系统引进几个常量标志文件处理状态。
最常用的是EOF和NULL,它们是stdio.h中预定义的常量。
EOF:
值为“-1”,习惯上表示文件结束或文件操作出错。
NULL:
值为“0”,习惯上表示打开文件失败等。
2.2文件操作函数
C文件操作全部通过系统定义的库函数来实现。
用户使用库函数时,需要把相应的头文件用#include命令括入到自己的程序文件中。
文件操作函数库的头文件是“stdio.h”,使用的程序行是:
#include
任何高级语言,对文件操作都应该遵循如下流程:
2.2.1打开、关闭文件函数
1.打开文件
打开文件使用函数fopen。
fopen的函数原型是:
FILE*fopen(constchar*filename,constchar*mode);
它的调用方式是:
FILE*stream=fopen(filename,mode);
其中
●filename是一个字符串,具体给出要打开的文件的文件名;
●mode也是一个字符串,具体给出文件的打开模式,表2.1列出各种打开模式;
●stream是文件指针变量,以后程序中使用该指针变量标识由文件名给出的文件。
fopen的功能是根据mode指定的模式,打开由filename指定的文件。
返回值=
指向文件filename的文件指针,
操作成功
NULL
出错
例2_1:
//Thisprogramusesfopentoopenfile:
"c:
\\user\\test.txt"
#include
voidmain()
{
FILE*stream=NULL;
stream=fopen("c:
\\user\\test.txt","r");
if(stream==NULL)
printf("%s","fopenerror\n");
else
{
printf("%s","fopenOK\n");
//其他代码省略
fclose(stream);
}
};
以“只读”方式打开c盘user文件夹下的test.txt文件,如果成功,则stream就是文件test.txt的文件指针变量,并且只允许对文件进行读操作;否则stream的值是NULL。
表2.1文件打开模式
序号
mode
含义
1
“r”
以只读方式打开一个ASCII文件
2
“w”
以只写方式打开或新建一个ASCII文件,原有文件内容全部删除
3
“a”
同“w”,但不删除原有文件内容
4
“r+”
以可读可写方式打开一个ASCII文件
5
“w+”
以可读可写方式打开或新建一个ASCII文件,原有文件内容全部删除
6
“a+”
同“w+”,但是不删除原有文件内容
7
“rb”
以只读方式打开一个二进制文件
8
“wb”
以只写方式打开或新建一个二进制文件,原有文件内容全部删除
9
“ab”
同“wb”,但是不删除原有文件内容
10
“rb+”
以可读可写方式打开一个二进制文件
11
“wb+”
以可读可写方式打开或新建一个二进制文件,原有文件内容全部删除
12
“ab+”
同“wb+”,但是不删除原有文件内容
2.关闭文件
任何文件在操作结束之后,都应该执行文件关闭操作。
关闭文件使用函数fclose。
fclose函数原型是:
intfclose(FILE*stream);
它的调用方式是:
fclose(stream);
其中stream是文件指针。
fclose的功能是关闭由文件指针stream指向的文件。
返回值=
0
操作成功
EOF
出错
2.2.2字符读/写函数
读/写字符(或字节)数据时,选用fget()和fputc()函数。
1.读字符:
fgetc
(1)函数原型:
intfgetc(FILE*stream);
(2)功能:
从stream指向的文件中读取一个字符,同时将读/写位置指针向前移动1个字节。
(3)返回值=
读取字符的ASCII码
操作成功
EOF
出错或遇到文件结束
例2_2
//Thisprogramusesgetctoreadthefirst80inputcharacters(oruntiltheendof//input)andplacethemintoastringnamedbuffer.
#include
#include
intmain()
{
FILE*stream;
charbuffer[81];
inti,ch;
//Openfiletoreadlinefrom:
stream=fopen("crt_fgetc.txt","r");
if(stream==NULL)
exit(0);
//Readinfirst80charactersandplacethemin"buffer":
ch=fgetc(stream);
for(i=0;(i<80)&&(feof(stream)==0);i++)
{
buffer[i]=(char)ch;
ch=fgetc(stream);
}
//Addnulltoendstring
buffer[i]='\0';
printf("%s\n",buffer);
fclose(stream);
}
Input:
crt_fgetc.txt
Lineone.
Linetwo.
Output
Lineone.
Linetwo.
2.写字符:
fputc
(1)函数原型:
intfputc(intc,FILE*stream);
(2)功能:
把字符c写入stream指向的文件,同时将读/写位置指针向前移动1个字节。
(3)返回值=
所写字符的ASCII码
操作成功
EOF
出错
例2_3
//Thisprogramusesfputctosendacharacterarraytostdout.
#include
intmain()
{
charstrprt1[]="Thisisatestoffputc!
!
\n";
char*p;
//Printlinetostreamusingfputc.
p=strprt1;
while((*p!
='\0')&&fputc(*(p++),stdout)!
=EOF);
}
Output
Thisisatestoffputc!
!
2.2.3字符串读/写函数
读/写字符串时,选用fgets()和fputs()函数。
1.读字符串:
fgets
(1)函数原型:
char*fgets(char*str,intn,FILE*stream);
(2)功能:
从stream指向的文件中读取一个字符串,并将此串保存在str指向的字符数组中。
字符串的自然结束符是“换行符”和“文件结束符”。
若读到n-1个字符后还没有遇到结束符,则也强制结束,这时把n-1个读入的字符送入数组str中。
读入结束后,在数组str的字符串末尾加字符串终止符NULL,并将文件读/写位置指针向前移动实际读取的字符个数。
(3)返回值=
str所指的字符数组首地址
操作成功
NULL
否则
例2_4
//Thisprogramusesfgetstodisplayalinefromafileonthescreen.
#include
intmain()
{
FILE*stream;
charline[100];
stream=fopen("crt_fgets.txt","r");
if(stream==NULL)
{
printf("%s","fileopenerror\n");
}
else
{
if(fgets(line,100,stream)==NULL)
{
printf("%s","fgetserror\n");
}
else
printf("%s",line);
fclose(stream);
}
}
Input:
crt_fgets.txt
Lineone.
Linetwo.
Output
Lineone.
2.写字符串:
fputs
(1)函数原型:
intfputs(constchar*str,FILE*stream);
(2)功能:
把str所指字符串(不包括字符串结束符NULL)写入stream指向的文件,同时将读/写位置指针向前移动n(字符串长度)个字节。
(3)返回值=
非负值
操作成功
EOF
否则
例2_5
//Thisprogramusesfputstowriteasinglelinetothestdoutstream.
#include
intmain(void)
{
fputs("Helloworldfromfputs.\n",stdout);
}
Output
Helloworldfromfputs.
2.2.4数据块读/写函数
读/写多个不含格式的数据块时,选用fread()和fwrite()函数。
1.读数据块:
fread
(1)函数原型:
intfread(void*buffer,intsize,intcount,FILE*stream);
(2)功能:
从stream所指的文件中读取count个字段,每个字段为size个字节,把它们送到buffer所指的缓冲区数组中,同时,将读/写位置指针向前移动size*count个字节。
一般来讲,数组buffer每个元素的尺寸为size,每个字段正好对应数组buffer的一个元素,即读入count个字段送入数组buffer的count个元素中。
(3)返回值=
实际读取的字段个数
操作成功
EOF
错误或文件结束
2.写数据块:
fwrite
(1)函数原型:
intfwrite(constvoid*buffer,intsize,intcount,FILE*stream);
(2)功能:
从buffer所指的数组中,把count个字段写到stream所指的文件中,每个字段为size个字节,同时,将读/写位置指针向前移动size*count个字节。
一般来讲,数组buffer每个元素的尺寸为size,每个字段正好对应数组buffer的一个元素,即把数组buffer的count个元素写到文件中。
(3)返回值=
实际写入的字段个数
操作成功
其他
操作错误
例2_6
//ThisprogramopensafilenamedFREAD.OUTandwrites25characterstothe//file.ItthentriestoopenFREAD.OUTandreadin25characters.Iftheattempt//succeeds,theprogramdisplaysthenumberofactualitemsread.
#include
intmain()
{
FILE*stream;
charlist[30];
inti,numread,numwritten;
//Openfileintextmode:
if((stream=fopen("fread.out","w+t"))!
=NULL)
{
for(i=0;i<25;i++)
list[i]=(char)('z'-i);
//Write25characterstostream
numwritten=fwrite(list,sizeof(char),25,stream);
printf("Wrote%ditems\n",numwritten);
fclose(stream);
}
else
printf("Problemopeningthefile\n");
if((stream=fopen("fread.out","r+t"))!
=NULL)
{
//Attempttoreadin25characters
numread=fread(list,sizeof(char),25,stream);
printf("Numberofitemsread=%d\n",numread);
printf("Contentsofbuffer=%.25s\n",list);
fclose(stream);
}
else
printf("Filecouldnotbeopened\n");
}
Output
Wrote25items
Numberofitemsread=25
Contentsofbuffer=zyxwvutsrqponmlkjihgfedcb
2.2.5格式化读/写函数
读/写多个含格式的数据时选用fscanf()和fprintf()函数。
函数fscanf()和fprintf()与函数scanf()和printf()的功能相似,区别在于函数fscanf()和fprintf()操作对象是一般文件,而scanf()和printf()操作对象是标准输入/输出文件。
格式化读/写是把数据按fscanf()和fprintf()函数中格式控制符串中控制字符的要求进行转换,然后再进行读/写。
1.格式化输入:
fscanf
(1)函数原型:
intfscanf(FILE*stream,constchar*format[,argument]...);
(2)功能:
从stream所指文件中按format规定的格式读取数据。
(3)返回值=
实际读取的参数个数
操作成功
一个负数
否则
例2_7
//Thisprogramwritesformatteddatatoafile.Itthenusesfscanftoreadthe
//variousdatabackfromthefile.
#include
intmain()
{
FILE*stream;
longl;
floatfp;
chars[81];
charc;
if((stream=fopen("fscanf.out","w+"))!
=NULL)
{
fprintf(stream,"%s%ld%f%c","a-string",6500,3.14159,'x');
//Setpointertobeginningoffile:
fseek(stream,0L,SEEK_SET);
//Readdatabackfromfile:
fscanf(stream,"%s",s);
fscanf(stream,"%ld",&l);
fscanf(stream,"%f",&fp);
fscanf(stream,"%c",&c);
//Outputdataread:
printf("%s\n",s);
printf("%ld\n",l);
printf("%f\n",fp);
printf("%c\n",c);
fclose(stream);
}
else
printf("Thefilefscanf.outwasnotopened\n");
}
Output
a-string
65000
3.141590
x
2.格式化输出:
fprintf
(1)函数原型:
intfprintf(FILE*stream,constchar*format[,argument]...);
(2)功能:
将数据按formant规定的格式写入stream所指的文件中。
(3)返回值=
实际写入的参数个数
操作成功
一个负数
否则
例2_8
//Thisprogramusesfprintftoformatvariousdataandprintittothefilenamed*//FPRINTF.OUT.ItthendisplaysFPRINTF.OUTonthescreenusingthesystem
//functiontoinvoketheoperating-systemTYPEcommand.
#include
#include
intmain()
{
FILE*stream;
inti=10;
doublefp=1.5;
chars[]="thisisastring";
charc='\n';
if((stream=fopen("fprintf.out","w"))!
=NULL)
{
fprintf(stream,"%s%c",s,c);
fprintf(stream,"%d\n",i);
fprintf(stream,"%f\n",fp);
fclose(stream);
system("typefprintf.out");
}
else
printf("%