语句缓存文件写入失败

缓存文件写入失败  时间:2021-02-25  阅读:()

C语言实验指导书齐鲁理工学院目录实验一Turboc集成开发环境的使用3实验二数据类型、运算符与表达式13实验三数据的输入、输出17实验四选择结构程序设计20实验五循环语句26实验六数组31实验七函数37实验八指针43实验九结构体与共用体47实验十位运算与文件操作51附录一、C语言上机考试样题56附录二、学C语言常犯的错误57实验一Turboc集成开发环境的使用一、实验目的掌握TurboC集成环境的使用,能将一个简单的C语言源程序打开、存盘、编译、运行并查看运行结果.
通过运行简单的C程序,初步了解C源程序的特点.
二、实验指导TurboC是一个集程序编辑、编译、连接、调试为一体的C语言程序开发软件,我们通常称之为IDE(IntegratedDevelopmentEnvironment),TCIDE就是TC集成开发环境,另外如VCIDE是指VC的集成开发环境.
本次实验将要学习如何使用该集成开发软件的使用.
TurboC3.
0的安装目前下载的TC2,TC3按安装分类大概有两种版本:一是通过install安装,二是直接解压后建立TC.
EXE的快捷方式,在WINDOWS下双击即可运行(DOS下直接运行TC.
EXE).
下面介绍第一种情况的安装过程:下载得到TurboC3.
0的文件,解压在某个目录下,现假设解压在D盘tc3目录下,该目录下即为安装TC3.
0所需的文件,如图1.
1所示图1.
1运行TC3目录下的安装文件install.
exe,出现图1.
2的界面图1.
2按回车进入界面如图1.
3,输入安装文件所在的驱动器,默认为A驱即软驱,现应输入D,回车后选择安装文件所在的目录TC3,如图1.
4图1.
3图1.
4选择完安装文件的目录后确定软件安装的目的盘符及路径,如图1.
5,界面上所示的路径D:\TC是默认的盘符及路径,如果不修改则将软件安装到D盘的TC目录下,如果想安装在C盘则可将光标移到Directories…处进行修改,如图1.
6所示.

图1.
5图1.
6最后选择图1.
7所示界面中的StartInstallation,回车后完成TC3.
0的安装图1.
7有关TurboC3.
0中的路径问题①包含路径:IncludeDirectories默认是而且应该是TC路径\Include,否则程序在编译时将会报错,怎么找不到stdio.
h啦等等,原因就在这里没有按要求设置.
静态库路径:LibraryDirectories唯一跟包含路径不同的是把Include对应改成lib,如果你把TC路径下的lib改名叫john,那么你就应该改成TC路径\john.
输出路径:OutputDirectory.
就是你的源程序编译生成的.
obj,.
exe等存放的路径,默认是工作路径,当然你可以修改成你指定的路径.
源代码路径:SourceDirectory.
是一个使用连接库的工程在被集成调试器调试的时候为调试器指定的连接库的源代码路径.
因为使用了连接库的工程原本不可以开放库程序的源代码的.
这个路径只在调试连接库时用到,因此对于初学者,尤其是不涉及编写连接库的程序时,大可不理它.

TurboC3.
0工作环境介绍(1)TurboC3.
0的启动一种方式是直接在安装目录TC下的bin目录下点击tc.
exe,或者将命令行路径设置到bin目录,然后输入tc(回车)后打开的方式.
例如,安装目录为C:\tc,则tc.
exe在目录C:\tc\bin目录下,直接运行该程序即可.
如果你的计算机中TurboC的安装路径不同的话,在上述方式中改变相应路径即可.
第二种打开方式就是你在其他路径下建立TC.
exe的快捷方式,然后点击快捷方式进入.
启动TC后,其界面如图1.
8所示:图1.
8其中顶上一行为TurboC3.
0主菜单,中间窗口为编辑区,接下来是信息窗口,最底下一行为参考行,以后的编程、编译、调试以及运行都将在这个主屏幕中进行(2)常用命令菜单的使用进入TC的集成环境后,编辑、调试程序均要用到菜单中提供的各项功能.
按功能键F10可激活主菜单,然后用光标键移动色棒进行选择,回车则执行.
下面介绍几个常用菜单的功能:①主菜单显示屏的顶部是主菜单条,它提供了8个选择项:File处理文件(装入、存盘、选择、建立、换名存盘、写盘),目录操作(列表、改变工作目录),退出TurboC,返回DOS状态.
Edit建立、编辑源文件.
Search查找源代码中的字符串,也可查找替换Run自动编辑、连接并运行程序,跟踪执行程序.
Compile编辑、生成目标文件.
Project将多个源文件和目标文件组合成工作文件.
Option提供集成环境下的多种选择和设置(如设置存储模式、选择编参数、诊断及连接任选项)以及定义宏;也可记录Include、Output及Library文件目录,保存编译任选项和从配置文件加载任选项.

Windows进行窗体的缩放、切换、关闭等操作,也可调出某个窗体,如Message窗体.
②编辑窗口编辑窗口是在主菜单下,信息窗口之上的区域,其顶行中间有"Edit"标志.
在此窗口中可以建立、编辑一个源文件.
功能键F5可以扩大编辑窗口到整个屏幕,或恢复分屏式环境.
在插入模式下(用Ins键转换)向编辑窗口内输入代码,按回车键结束一行(TC编辑器不能自动换行),再按一次Ins键,屏幕转换成为替换模式,输入的字符将替换光标所在位置的字符.
③信息窗口编译和调试源程序时,信息窗口显示诊断信息、警告、出错信息、错误在源程序中的位置.
功能键F5可以扩大和恢复信息窗口,按F6或Alt+E,光标从信息窗口跳到编辑窗口,也可用鼠标直接操作.

