C语言程序设计第三次作业

(一)改错题

  • 计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数。
  • 源程序(有错误的程序):
  • 错误信息1:
  • 错误原因及改正1:
    "y = 1 / x"后没有加";"构成完整语句,应在后面加上";"使之构成完整语句即可。
  • 错误信息2:
  • 错误原因及改正2:
    else后面不能跟条件,除了"x=10"之外就是"x!=10",直接用else 即可,把else后的条件删去即可。
  • 错误信息3:
  • 错误原因及改正3:
    if后加了";"构成一个语句使之后的"else"没有配对的"if",把if语句中的";"删去即可。
  • 错误信息4:
  • 错误原因及改正4:
    (1)未在x前和后面加","把变量分开,在x前和后加","即可。
    (2)要求保留一位小数,把"%.2f"改为"%.1f"和"%.lf"改为"%.1f"即可。
  • 经检查发现错误如下:
  • 错误信息5:

  • 错误原因及改正5:
    (1)引号内不能有"=",应把"="删去,此外,因为定义的x是double型,所以应把"%f"改为"%.lf"才正确。
    (2)地址表列处x未取地址符"&",应该在"x"前加"&"--"&x"即可。
    (3)用了赋值符号而没有用等号,应把"="改为"=="即可。
    (4)"enter x"与"10.0"已换行,把“n\”去掉即可。
  • 全部改正后带入几组数据进行运行计算如图:


    运行结果都与预期结果相符。
  • 正确的代源码如图:

(二)学习总结

  • if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
    所给的代码段"if(a)if(b) x=x+1;else y=y+1"应表示在满足a和b的条件下x=x+1,否则执行"else"后的语句,为"且"的条件,用"&&"表示,而根据else与最近的未配对if配对原则,else应与第二个if配对,同时为了保证运算中if条件句不出现错误,应在每个if句处用"{}"包含语句,所以改正后的代码段应如下所示:
  • C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
    对于题设所给的方式,显然不能取得想要的效果。因为在C语言中,逻辑运算符的合并性是从左至右的,在内部实际上是被转化为布尔值的,判断结果为0或1,即“true,false”。而以题设的“ (-10< x <10)”而言,当x大于-10为真时,x的值便被转换为1,根据结合性,x与右侧的10继续比较,显然成立。但若输入大于10的数,先与左侧的-10比较,显然为真,x被赋值为1,再与10比较,为真,但显然不符合逻辑。因此,只要输入任意大于-10的值,得到的结果都只能为真。因此无法表示(-10,10)这一区间。
    正确表达方式如下:
  • C语言中输入数据时,如果遇到非法字符,则认为输入结束。运行程序(1),输入123a,看看输出结果是什么?你能解释是为什么吗?
  • 程序(1)
  • 输入下列程序得到如图:

    可以看到在a之前输入停止,a被赋值123,而b则被赋值为没有输入的一个数字1,这是由于输入过程中如果遇到非法字符则会停止输入。在a后继续输入数字如图
  • 想要让a正确输入,经过查询得知,应该用适用于单个字符输出的%c代替b处的%d,如图:

    此时输入123a,a在"a"之前停止输入,值为123,a则被赋值给b,得到b=a如图:
  • 因为此时b已被定义为字符型,此时若输入数字则会出现与上面一样的问题,数字会被认为时非法字符,输入数字则会停止输入。做如下图试验

    结果与预期猜想一致,数字被当作非法字符而停止输入,从而说明输入遇到非法字符停止输入的问题。
  • scanf()函数的返回值是成功读入数据的个数,如果没有读取任何数据,则返回0。运行程序(2),分别输入123 45和123a,看看输出结果是什么?为什么?
  • 程序(2)
  • 输入123和45结果如图:
  • 根据题知scanf()函数的返回值是成功读入数据的个数,此处返回值为2,表示成功读入两个数据。
    而输入123a得到如下图结果:

    此时因为第一组数据有非法字符"a",导致输入被终止,所以成功导入的数据个数为1,因此输出为"n = 1"。
  • 修改程序(1),当输入非法数据时,输出“Input error!".
  • 由于第一组数据为123和45,第二组数据为123a,由程序(2)可以想到他们的scanf()返回值分别为1和2,由此可想到设另一个变量n来表示输入了非法字符与正确数据,程序如下图:

    此时分别输入数据123 45和123a,得到如下图:


    都与预期结果相符。
  • 小结:(1)注意字符常量和字符串常量的区别:字符常量是用单引号括起来的单个普通字符或转义字符,而字符串常量十用双引号括起来的字符序列,可包括多个字符。同时要注意不要把字符串赋给字符变量。字符变量输入输出时用"%c"表示。(2)字符常量值:该字符的ASCII码值。定义字符型变量用char来定义,包括0-255之间的整数。同时要记住char和int之间也可以进行运算。(3)如果强行结束一条语句可用"exit(0);"表示,此时要在前面加一个库文件 #include

(3)实验总结

  • 3题:(1)判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。
  • 输入格式:
    直接输入一个5位数正整数。
  • 输出格式:
    输出“yes”或“no”。此处均为小写字母
    (2)流程图:

    (3)源代码:

    (4)测试数据及运行结果:


    (5)实验分析:
  • 问题1:不会计算个十百千万每一位的数字。
    解决办法:看PPT,问同学。
  • 5题计算火车运行时间:(1)本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
  • 输入格式:
    输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。
  • 输出格式:
    在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。
    (2)流程图:


    (3)源程序:

    (4)测试数据及运行结果:

    (5)实验分析:
  • 问题1:
    第一次做这个题的时候没有思路。
  • 解决办法:
    咨询老师和同学,并自己思考,从而解决了问题。
  • 问题2:
    对 if else 语句不是很熟练。
  • 解决办法:
    多多练习。
  • 7 三天打鱼两天晒网
    (1)题目:
    中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
    (2)流程图:

    (3)源程序:

    (4)测试数据及运行结果:


    (5)实验分析:
    本题没有问题。但是要搞清楚每个算式的目的。
    9.阶梯电价
    (1)题目:
    为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
    (2)流程图:

    (3)源程序:

    (4)测试数据及运行结果:

    (5)实验分析:
    本题没有问题。但要注意所定义的是int还是double。

(四)PTA提交列表


posted @ 2017-10-29 17:43  范马桶  阅读(1405)  评论(0编辑  收藏  举报