高级语言程序设计第五次作业
高级语言程序设计第五次作业
一、getchar和putchar的使用
设计一个getchar和putchar联合使用的程序,使得程序遇到空格符时结束。

要注意,while ((ch = getchar()) != ' ')一定要加里面的括号,否则!=关系运算符的优先级高于=赋值运算符,这样就没办法赋值了。
二、重定向输入输出
建立一个in.txt和out.txt,分别使用这两个文件进行重定位代替键盘输入和屏幕输出,in.txt存放一些字符小写字符,大写字符,数字字符,程序将这些小写字符转换成大写字符,然后全部输出到out.txt。





步骤:在devcpp相应的文件夹里找到程序的exe可执行文件,在上方文件路径中打开cmd,先找exe文件,在进行重定向输入输出。<in.txt表示输入>out.txt表示输出。
三、键盘输入四则运算
从键盘上输入数据并进行加、减、乘、除四则运算(以“a运算b”的形式输入),判断输入的数据是否可以进行计算,若能计算,则输出计算结果,保留小数点后2位,否则显示“wrong input”。另外,碰到除数为0是能提示“division by zero”。形式参考第八章PPT18页。

四、混合读入字符、数值
混合读入字符、数值,形式参考第八章PPT19页。
问题描述:
先读入一个字符,再读入一个整数,最后又读入一个字符;然后分别输出它们
输入格式:n个空格和/或<回车>,一个字符,m个空格和/或<回车>,一个整数,k个空格和/或<回车>,一个字符
输出格式:字符整数字符


关键点:格式控制字符串里的 “空格+%c” 并不是两个独立的记号,而是 “一个(或多个)空白符” + “%c”。
在 scanf 的格式串里,一个空白字符会匹配输入中 任意数量(包括 0 个) 的空白字符。
也就是说,它把前面可能残留的换行、空格、制表符等全部“吃掉”,直到遇到第一个非空白字符为止。
五、编写并运行书本第8章8.11编程练习题目中的第3~7题。
3、统计大小写字母数量
错误点:统计、累加等问题都要记得赋初值!!!
思路:用islower判断是否为小写字母,用isupper判断是否为大写字母

4、报告平均每个单词的字母数
思路:利用isalpha判断是否为字母,每个字母用空格隔开,最后用字母数/空格数+1就是平均单词字母数。

5、二分查找
思路:每次猜一个数,如果太小了就把这个数作为新的最小值,如果太大了就作为新的最大值


6、读取第一个非空白字符
思路:在循环里用isblank的返回值来判断,如果输入的是空白字符,就不进行任何操作,如果读取到第一个非空字符就不执行while循环,因为getchar这时候只有一个,不论后面跟多少个字符都是只输出第一个,符合题目要求。

7、改程序,计算工资



遇到的问题:下一次循环的时候莫名其妙多循环了一次
原因:将数字换成字符就出现了问题,是因为\n也算字符。因为菜单打印语句放进了 while (1) 循环体里,而循环末尾没有清空输入缓冲区里残留的 '\n',导致scanf("%c") 下一次立刻读到回车,程序以为用户又按了一次 Enter,于是立刻重新打印一次菜单。
上一轮输入剩下的换行符被下一轮当成“空选择”读走了。
解决办法:在scanf里的%c前面加空格,使程序不读取\n

六、编写并运行书本第9章9.11编程练习题目中的第1~4,8,9,11题。
1、打印较小值

2、打印指定的字符j行i列

3、打印字符的行数和一行的次数

4、调和平均数

8、计算幂次
普通版:

9、第八题递归版:

递归流程分析
power_rec(2, 5)
= 2 * power_rec(2, 4) /* 第 1 层 */
= 2 * (2 * power_rec(2, 3)) /* 第 2 层 */
= 2 * (2 * (2 * power_rec(2, 2))) /* 第 3 层 */
= 2 * (2 * (2 * (2 * power_rec(2, 1)))) /* 第 4 层 */
= 2 * (2 * (2 * (2 * (2 * power_rec(2, 0))))) /* 第 5 层 */
每层把指数减 1,直到 0;
0 层给出基准值 1;
返回时把每层留下的 2 依次乘回去,得到 2⁵ = 32
11、计算斐波那契数列的第n位 循环版

七、设计一个多源代码文件程序的编译。例如,first.c源代码文件包含主函数和一些头文件(second.h),second.c源代码文件是一些自定义的函数功能实现,second.h文件是一些常量声明和second.c中自定义函数的函数原型声明。
first.c

second.c

second.h

总览:


devcpp编译不成功,后续再查明原因
八、编写一个程序,在该程序中输出主函数内定义的变量的地址,以及函数中定义的同名变量的地址。


有时会看到取地址的时候,会有(void*)&a出现


既然如此,就加吧

总结和思考
这次作业的主要问题是对于重定向的问题比较陌生,在网上搜步骤才最后理解,还有关于EOF的使用也比较陌生,还需要多加练习。其他没什么大问题😘😍❤️

浙公网安备 33010602011771号