④功能键提示行屏幕低行是功能键提示行,显示当前状态下功能键(俗称TurboC热键)的作用,见下表.
应当注意,在不同状态下功能键的作用是不同的.
正确使用功能键可以简化操作.
热键简单说明F1Help,以分页的形式显示帮助信息F2保存当前正在编辑窗口中的文件F3装入一个文件.
按F3,屏幕上弹出一个输入框,输入要装入的文件名F5Zoom,缩放活动窗口F6Switch,活动窗口开关,按F6键,光标从编辑窗口跳到信息窗口,或从信息窗口跳到编辑窗口F7Trace,跟踪到函数中F8Step,单步跟踪,但不进入函数内部F9Make,对当前文档进行编辑、连接F10Menu,激活主菜单,光标跳到主菜单运行一个C语言程序的一般过程1)编辑源文件在主菜单下,直接按Alt+F键,或按F10后将光带移到"File"选项上,按回车键,在"File"下面出现一个下拉菜单,菜单中有以下选项:New表示新文件,缺省文件名为NONAME00.
CPP.
OpenF3表示加载或装入一个文件SaveF2将正在编辑的文件存盘.
Saveas将正在编辑的文件写入指定的文件中,若文件名已存在,则重写.
Saveall将当前打开的文件全部存盘ChangeDir改变驱动器及目录OSshell进入TurboC命令行模式,命令EXIT可返回集成环境QuitAlt+x退出TurboC,返回DOS状态.
建立一个新文件,可用光标移动键将"File"菜单中的光带移到"New"处,按回车键,即可打开编辑窗口.
此时,编辑窗口是空白的,光标位于编辑窗口的左上角,屏幕自动处于插入模式,可以输入源程序.
屏幕右上角显示缺省文件名为NONAME00.
CPP,编辑完成之后,可用F2或选择"Save"或"saveas"进行存盘操作,此时系统将提示用户将文件名修改成为所需要的文件名.
(2)源程序的编译、连接直接按F9键,或将菜单"Compile"中的光带移到"Make"项上,按回车键,就可实现对源程序的编译、连接.
若有错误,则在信息窗口显示出相应的信息或警告,按任意键返回编辑窗口,光标停在出错位置上,可立即进行编辑修改.
修改后,再按F9键进行编辑、连接.
如此反复,直到没有错误为止,即可生成可执行文件.

注意:C程序的连接是在编译后自动完成的.
(3)执行程序直接按Ctrl+F9键,即可执行.
EXE文件;或在主菜单中(按F10进入主菜单)将光带移到"Run"选项,按回车键,弹出一个菜单,选择"Run"选项,回车.
这时并不能直接看到输出结果.
输出结果是显示在用户屏幕上,在TC屏幕上看不到,直接按复合键Alt+F5,或选择"Windows"菜单中的"UserScreen"选项,即可出现用户屏幕,查看输出结果.
按任意键返回TC集成环境.
另外,选择"Run"菜单下的"Run"项,或直接按Ctrl+F9键,可将C程序的编译、连接、运行一次性完成,即第3步中包含有第2步的工作.
如果程序需要输入数据,则在运行程序后,光标停留在用户屏幕上,要求在用户输入数据,数据输入完成后程序继续运行,直至输出结果.
如果运行结果不正确或其他原因需要重新修改源程序,则需重新进入编辑状态.
修改源程序,重复以上步骤,直到结果正确为止.

(4)退出TurboC集成环境退出TurboC环境,返回操作系统状态.
可在主菜单选择"File"菜单的"Quit"选项,或者直接按Alt+x.
在执行退出TurboC环境时,系统将检查一下当前编辑窗口的程序是否已经存盘,若未存盘,系统将弹出一个提示窗口,提示是否将文件存盘,若按"Y"则将当前窗口内的文件存盘后退出;若按"N"则不存盘退出.

程序举例【例1】编程实现在屏幕上显示如下三行文字Hello,world!
WolcometotheClanguageworld!
Everyonehasbeenwaitingfor.
在TurboC的集成环境下,键入如下源文件.
敲Alt+F组合键打开File菜单,第一次存盘时File菜单中save选项可将默认noname00.
cpp文件名改为任意文件名,若第二次存盘要修改文件名及路径,则需使用File菜单中的Saveas.
程序example.
c如下:#includevoidmain(){printf("Hello,World!
\n");printf("WolcometotheClanguageworld!
\n");printf("Everyonehasbeenwaitingfor.
\n");}然后用Ctrl+F9编辑执行example.
c,用Alt+F5查看结果,即在屏幕上显示题目要求的三行文字.
按回车键重新返回TurboC的编辑环境.
注意,在运行程序之前最好先存盘.
【例2】输入并运行程序,写出运行结果.
#includevoidmain(){inta,b,sum;a=123;b=456;sum=a+b;printf("sumis%d\n",sum);}运行方法同上,最后结果为:sumis579.
【例3】输入并运行程序,写出运行结果.
#includeintmax(intx,inty);voidmain(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("max=%d",c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}这个程序的功能是对于任意输入的两个整数,输出较大的那个数.
所以程序运行之后,光标将停留在用户屏幕上,等待用户输入两个整数,比如输入"3,5",回车,在用户屏幕上就会输出"max=5".

