C语言课程设计C输入输出库函数的程序设计.docx
《C语言课程设计C输入输出库函数的程序设计.docx》由会员分享,可在线阅读,更多相关《C语言课程设计C输入输出库函数的程序设计.docx(18页珍藏版)》请在冰豆网上搜索。
C语言课程设计C输入输出库函数的程序设计
华中科技大学运算机科学与技术学院
C语言课程设计报告
题目:
C输入/输出库函数的程序设计
专业:
计算机科学与技术
班级:
学号:
姓名:
成绩:
指导教师:
完成日期:
2021年10月15日
一、系统需求分析
C输入/输出库函数的程序设计
(1)给定getchar和putchar函数,实现其它C输入输出库函数。
如:
gets,puts,printf,scanf等。
而且在原函数名前加my组成新函数名。
如:
mygets,myputs,myprintf,myscanf等。
对myprintf函数,其功能与printf函数相同。
但只要求支持简单的%c,%d,%s,%f,%lf格式说明。
不要求域宽操纵。
对myscanf函数,其功能与scanf函数相同。
但只要求支持简单的%c,%d,%s,%f,%lf格式说明。
(2)鼓舞实现参考书[1]p241APPENDIXB:
StandardLibrary中B1InputandOutput:
<>中的其它库函数。
(3)创建库,将自己实现的库函数加入到该库中。
(4)对自行设计的每一个库函数,编写实验程序,挪用库自行设计的库函数,要求取得正确结果。
(5)在设计报告中提交测试结果报告以说明挪用结果。
(6)提交详细注释的各个库函数清单,而且简短说明设计思路。
二、整体设计
C输入输出库函数的程序设计
(1)mygets函数用getchar函数循环依次读取输入缓冲区的字符,直到读取换行符'\n'后终止循环。
每读取一个字符就将该字符存到mygets函数的形参所指定的地址,同时形参指针值增加1。
读取换行符'\n'后,存入字符'\0'。
(2)myputs函数用putchar函数循环输出形参所指向的字符,同时形参指针值增加1,直到形参所指字符为空字符'\0'时终止循环。
空字符'\0'用换行符'\n'替代输出。
(3)将myprintf概念成参数数量可变的函数。
用循环依次输出格式字符串中的字符,一般字符原样输出。
碰着字符'%'后,判定后续字符可否组成一个合法的转换说明,在依照相应的转换说明所对应的数据类型从可变的参数列表中取一个参数,存入到一个同类型的临时变量;假设不能组成,那么按一般字符做相应输出处置。
(4)将myscanf函数概念为参数数量可变的函数。
与myprintf函数实现时对格式字符串的处置方式一样,在格式字符串中找转换说明并做输入处置,直到格式字符串串尾。
不同的是,每找到一个转换说明后,第一从可变参数列表中取一个参数,作为寄存输入数据的地址,再依照转换说明对应的数据类型,从输入流读取字符吗,转换为指定类型的数据后,存入参数所代表的内存地址。
处置中要注意地址类型的强制转换。
(5)另外,设计一个change函数,用于字符型转换。
三、详细设计
mygets流程图:
用mypritf函数处置整型时,采纳“除10取余”的方式,再进行字符型转换,将整型数变成字符型存在一个数组里,然后再用putchar循环输出;关于浮点数和双精度浮点数,将整数部份和小数部份分开来处置。
其中,小数部份采纳“乘10取整”的方式来处置,并将整数部份和小数部份进行字符型转换再输出,中间输出一个小数点'.'即可。
输出时要注意从高位到低位进行并注意负数的符号问题。
myscanf函数,关于字符型数据,直接用getchar从输入流中取一个字符,其他类型数据在从输入流中取字符时,都需要第一跳过起始位置的空白字符。
关于字符串型数据,从第一个非空白字符开始,直到取到空白字符时终止,每取一个非空白字符就存一次,最后存一个空字符'\0'。
关于整型,要注意字符序列前可能有符号'+'和'-',符号位以后若是所取字符是'0'—'9'数字字符,那么需要进行转换和存储;若是是非数字字符,那么终止处置。
关于浮点型和双精度浮点型,要注意对小数点都的数字的处置。
第一将数字字符转换成相应的数字值,在除以10的n次方(转换成浮点型),n是该小数位在小数点后的位置,从1开始每次增加1。
下面给出myprintf函数的流程图
四、系统实现
下面是程序的源码。
库函数
#include<>
#include<>
#include<>
#include<>
char*mygets(char*a);
voidmyputs(char*a);
voidchange(intn,charstr[]);
voidmyprintf(constchar*a,...);
voidmyscanf(constchar*format,...);
char*mygets(char*a)
{
charc;
inti=0;
while((c=getchar())!
='\n')
{
a[i]=c;
i++;
}
a[i]='\0';
returna;
}
voidmyputs(char*a)
{
inti;
for(i=0;a[i]!
='\0';i++)
{
putchar(a[i]);
}
putchar('\n');
}
voidchange(intn,charstr[])/*字符型转换*/
{
inti,j,remain;
chartmp;
i=0;
while(n/10!
=0||(n>0&&n<10))
{
remain=n%10;
str[i]=remain+'0';
n/=10;
i++;
}
str[i]='\0';
for(i--,j=0;j<=i;j++,i--)/*将字符串倒序*/
{
tmp=str[j];
str[j]=str[i];
str[i]=tmp;
}
}
voidmyprintf(constchar*a,...)
{
va_listap;
va_start(ap,a);
chars,*si;
intv;
floatf;
doubledb;
inti=0;
charkey;
charb;
while((key=a[i])!
='\0')
{
if(a[i]=='%')
{
b=a[++i];/*取下一个字符*/
switch(b)
{
case'c':
/*字符类型*/
s=va_arg(ap,int);
putchar(s);
break;
case's':
/*字符串类型*/
for(si=va_arg(ap,char*);*si;si++)
putchar(*si);
break;
case'd':
/*整型*/
v=va_arg(ap,int);
charoutput[50];
if(v<0)/*判定负数*/
{
putchar('-');
v=0-v;
}
intnum;
change(v,output);/*字符型转换*/
for(num=0;output[num]!
='\0';num++)
putchar(output[num]);
break;
case'f':
/*浮点型*/
f=va_arg(ap,double);
if(f<0)/*判定负数*/
{
putchar('-');
f=0-f;
}
charstr[50];
charstr1[50];
intd=f;/*整数部份*/
change(d,str);/*字符型转换*/
myprintf("%s",str);/*挪用函数本身*/
f-=(float)d;/*小数部份*/
putchar('.');
f*=1000000;
d=(int)f;
change(d,str1);
myprintf("%s",str1);
break;
case'l':
if(a[++i]!
='f')/*判定双精度浮点型*/
putchar(a[i--]);/*不是那么按一般字符输出*/
else
{
db=va_arg(ap,double);
if(db<0)/*判定负数*/
{
putchar('-');
db=0-db;
}
intb=db;/*整数部份*/
charstrs[50];
charstrs1[50];
change(b,strs);/*字符型转换*/
myprintf("%s",strs);
db-=(double)b;/*小数部份*/
putchar('.');
db*=1000000;
b=(int)db;
change(b,strs1);
myprintf("%s",strs1);
break;
}
break;
case'%':
putchar('%');
break;
default:
putchar(s);
}
}
else
putchar(a[i]);
i++;
}
va_end(ap);
}
voidmyscanf(constchar*format,...)
{
charc;
char*q,*s;
int*d;
float*f;
double*lf;
intfu=1;/*判定负数*/
va_listap;
va_start(ap,format);
while((c=*format++)!
='\0')
{
if(c=='%')
{
c=*format++;
switch(c)
{
case'c':
/*字符型*/
q=va_arg(ap,char*);
*q=getchar();
getchar();
break;
case's':
/*字符串*/
s=va_arg(ap,char*);
c=getchar();
for(;((c!
='')&&(c!
='\n')&&(c!
='\t'));c=getchar())
{
if((c=='')||(c=='\t')||(c=='\v')||(c=='\n')||(c=='\r'))/*c为空格等那么终止循环*/
continue;
*s=c;
s++;
}
*s='\0';
break;
case'd':
/*整型*/
d=va_arg(ap,int*);
*d=0;
c=getchar();
for(;((c!
='')&&(c!
='\n')&&(c!
='\t'));c=getchar())
{
if((c=='')||(c=='\t')||(c=='\v')||(c=='\n')||(c=='\r'))
continue;
if(c=='-')
fu=0;/*负数标记*/
if(c>='0'&&c<='9')
*d=*d*10+c-'0';
}
if(fu==0)
*d=0-*d;
break;
case'f':
/*浮点型*/
f=va_arg(ap,float*);
*f=0;
c=getchar();
for(;((c!
='.')&&(c!
='')&&(c!
='\n')&&(c!
='\t'));c=getchar())
{
if((c=='')||(c=='\t')||(c=='\v')||(c=='\n')||(c=='\r'))
continue;
if(c=='-')
fu=0;/*负数标记*/
if(c!
='.'&&(c>='0'&&c<='9'))
*f=*f*10+c-'0';/*整数部份*/
}
if(c=='.')
{
intE=1;/*10的次幂*/
floatff1=0;
for(c=getchar();c>='0'&&c<='9';c=getchar())
{
if((c=='')||(c=='\t')||(c=='\v')||(c=='\n')||(c=='\r'))
continue;
ff1=ff1*10+c-'0';
E*=10;
}
*f+=ff1/E;
}
if(fu==0)
*f=0-*f;
break;
case'l':
if(*format!
='f')/*判定是不是为双精度浮点型*/
break;
else
{
lf=va_arg(ap,double*);
*lf=0;
c=getchar();
for(;((c!
='.')&&(c!
='')&&(c!
='\n')&&(c!
='\t'));c=getchar())
{
if((c=='')||(c=='\t')||(c=='\v')||(c=='\n')||(c=='\r'))
continue;
if(c=='-')
fu=0;/*负数标记*/
if(c!
='.'&&(c>='0'&&c<='9'))
*lf=*lf*10+c-'0';/*整数部份*/
}
if(c=='.')
{
intE=1;/*10的次幂*/
floatlf1=0;
for(c=getchar();c>='0'&&c<='9';c=getchar())
{
if((c=='')||(c=='\t')||(c=='\v')||(c=='\n')||(c=='\r'))
continue;
lf1=lf1*10+c-'0';
E*=10;
}
*lf+=lf1/E;
}
if(fu==0)
*lf=0-*lf;
break;
}
default:
break;
}
}
}
va_end(ap);
}
以下为测试函数
#include""
intmain()
{
chara[20];
charc;
chars[100];
intd;
floatf;
doublelf;
mygets(a);
myputs(a);
myscanf("%c%s%d%f%lf",&c,s,&d,&f,&lf);
myprintf("\nc:
%c\ns:
%s\nd:
%d\nf:
%f\nlf:
%lf",c,s,d,f,lf);
return0;
}
五、运行测试与结果分析
测试函数如前一页所示
程序的运行测试与结果截图如下:
结果的前两行是对mygets和myputs函数的测试,结果没有问题。
后面是对myscanf和myprintf的测试,依次输入字符型、字符串、整型、浮点型、双精度浮点型,然后再用myprint函数依次输出,结果也是正确的。
当输入为负数时,输出结果也是负数。
程序运行无误!
六、总结
本次课程设计的作业C输入/输出库函数的设计,用getchar和putchar函数设计自己的mygets,myputs,myprintf和myscanf函数,并把它们加到自己创建的自概念库中。
本次课程设计我感觉最大的收成确实是对C语言有了更深刻的体会,也从中学习了好多有关C语言的知识。
在编写程序的进程中,我也碰到过一些问题,最终仍是通过和同窗们踊跃地探讨和自己的试探解决了编程进程中的一个又一个问题,信心也大大增加。
在以后的编程学习中,也要有耐心,踊跃地去试探问题,多和同窗们交流一下,相信自己的编程能力会取得更进一步的提高。
另外,本程序中还有些许处置不妥的地址,还望取得教师的指正。
七、参考文献
《C语言实验与课程设计》李开,卢萍,曹计昌编著科学出版社
《C语言程序设计》曹计昌,卢萍,李开编著.科学出版社
《C语言程序设计》Brian,Dennis编著第二版机械工业出版社
八、指导教师评语