admin 管理员组

文章数量: 1086019


2024年4月24日发(作者:oracle创建表的sql语句)

维普资讯

是C语雷的“ 

四川绵阳职业技术学校

C语言是目前国际上广泛流行的一 

种通用的结构化程序设计语言,它具有功 

) 

) 

printf(“Result=%f”,x): 

) 

break; 

"吗? 

敏 

还是在seanf()中连续输人数、字符串和字 

符,也会出现上述现象。 

如下列的一个简单程序: 

#inelude"stdi0n

能丰富、表达能力强、使用灵活方便、应用 

面广、目标程序效率高、可移植性好的特 

点,不仅是开发系统软件和应用软件的理 

}l’’ 

main() 

想程序设计语言,而且国内许多考试中都 

将C语言列入了考试范围。目前国内许多 

高校开设了C语言课程,Turbo c2.0作为 

C语言的入门编译系统,在当前的高校中 

仍广泛应用。在Turbo c的上机中,学生遇 

到了几处疑难情况,我让他们查阅了大量 

的参考书,无结果,有的学生问:“这是不是 

C语言的漏洞啊?”事实果真如此吗? 

1 Scanf()和getchar()输入函数 

在输入字符时的“漏洞” 

在一本教科书上,给出了下列一个程 

序: 

#include"stdi0

h” 

main() 

I 

char op; 

lfoat X,y; 

printf(“\ninput first data:”); 

seanf(“%f”,&x); 

while(1) 