三、实验内容在C:盘的根目录下以自己姓名拼音缩写为名建立一个子目录;输入以下源程序,运行并查看结果,将源程序文件命名为hello.
c存放到所建目录下.
/*HELLO.
C--Hello,world*/#includemain(){printf("Hello,world\n");}将以上源程序输入存盘后,按以下步骤调试:按F9编译,编译系统检查源程序是否有错,如果有错则在编辑窗口下方显示错误,此时需根据错误提示修改源程序中的语法错误,直到编译成功为止.
按Ctrl+F9执行.
程序执行后,似乎没有结果,此时应按步骤3)查看结果.
按Alt+F5查看结果,按任意键返回到编辑状态.
提示:C语言源程序的调试都按照以上步骤调试运行.
输入以下程序,将其命名为test.
c存放到C:\TC目录下.
该源程序有错,请调试修改正确.
main(){inta=2,b=c=3;sum=a+b+cprintf("%d",sum);}以下程序的功能是交换变量num1和num2的值,所给源程序有错,按要求调试程序并改错.
(注意:程序左边的序号表示程序的行数,不是程序的内容,输入源程序时无需输入.
)main(){intnum1,num2;num1=2;num2=3;printf("num1=%d,num2=%d\n",num1,num2);num1=num2;num2=num1;printf("num1=%d,num2=%d\n",num1,num2);}调试练习要求:①按F8单步执行该程序.
每按一次F8程序执行一条语句,观察编辑窗口和程序执行的结果.
②在程序的第六行设置断点,按Ctrl+F9执行程序,查看程序执行结果,若要将程序执行完毕,应怎样操作③清除断点.
④向监视窗口添加监视表达式num1、num2,单步执行程序,观察变量num1和num2值的变化,由此可检查出程序出错的原因.
四、实验报告总结写出以下编辑源程序的方法:编辑一个新的源程序;调出一个已有源程序进行编辑;如何将源程序存到指定的目录;编辑、调试程序的详细步骤.
实验二数据类型、运算符与表达式一、实验目的掌握C语言数据类型,熟悉各种数据类型的定义和赋值.
掌握表达式值的计算方法与计算原则.
学会使用C的有关算术运算符,特别是自加(++)和自减(――)运算符的使用.
进一步熟悉C程序的编辑、编译、连接和运行的过程.
二、实验指导变量的定义与初始化在C语言中,要求对所有用到的变量,必须先定义、后使用;(1)变量定义的一般格式[存储类型]数据类型变量名[,变量名2……];例如,floatradius,length,area;(2)变量初始化的一般格式变量的初始化是指在定义变量的同时进行赋初值的操作.
[存储类型]数据类型变量名[=初值][,变量名2[=初值2]……];例如,floatradius=2.
5,length,area;如下变量的定义与初始化是错误的:floatradius=length=2.
5;因为在定义同一数据类型的变量时,各变量名之间必须用逗号分隔.
标识符定义规则简单地说,标识符就是一个名字.
在C语言中,符号常量、变量名、函数名、文件名等都称为标识符,它们都遵循标识符的命名规则:⑴有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头.
⑵有效长度:随系统而异,但至少前8个字符有效.
如果超长,则超长部分被舍弃.
⑶C语言的关键字不能用作变量名.
标识符命名的良好习惯见名知意:所谓"见名知意"是指,通过变量名就知道变量值的含义.
通常应选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名.
例如,name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资).
变量的赋值变量的赋值是用赋值运算符给变量赋值,这与变量的初始化不同.
例如:main(){inta,b;a=2;b=3;/*两条赋值语句的作用是分别使变量a的值为2,b的值为3*/……}将以上程序改为:main(){inta,b;a=b=2;/*一条赋值语句使a、b的值都为2*/……}运算符的使用C语言中有十分丰富的运算符,除控制语句和输入输出函数外,其它所有基本操作都作为运算符处理.
有些运算符对于运算对象有特殊要求:(1)%(求余运算符)要求两侧的操作数均为整型数据,否则出错.
例如:floatx;inty;y=x%y;在上述程序段中,x为浮点型数据,就不能作为%的运算对象.
(2)/(相除运算符)两个整数相除,其商为整数,小数部分被舍弃.
两个数有一个为实数,则结果为double型.
例如:5/2=2.
5.
0/2=2.
5又如:floata=5;a=a/2;/*a的值为2.
5*/(3)自增(++)、自减(--)运算符自增运算使单个变量的值增1,自减运算使单个变量的值减1.
前置运算运算符放在变量之前:++变量、--变量先使变量的值增(或减)1,然后再以变化后的值参与其它运算,即先增减、后运算.
后置运算运算符放在变量之后:变量++、变量--变量先参与其它运算,然后再使变量的值增(或减)1,即先运算、后增减.
例:intx,y;x=6;y=++x;/*y=7*/y=x--;/*y=7*/注意:自增、自减运算符,不能用于常量和表达式.
例如,5++、--(a+b)等都是非法的.
表达式求值表达式的求值原则:1)按运算符的优先级高低次序执行.
例如,先乘除后加减.
2)如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向(结合性)进行.
三、实验内容计算以下各表达式的结果并上机验证计算结果是否正确.
25/3%33.
5+1/2+56%10若有定义:intb=7;floata=2.
5,c=4.
7;a+(int)(b/3*(int)(a+c)/2)%4若有:intx,y,z执行语句:x=(y=(z=10)+5)-5;x=y=z=x,a均是整型执行x=(a=4,6*2)后,x的值是多少执行x=a=4,6*2后,x的值是多少若有:intx=5,n=5;执行x+=n++后,x=,n=读以下源程序,写出输出结果并上机验证,想一想为什么会有这样的结果main(){charch1,ch2;ch1='a';ch2='B';printf("ch1=%c,ch2=%c\n",ch1-32,ch2+32);printf("ch1+200=%d\n",ch1+200);printf("ch1+200=%c\n",ch1+200);printf("ch1+256=%d\n",ch1+256);printf("ch1+256=%c\n",ch1+256);}3.
分析下程序,写出运行结果,再输入计算机运行,将得到的结果与你分析得到的结果比较对照.
#include"stdio.
h"voidmain(){inti,j,m,n;i=8;j=10;m=++i;n=j++;printf("%d,%d,%d,%d",i,j,i++,j++);}分别作以下改动之后,先分析再运行:1)将第四行改为:m=i++;n=++j;2)程序改为:main(){inti,j;i=8;j=10;printf("%d,%d",i++,j++);}3)在2)的基础上,将printf语句改为:printf("%d,%d",++i,++j);4)再将printf语句改为:printf("%d,%d,%d,%d",i,j,i++,j++);5)程序改为:main(){inti,j,m=0,n=0;i=8;j=10;m+=i++;n-=--j;printf("i=%d,j=%d,m=%d,n=%d",i,j,m,n);}此程序主要考查自加、自减运算符以及复合运算符的用法.
编程实现:输入一个华氏温度,要求输出摄氏温度.
公式为c=5.
0/9.
0*(f-32).
实验三数据的输入、输出一、实验目的掌握简单的程序设计,能正确写出顺序结构的源程序.
掌握数据的输入输出方法,能正确使用各种格式转换符.
二、实验指导赋值语句赋值语句是由赋值表达式加上一个分号构成,作用是将一个确定的值赋给一个变量.
格式为:变量名=表达式;赋值语句有如下特点:⑴先计算,后赋值.
先计算表达式的值赋给赋值号左边的变量.
⑵赋值语句中的"="是赋值号不是数学意义的等号,赋值号两侧的内容不能任意调换.
①main(main(){inta,b;inta,b;a=1;b=2;a=1;b=2;a=b;b=a;printf("%d%d",a,b)printf("%d%d",a,b)程序①a和b的值都是2,程序②中a,b的值都是1.
注意:赋值运算符的左边只能是变量名,不能是表达式或常量数据输入函数getchar()函数此函数的功能是等待输入直到按回车才结束,回车前的所有输入字符都会逐个显示在屏幕上.
但只有第一个字符作为函数的返回值.
例如:#include#includemain(){charc;c=getchar();/*从键盘读入字符直到回车结束*/putchar(c);/*显示输入的第一个字符*/输入:abc↙程序运行后变量c的值为'a'scanf()函数其调用格式为:scanf("",);地址表是需要读入的所有变量的地址,而不是变量本身.
在使用该函数输入数据时,常见的错误主要有以下几种类型:输入列表中,变量名前忘记加取地址符号&.
如:scanf("%d,%d",a,b);(此语句有错)改为:scanf("%d,%d",&a,&b);格式控制字符与变量的类型不一致.
floata,b;scanf("%d,%d",&a,&b);(此语句有错)改为:scanf("%f,%f",&a,&b);输入数据的格式与scanf()函数中的格式控制字符串不一致scanf("%d,%d",&a,&b)输入数据:34(此输入有错)应改为:3,4以上几种常见错误都会导致输入的数据不能正确地存放到相应的变量中.
数据输出函数putchar()函数putchar()函数是向标准输出设备输出一个字符,其调用格式为:putchar(ch);其中ch为一个字符变量或常量.
putchar()函数的作用等同于printf("%c",ch);注意:该输出函数调用一次只能输出一个字符,要输出多个字符必须调用多次.
printf()函数printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息.
printf()函数的调用格式为:printf("",);该函数中格式字符的使用十分复杂,现举例说明其常用的格式控制:#includeintmain(){charc;inta=1234;floatf=3.
141592653589;doublex=0.
12345678987654321;c='\x41';printf("a=%d\n",a)结果输出十进制整数a=1234*/printf("a=%6d\n",a);/*结果输出6位十进制数a=1234*/printf("a=%06d\n",a);/*结果输出6位十进制数a=001234*/printf("a=%2d\n",a);/*a超过2位,按实际值输出a=1234*/printf("f=%f\n",f)输出浮点数f=3.
141593*/printf("f=%6.
4f\n",f);/*输出6位其中小数点后4位的浮点数f=3.
1416*/printf("x=%lf\n",x);/*输出长浮点数x=0.
123457*/printf("x=%18.
16lf\n",x);/*输出18位其中小数点后16位的长浮点数x=0.
1234567898765432*/printf("c=%c\n",c)输出字符c=A*/printf("c=%x\n",c)输出字符的ASCII码值c=41*/}三、实验内容先读下列程序,写出程序运算结果,再将该程序输入并运行,观察运行结果与你所写的结果是否相同.
①main(){intx,y,z;x=y=2;z=3;y=x++-1;printf("%d\t%d\t",x,y);y=++x-1;printf("%d\t%d\t",x,y);y=z--+1;printf("%d\t%d\t",z,y);y=--z+1;printf("%d\t%d\n",z,y);}②main(){charc1='a',c2='b',c3='c',c4='\101',c5='\116';printf("a%cb%c\tc%c\tabc\n",c1,c2,c3);printf("\tb%c%c",c4,c5);}以下各程序需要输入数据,请写出输入数据的格式和变量的值并上机验证.
#includevoidmain(){inta,b,c;printf("inputa,b,c\n");scanf("%d%d%d",&a,&b,&c);printf("a=%d,b=%d,c=%d",a,b,c);}注意&的用法,在本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值.
执行scanf语句,则退出TC屏幕进入用户屏幕等待用户输入.
用户输入7、8、9后按下回车键,此时,系统又将返回TC屏幕.
在scanf语句的格式串中由于没有非格式字符在"%d%d%d"之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔.
如:789或789②main(){inti,j;printf("i,j=\n");scanf("%d,%d",&i,&j);}③scanf("%d,%*d,%d",&a,&b);若输入:3,4,5a=b=④scanf("%3d%2d",&a,&b);若输入:12345a=b=⑤按格式要求输入/输出数据#include"stdio.
h"#include"string.
h"main(){inta,b;floatx,y;charc1,c2;scanf("a=%d,b=%d",&a,&b);scanf("%f,%e",&x,&y);getchar();scanf("%c%c",&c1,&c2);printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n",a,b,x,y,c1,c2);}运行该程序,必须按如下方式在键盘上输入数据a=3,b=7↙8.
5,71.
82↙aA↙请同学们写出输出结果编写程序:输入两个数a、b,交换它们的值,然后输出交换后结果.
实验四选择结构程序设计一、实验目的了解C语言表示逻辑量的方法(以0代表"假",以1代表"真").
熟练掌握if语句和switch语句二、实验指导在TurboC中条件语句的一般形式为:if(表达式)语句1;else语句2;在写程序过程中,对于条件语句的使用需注意以下几点:表达式该表达式可以是任何表达式,条件语句判断条件成立与否是根据表达式的结果来判断,如果表达式值为0则条件不成立,表达式值为非0则条件成立.
条件语句中,表达式的书写常出错的几点:(1)常将"=="写成"="如:判断变量a是否等于一个常数的语句if(a=5)printf("\n");表达式a=5是赋值表达式,该表达式的值始终为5(即非0),则条件始终成立,条件判断失去意义.
应改为:if(a==5)printf("\n");(2)表达式必须用括号扩起来,常漏写括号如:ifa==5printf("\n");漏写括号后会出现语法错误"{"和"}"在条件语句中的使用如果语句1或语句2有多于一条语句要执行时,必须使用"{"和"}"把这些语句包括在其中,此时条件语句形式为:if(表达式){语句体1;}else{语句体2;}如:if(a>b)t=a;a=b;b=t;/*条件成立后执行t=a,其余的语句与条件无关*/若条件成立执行三条赋值语句,则必须用"{"和"}"把这些语句包括在其中:if(a>b){t=a;a=b;b=t;}条件语句嵌套条件嵌套语句容易出错,其原因主要是不知道哪个if对应哪个else.
例如:if(x>20||xx)printf("Good");elseprintf("Bad");TurboC规定:else语句与最近的一个if语句匹配,上例中的else与if(yx)相匹配.
为了使else与if(x>20||x20||xx)printf("Good");elseprintf("Bad");随着语句越来越复杂,语句行的增加,源程序的阅读也越来越困难,通常为了使源程序的结构更加清晰,便于阅读,源程序的书写常用锯齿形的写法,按使语句执行的逻辑关系对齐.
锯齿形的写法如下所示:switch语句语句格式为:switch(表达式)case常量1:语句1或空;case常量2:语句2或空;case常量n:语句n或空;default:语句n+1或空;}在使用switch语句必须注意:表达式的结果是整型或字符数据类型每个case或default后的语句可以是语句体,但不需要使用"{"和"}"括起来.
语句中的"{"和"}"不能少程序举例【例1】输入某学生的成绩,经处理后给出学生的等级,等级分类如下:90分以上(包括90):A80至90分(包括80):B70至80分(包括70):C60至70分(包括60):D60分以下:E方法一:(用if嵌套`)分析:由题意知如果某学生成绩在90分以上,等级为A;否则,如果成绩大于80分,等级为B;否则,如果成绩大于70分,等级为C;否则,如果成绩大于60分为D;否则,如果成绩小于60分,等级为E;但当我们输入成绩时也可能输错,出现小于0或大于100,这时也要做处理,输出出错信息.
因此,再用if嵌套前,应先判断输入的成绩是否在0~100之间.

#include"stdio.
h"voidmain(){floatscore;chargrade;printf("\npleaseinputastudentscore:");scanf("%f",&score);if(score>100||score=90)grade='A';else{if(score>=80)grade='B';else{if(score>=70)grade='C';else{if(score>=60)grade='D';elsegrade='E';}}}printf("\nthestudentgrade:%c",grade);}}输入测试数据,调试程序.
测试数据要覆盖所有路径,注意临界值,例如此题中得100分,60分,0分以及小于0和大于100的数据.
方法二:用switch语句分析:switch语句是用于处理多分支的语句.
注意,case后的表达式必须是一个常量表达式,所以在以用switch语句之前,必须把0~100之间的成绩分别化成相关的常量.
所有A(除100以外),B,C,D类的成绩的共同特点是十位数相同,此外都是E类.
则由此可得把score除十取整,化为相应的常数.

#include"stdio.
h"main(){intg,s;charch;printf("\ninputastudentgrade:");scanf("%d",&g);s=g/10;if(s10&&g!
=100)printf("\ninputerror!
");elseif(g==100)s=10;{switch(s){case10:case9:ch='A';break;case8:ch='B';break;case7:ch='C';break;case6:ch='D';break;default:ch='E';}printf("\nthestudentscort:%c",ch);}}输入测试数据,同方法一一样调试程序并写出结果.
根据上机调试过程中的体会,你认为if语句、switch语句在使用过程中应注意什么三、实验内容1.
以下几段源程序有错,请调试修改正确.
①/*源程序实现的功能:输入两个实数,按从小到大的顺序输出*/main(){floata,b,t;scanf("%f,%f",&a,&b);if(a>b)t=a;a=b;b=tprintf("%5.
2f,%5.
2f",a,b);}②该源程序实现的功能是:有如下函数关系:(x(x>0)y=(2(x=0)(3x(x0y=x;elseif(x=0)y=2;elsey=3*x;printf("x=%dy=%d\n",x,y);}2.
有一函数:用scanf()函数输入x值,求函数y的值画出程序流程图,列出源程序清单和调试过程中的测试数据、输出结果.
3.
某物品原有价值为p,由于使用使其价值降低,价值的折扣率根据时间t(月数)确定如下:t=21,10%折扣编程实现:根据输入的时间和原有价值计算物品的现有价值.
4.
给一个不多于5位的正整数,要求:①求出它是几位数;②分别打出每一位数字;③按逆序打出各位数字,例如原数为321,应输出123四、思考题c语言如何表示"真"与"假"系统如何判断一个量的"真"与"假"写出下面各逻辑表达式的值.
设a=3,b=4,c=5(1)a+b>c&&b==c(2)a||b+c&&b-c(3)!
(a>b)&&!
c||1(4)!
(x=a)&&(y=b)&&0(5)!
(a+b)+c-1&&b+c/2实验五循环语句一、实验目的掌握while语句,do-while和for语句的用法.
掌握在程序设计中用循环的方法实现各种算法(如穷举、迭代、递推等).
二、实验指导for循环它的一般形式为:for(表达式1;表达式2;表达式3)语句;通常又可将三个表达式看作以下形式:for(;;)语句;①初始化总是一个赋值语句,它用来给循环控制变量赋初值;②条件表达式是一个关系表达式,它决定什么时候退出循环;③增量定义循环控制变量每循环一次后按什么方式变化.
这三个部分之间用";"分开.
例如:for(i=1;i10时,结束循环.
注意:for循环中语句可以为语句体,但要用"{"和"}"将参加循环的语句括起来.
for循环中的"初始化"、"条件表达式"和"增量"都是选择项,即可以缺省,但";"不能缺省.
省略了初始化,表示不对循环控制变量赋初值.
省略了条件表达式,则不做其它处理时便成为死循环.
省略了增量,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句.
在for循环体内也允许空语句.
例如:for(i=1;imain(){charc;c='\0'初始化c*/while(c!
='\n')/*回车结束循环*/c=getchar(带回显的从键盘接收字符*/}上例中,while循环是以检查c是否为回车符开始,因其事先被初始化为空,所以条件为真,进入循环等待键盘输入字符;一旦输入回车,则c='\X0D',条件为假,循环便告结束.
与for循环一样,while循环总是在循环的头部检验条件,这就意味着循环可能什么也不执行就退出.
do-while循环do-while循环的一般格式为:do语句;while(条件);这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断条件是否为真,如果为真则继续循环;如果为假,则终止循环.
因此,do-while循环至少要执行一次循环语句.
同样当有许多语句参加循环时,要用"{"和"}"把它们括起来.
程序举例【例1】求和s=3+33+333#includevoidmain(){ints=0,t=3,i;for(i=1;i#includevoidmain(){intm,i,k;scanf("%d",&m);k=sqrt(m+1);for(i=2;i=k+1)printf("%disaprimenumber\n",m);elseprintf("%disnotaprimenumber\n",m);}【例3】一个数如果恰好等于它的因子之和,这个数就称为完数,例如:6=1+2+3.
求100之内的所有完数.
#includevoidmain(){intn,s,j;for(n=1;nvoidmain(){inti,j;for(i=1;i='A'&&c='a'&&ca[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}printf("thearrayaftersort:\n");for(i=0;ivoidmain(){charc[30];inti,sum=0;gets(c);for(i=0;ivoidmain(){chara[5]inti,j,k;charspace='';for(i=0;imain(){inta[10];inti,j,t;printf("intput10numbers:\n");for(i=0;iyx:y);}这个程序初看起来没有什么问题,但在编译时有出错信息.
原因是max函数是实型的,而且在main函数之后才定义,也就是max函数的定义位置在main函数中的调用max函数之后.
改错的方法可以用以下二者之一:A.
在main函数中增加一个对max函数的声明,即函数的原型;B.
将max函数的定义位置调到main函数之前.
请注意:函数在调用之前不先定义就得先声明.
③误认为形参值的改变会影响实参的值.
忘了值的"单向传递",请特别注意.
main(){inta,b;a=3;b=4;swap(a,b);printf("%d,%d\n",a,b);}swap(intx,inty)(intt;t=x;x=y;y=t;}原意是通过调用swap函数使a和b的值对换,然后在main函数中输出已对换了值的a和b.
但是这样的程序是达不到目的的,因为x和y的值的变化是不传送回实参a和b的,main函数中的a和b的值并未改变.

④函数的实参和形参类型不一致.
main(){inta=3,b=4;c=fun(a,b);}floatfun(floatx,floaty){}实参a、b为整型,形参x、y为实型.
a和b的值传递给x和y时,x和y的值并非3和4.
C语言要求实参与形参的类型一致.
⑤函数的原型声明和函数的定义不一致.
如:intfun(int,int);/*错误的*/main(){inta=3,b=4;floatc;c=fun(a,b);}fun(floatx,floaty){}在声明中可能出现返回类型、形参类型不一致,还可能出现形参的个数不一致.
为了避免这种情况,希望大家在对函数进行声明时,其语句与定义时的函数头一致;⑥局部变量当全局变量使用,即在一个函数内部定义的变量,试图在函数调用结束后能通过局部变量返回一个值.
⑦在函数的递归调用中一定要有一个出口,如求阶乘的递归函数floatfac(intn){floatf;if(n==0||n==1)f=1;/*出口语句*/elsef=fac(n-1)*n;return(f);}在这里:if(n==0||n==1)f=1;这一句一定不能少,否则成死循环.
程序举例【例1】写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息.
源程序如下:#includevoidmain(){intnumber;printf("请输入一个正整数:\n");scanf("%d",&number);if(prime(number))printf("\n%d是素数.
",number);elseprintf("\n%d不是素数.
",number);}intprime(intnum)/*此函数用于判别素数*/{intflag=1,n;for(n=2;nvoidconvert(intarray[][]){inti,j,t;for(i=0;in2)swap(pointer1,pointer2);if(n1>n3)swap(pointer1,pointer3);if(n2>n3)swap(pointer2,pointer3);printf("thesortednumbersare:%d,%d,%d\n",n1,n2,n3);}swap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}【例2】:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组.
程序源代码:#includevoidmain(){intnumber[10];input(number);max_min(number);output(number);}voidinput(intnumber[]){inti;for(i=0;i*max)max=p;elseif(*pintmax,min;find(int*p,intn){int*q;max=min=*p;for(q=q++)if(max=*q;elseifmin=*q;}main(){inti,num[l0];printf("Input10numbers:\n");for(i=0;i成员名⑤用指针处理链表:malloc函数用法:void*malloc(unsignedintsize);分配size长度的空间;calloc函数用法:void*calloc(unsignedn,unsignedsize);分配n个size长度的空间;free函数用法:voidfree(void*p);释放由p指向的内存区.
⑥共用体定义:是将几种不同类型的变量存放到同一段内存单元中.
定义为:union共用体名{成员表列}变量表列;⑦共用体变量的引用:共用体变量名.
成员名;⑧枚举类型:定义如:enumweekday{sun,mon,tue,wed,thu,fri,sat}.
实验注意要点①混淆结构体类型与结构体变量的区别,对一个结构体类型赋值.
structworker{longintnum;charname[20];charsex;intage;};worker.
num=187045;strcpy(worker.
name,"dengwb");worker.
Sex='M';worker.
Age=l8;这是错误的,只能对变量赋值而不能对类型赋值.
上面只定义了structworker类型而未定义变量.
②结构体变量定义完成后,不要忽略了最后的分号,如:structstudent{intnum;charsex;intage;}就是错误的.
}后的分号掉了;③不要把结构体作为一个整体进行输入输出,如上面定义的结构体下面的操作是错误的:printf("%d,%c,%d\n",student);只能对其中的成员进行输入输出,而不能对其整体进行,这是同学们常犯的一个错误,当然,C语言允许两个同类型的结构体变量之间相互赋值.
在执行"stu2=stu1;"这个赋值语句时,将stu1变量中各个成员逐个依次赋给stu2中相应各个成员;④当p是指向一个结构体变量的指针时,*p.
num等价于*(p.
num)是错误的,应该写成(*p).
num.
因为.
的优先级大于*;⑤在用结构体指针处理链表时头指针一定不能掉;⑥在进行链表的动态处理时,当定义了一个指针变量后,一定要用malloc()或calloc()函数分配存储空间,否则将产生致命的错误.
如下面的程序段:structstudent*p1;scanf("%ld,%f",&p1->num,&p1->score);就是严重错误的,因为p1指针是悬空的.
应该改为:structstudent*p1;p1=(structstudent*)malloc(sizeof(structstudent));/*分配空间*/scanf("%ld,%f",&p1->num,&p1->score);⑦要用NULL代表空时,一定要定义#defineNULL0;否则将产生错误;⑧在枚举类型中,编译系统按定义时的顺序合它们的值为0,1,2,…….
程序举例【例1】给结构变量赋值并输出其值.
程序源代码:#includevoidmain(){structstu{intnum;char*name;charsex;floatscore;}boy1,boy2;boy1.
num=102;boy1.
name="Zhangping";printf("inputsexandscore\n");scanf("%c%f",&boy1.
sex,&boy1.
score);boy2=boy1;printf("Number=%d\nName=%s\n",boy2.
num,boy2.
name);printf("Sex=%c\nScore=%f\n",boy2.
sex,boy2.
score);}本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量.
用scanf函数动态地输入sex和score成员值,然后把boy1的所有成员的值整体赋予boy2.
最后分别输出boy2的各个成员值.
本例表示了结构变量的赋值、输入和输出的方法.
【例2】计算学生的平均成绩和不及格的人数.
#includestructstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.
5},{103,"Hefang",'F',92.
5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};voidmain(){inti,c=0;floatave,s=0;for(i=0;inum!
=0,而且输入的是第一个结点的数据(n==1)时,则令head=p1,使head指向新开辟的结点.
该结点即为链表的头结点.
(4)、类似地,再开辟另一个结点并使p1指向它,读入该结点的数据.
(5)、如此循环,开辟若干结点并链接起来,直到pl->num==0为止.
2、程序填空并调试:有5名学生,每个学生的数据信息包括学号、姓名和一门课的成绩.
要求按学生的成绩由高到低排序,然后输出学生的信息以及平均成绩.
#includestructstudent{intnum;charname[20];intscore;}stu[5];main(){structstudent*pt,*p[5];inti,j,k,sum=0;for(i=0;i>):与左移运算符相反,">>"的作用是使一个数的各个位全部右移若干位,右移出去的位丢失,对无符号的int型或char型数据来说,右移时左端补零,对带符号的int型,如果是正数,则左边也是补0,如果是负数,则全补1.
如:3>>2=00000011>>2=00000000=0.

文件的操作(1)、文件类型指针:要调用一个文件,需要有以下的信息:文件当前的读写位置;与该文件的内存缓冲区的地址;缓冲区中未被处理的字符数;文件操作方式等.
缓冲区文件系统为每一个文件开辟了一个"文件信息区",用来存放以上这些信息.
在内存中是一个结构体变量,定义为:FILE.

如可以定义文件类型指针fp,FILE*fp;(2)、文件打开(fopen())和文件关闭(fclose())函数A、作用:fopen():用于打开一个文件;fclose():用于关闭一个已经打开的文件.
B、用法:fopen(文件名,文件使用方式);如fopen("file1","r");表示以只读方式打开文件file1;fclose(文件指针变量);如fclose(*fp);(3)、文件的顺序读写函数fputc(),fgetc(),fgets(),fputs()fputc(ch,fp):是把字符变量ch的值输出到指针变量fp所指向的FILE结构体的文件中;fputs(str,fp):是把字符数组str中的字符串(或字符指针指向的串,或字符串常量)输出到fp所指向的文件.
但字符串结束符"\0"不输出;fgetc(fp):是从指针变量fp所指向的文件中读入一个字符并赋给字符变量ch;fgets(str,n,fp):是从fp指向的文件读取n-1个字符,并把它放到字符数组str中.
(4)、fread()和fwrite()函数fread(buffer,size,count,fp):表示从fp所指的文件中读count个长为size的数据块到buffer中.
如:fread(&stud[i],sizeof(structstudent_type),1,fp);fwrite(buffer,size,count,fp):表示将buffer中的数据块,以size为单位长度,输出count次到以fp所指的文件中.
如fwrite(&stud[i],sizeof(structstudent_type),1,fp);(5)、fprintf()和fscanf()函数fprintf(文件指针,格式字符串,输出表列),其作用是将输出列表中的数据以格式字符串中所表示的格式输出到文件指针所指向的文件中.
如:fprintf(fp,"%d,%3.
2f",i,m);fscanf(文件指针,格式字符串,输出表列),其作用是将文件指针所指向的文件中的数据以格式字符串中所表示的格式输出到输出表列中.
如:fscanf(fp,"%d,%f",&i,&t).

ParkInHost - 俄罗斯VPS主机 抗投诉 55折,月付2.75欧元起

ParkInHost主机商是首次介绍到的主机商,这个商家是2013年的印度主机商,隶属于印度DiggDigital公司,主营业务有俄罗斯、荷兰、德国等机房的抗投诉虚拟主机、VPS主机和独立服务器。也看到商家的数据中心还有中国香港和美国、法国等,不过香港机房肯定不是直连的。根据曾经对于抗投诉外贸主机的了解,虽然ParkInHost以无视DMCA的抗投诉VPS和抗投诉服务器,但是,我们还是要做好数据备...

webhosting24:€28/年,日本NVMe3900X+Webvps

webhosting24决定从7月1日开始对日本机房的VPS进行NVMe和流量大升级,几乎是翻倍了硬盘和流量,当然前提是价格依旧不变。目前来看,国内过去走的是NTT直连,服务器托管机房应该是CDN77*(也就是datapacket.com),加上高性能平台(AMD Ryzen 9 3900X+NVMe),这样的日本VPS还是有相当大的性价比的。官方网站:https://www.webhosting...

TmhHost香港三网CN2 GIA月付45元起,美国CN2 GIA高防VPS季付99元起

TmhHost是一家国内正规公司,具备ISP\ICP等资质,主营国内外云服务器及独立服务器租用业务,目前,商家新上香港三网CN2 GIA线路VPS及国内镇江BGP高防云主机,其中香港三网CN2 GIA线路最低每月45元起;同时对美国洛杉矶CN2 GIA线路高防及普通VPS进行优惠促销,优惠后美国洛杉矶Cera机房CN2 GIA线路高防VPS季付99元起。香港CN2 GIA安畅机房,三网回程CN2 ...

缓存文件写入失败为你推荐
行业关键词企业应如何做关键词排名依赖注入依赖注入是什么意思?微信如何建群微信如何建群ps抠图技巧photoshop最基本的抠图方法和技巧!申请证书一、如何申请证书?网易公开课怎么下载手机上的网易公开课的付费课程怎么下载??????qq怎么发邮件怎样在QQ上发送邮件?idc前线钢铁雄心2修改器iphone6上市时间苹果6什么时候出来网管工具网吧管理软件都有哪些?
免费二级域名注册 directspace 香港cdn iisphpmysql iis安装教程 魔兽世界台湾服务器 免费ftp空间申请 美国网站服务器 国外免费asp空间 新世界服务器 vul lamp架构 成都主机托管 江苏徐州移动 阵亡将士纪念日 新网dns linux命令vi 腾讯qq空间登录首页 六维空间登陆首页 更多