{ 

printf(“\ninput operator(+,一, 

/,=):”); 

0p=getehar(); 

if(op==’=’1 

break; 

prinff(“ninput nexI data:”); 

scltnf(“%f’’,&y); 

switch(op) 

{ 

case

+’:x+=y; 

break; 

+‘:x

case

=y; 

break; 

●’

case

:x●=y; 

break; 

case’/’:if(y) 

x/=y; 

本程序的目的是先输入一个实型数, 

再输入一个操作符,后输入另一个实型数, 

根据操作符的不同,分别执行不同的操作 

(相加、相减、相乘、相除)后,输出结果。 

本程序编译正确,运行时,屏幕提示及 

输入如下: 

input first data:12 

input operator(+,一, ,/,=):+ 

input Next data:2… 

input operator(+,一, ,/,=):= 

Result=l2 

再输入“一”运算符,也不能执干t,但输 

入“ ”和“/”的运算符时,程序正常执行, 

结果正确,换成seanf(),结果同样,为什 

么? 

我采用单步运行(F8键),在主菜单 

Break/Watch中选择Add watch选项,输入 

op、x、y观察。虽然C语言的输入函数执行 

时是将当前键盘缓冲区里的字符读人的, 

第一次将12后面的回车读人,第二次才取 

输入的运算符,这时,“ ”、“/”、“=”能读 

人,而“+”、“一”不读人,将其后面的回车 

符读人,故不执行任何操作,为什么? 

在op=getchar();的后面增加一句 

op=getchar();整个程序完全正确,用户仍 

然只输入一次(+、一、 、/)中的一个符 

号,第一个getchax()语句将12后面的回车 

符读人,第二个getchar()将所需的操作符 

读人,整个程序完全正确。应该说,刚才的 

程序中,只有一句op=getchar()“ …‘/” 

+…‘

”都不能正确读人所需的操作符, 

出现认“ ”“/”不认“+”“一”的这种怪现 

象。一种可能是“瞎猫碰到死耗子”,偶然 

的巧合,一种可能是C与Turbo C之间的 

差异。 

后来出现了多次类似的情况,即在输 

入一个数或字符串后接着输入一个字符, 

不论是ScaRf()语句后接着getchar()语句, 

{ 

char p: 

lfoat.x: 

seanf(“%f%c”,&x,&p); 

printf(“x=%f P=%c”,x,p): 

) 

这个程序在输人数和字符后,输出只 

能显示 的值,P的值为回车符。将scanf 

()改为scanf(“%f%c%c”,&x,&p,&p); 

结果正确。 

2 scarf()函数在结构体数组输入 

实型成员值时的“漏洞” 

有10个同学,分别有三门课的成绩. 

要求计算每个同学的平均成绩和每门课的 

平均成绩。定义了如下的一个结构体数 

组,其输人数据部分的程序为: 

#inelude“stdi0h’’ 

struet student 

{ 

ehar nltme[20】; 

lfoat score[3】; 

)st[10】; 

main() 

{ 

int i,j; 

f0r(i=0;i<l0;i++) 

{ 

seanf(“%s”,st[i1.n.me); 

lfor(j=0;j<3;j++) 

se ̄f(“%f’’,&st[i】;sc0re[j】); 

l 

l 

l 

本程序编译无误,但运行时,程序不执 

行score数据的读人,无法输入成绩。如果 

将score的类型设为int型,程序运行正确, 

为什么? 

调试中发现: 

维普资讯

山东东营胜利油田胜建集团 王新忠 

Visual Foxpro6.0是美国Microsoft公司推出的数据库管理系 设计器中以expl1表示)。在设计分组报表时,自动生成的报表则 

统。它集数据库创建、应用和程序开发于一体,并且其报表设计器 

操作简单、功能强大,如能灵活运用,则对管理信息系统的开发有 

着很大的帮助。 

只能在报表的最下端起到汇总的作用,而不能实现对每一条输入 

的料单数据的逐条累计。 

报表的细节带区是报表显示的主要内容,如果能够在细节去 

实现汇总,那么不就能实现每条记录的逐条累计了吗。按照这一 

思路,我在页标头区加入结存金额字段,并在细节区加入矩形框, 

1 报表设计器 

使用报表设计器创建报表,一般有以下4个过程: 

①启动“报表设计器”。 

②定义报表布局:定义报表页面和报表带区的总体形状。 

③设置数据环境:定义报表的数据源。 

④添加报表控件:定义出限于页面的数据项。 

其中,数据源既可以是数据表,也可以是视图,而且,以试图 

作为数据源更能有效的加强报表设计器的功能。 

以expl3表示(其表达式为exp9一expl1)。做好之后,点击:“预 

览”,果然按照自己的想法实现了需要的功能。其结果如表1所示。 

表1.器材名称(螺纹钢14#) 单位t 编码03001 

料单 摘要 

编号 

收入 

数量 

收入 

金额 

发料 发料 

数量 金额 

结存 

结果 

结存 

金额 

1 239 3 964.80 1.239 3 964.80 

在报表设计器中一般包括5个带区: 

4—89 拌和站 

721—1 拌和站 

总和 

0.012 98.40 1.227 3 926.40 

0.100 320.00 1.127 3 606.40 

l 239 3 964.80 0.1l2 358.40 1.127 3 606.40 

①标题区:显示报表第一页的开头。 

②页标头:显示每页的开头。 

打印时却不止一行,而是打印所有符合要求的记录: 

③细节:为报表的主要内容。在这里我们只能看到~行,但在 

2.2 充分利用报表设计器的数据环境 

在打印报表时,在最后一页往往出现打印不满的现象,虽然 

不影响功能,但总显得不美观,格式不统一。为解决这个问题,可 

以在数据环境中添加相应的代码。 

④页注脚:打印在每页的底部,一般用于打印页号等内容。 

⑤总结:主要用于分组汇总。 

通常,我们所能做的调整工作有:调整带区宽度、移动控件和 

修改控件等。 

在本单位开发的劳资人员管理系统中,按要求每页打印23 

条记录。但在最后一页中只有12条记录,剩下半页纸空白。为了 

美观统一的要求,剩余的空白处要打印出相应的格式。此时可以 

在报表设计器的数据环境中的Init事件中加入如下代码: 

Public Pfintrownum 

2 实际应用 

2.1 灵活运用细节带区 

本单位原先用VFP开发了一套材料管理系统,现在为适应财

务系统的要求,将增加材料明细账的功能,即对每一种材料的单

据除了有总的汇总外,还要实现逐条累计汇总的功能,以便于财

务对账。如果单独进行开发,则费时费力,而如果能巧妙的构造报 

表,也能很好的解决这一问题。 

Printrownum=23 &&需要打印的记录数 

do while reccount( hmc.dbff)%Printrownum<>0 

append blank 

enddo 

&&记录不满一页时添加空记录 

在报表设计器中的数据源为料单明细视图,在该视图中以收 3 结束语 

料数量 收料单价表示收料金额字段(在报表设计器中的矩形框 

以exD9表示),发料数量 发料单价表示发料金额字段(在报表 

廊 厣 崞厣 崞 崞 声 厣 

本文只是介绍了VFP报表设计器的两个技巧应用,而其强大 

的功能需要在使用过程中去仔细体会。 

崞厣 。席 厨 席 厨 厨 厣 厣 崞 

①结构体数组中,若其成员为float型 

的简单变量,不是float型的数组,如下例: 

【0].score[0],程序工作正常。 

由此,我想是否结构体数组在输入内 

st[i】.score[j卜temp;】 

结果程序运行正确。 

struct student 

{ 

存中时,因其成员为float型数组,结构体 

成员的float型数组首位置,其地址无法正 

输入时的变量,然后将其值赋给st【i] 

.score…,如下例: 

c语言的格式输入的规定比较繁琐, 

是最基本的操作,几乎每一个程序都包含 

试程序的时间,我在此将自己的一点收获 

奉献给大家,起个抛砖引玉的作用,希望得 

数组下标变量无法定位,只能指向第一个 用得不对就得不到预期的结果,而输入又 

char name[20】; 

lfoat score; 

l st[10】; 

数据能正确输入。 

确定位。我用一简单float型变量temp作 输入,有时由于掌握不好而浪费了大量调 

②在输入时,如果指定输入值到&st [scanf(“%f’,&temp); 到各位同仁的斧正。 


本文标签: 报表 输入 设计 语言 程序