高级语言程序设计课程第八次个人作业

                         **高级语言程序设计课程第八次个人作业**
  • 这个作业属于哪个课程:
    https://edu.cnblogs.com/campus/fzu/2024C

  • 这个作业要求在哪里:
    https://edu.cnblogs.com/campus/fzu/2024C/homework/13307

  • 学号:102400108

  • 姓名:王馨怡
    作业内容:

  • 编写并运行书本第11章11.13编程练习题目中的第1~3,6,7题

  • 编写并运行书本第12章12.9编程练习题目中的第1~3,8,9题。
    一、编写并运行书本第11章11.13编程练习题目中的第1~3,6,7题。
    11.13.1
    题目:设计并测试一个函数,从输入中获取下n个字符(包括空白、制表符、换行符),把结果储存在一个数组里,它的地址被传递作为一个参数。

问题:
解决:

11.13.2
题目:修改并编程练习1的函数,n个字符后停止,或在读到第1个空白、制表符或换行符时停止,哪个先遇到哪个停止。不能只使用scanf()。

问题:输入数字后,无论如何都没有输出
解决:经过分析,我很快发现了我程序的bug,即输入数字后的 \n 被数组读入,导致a[0]='\n',所以不会有任何输出。
随后,我增加了一条语句,即if((ch=getchar())=='\n') putchar(ch); 来释放我输入的'\n',再输入字符串输入,问题解决。

11.13.3
题目:设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并丢弃输入行中的其余字符。该函数应该跳过第1个非空白字符前面的所有空白。将一个单词定义为没有空白、制表符或换行符的字符序列。

问题:
解决:

11.13.6
题目:编写一个名为is_within()的函数,
1️⃣接受一个字符和一个指向字符串的指针作为两个函数形参。
2️⃣ 如果指定字符在字符串中,该函数返回一个非零值(即为真)。否则,返回0(即为假)。
在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。

问题:
解决:

11.13.7
题目:strncpy(s1, s2, n)函数把s2中的n个字符拷贝至s1中,截断s2,或者有必要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不能以空字符结尾。该函数返回s1。自己编写一个这样的函数,名为mystrncpy()。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。

问题:当s2的长度是n或多于n,总是少输出一个字符
解决:在函数内当(s2+n-1)!='\0'的条件下,加上if((s1+k)=='\0') (s1+k)=(s2+k); 将空字符转换为s2的第n个字符,问题解决

二、编写并运行书本第12章12.9编程练习题目中的第1~3,8,9题。
12.9.1
题目:不使用全局变量,重写程序清单12.4

问题:
解决:

12.9.2
题目:在美国,通常以英里/加仑来计算油耗;在欧洲,以升/100 公里来计算。下面是程序的一部分,提示用户选择计算模式(美制或公制),然后接收数据并计算油耗。下面给出主程序。如果用户输入了不正确的模式,程序向用户给出提示消息并使用上一次输入的正确模式。
🍊 请提供pe12-2a.h头文件和pe12-2a.c源文件。
1️⃣源代码文件应定义3个具有文件作用域、内部链接的变量。一个表示模式、一个表示距离、一个表示消耗的燃料。
2️⃣get_info()函数根据用户输入的模式提示用户输入相应数据,并将其储存到文件作用域变量中。
3️⃣show_info()函数根据设置的模式计算并显示油耗。可以假设用户输入的都是数值数据。

下面是是一些输出示例:
Enter 0 for metric mode, 1 for US mode: 0
Enter distance traveled in kilometers: 600
Enter fuel consumed in liters: 78.8
Fuel consumption is 13.13 liters per 100 km.
Enter 0 for metric mode, 1 for US mode (-1 to quit): 1
Enter distance traveled in miles: 434
Enter fuel consumed in gallons: 12.7
Fuel consumption is 34.2 miles per gallon.
Enter 0 for metric mode, 1 for US mode (-1 to quit): 3
Invalid mode specified. Mode 1(US) used.
Enter distance traveled in miles: 388

Enter fuel consumed in gallons: 15.3
Fuel consumption is 25.4 miles per gallon.
Enter 0 for metric mode, 1 for US mode (-1 to quit): -1
Done.

问题:(1)不知道怎么创建项目,不知道怎么一起编译多个源文件
(2)不知道该如何定义具有文件作用域,内部链接的变量
(3)不知道如何“使用上一次输入的正确模式”
解决:(1)在哔哩哔哩找视频看,懂得了如何创建项目
(2)在pe12-2a.c源代码中直接定义三个变量,即为具有文件作用域,内部链接的变量
(3)在if语句中和if语句外分别加上:mode=Mode;Mode=mode即可。


12.9.3
题目:重新设计编程练习2,要求只使用自动变量。该程序提供的用户界面不变,即提示用户输入模式等。但是,函数调用要作相应变化。

问题:我觉得这一题涉及的知识面真的好广!我出现了很多问题:修改程序后编译一直过不了
解决:我发现是我的show_info函数传递参数的时候,一直传不过去res,然后试了好久,最后在main函数里头直接加了一个变量k,把res赋值给k,然后再传递k,这样才能实现函数。问题解决

12.9.8
题目:提供make_array()和show_array()函数的定义,完成该程序。make_array()函数接受两个参数,第1个参数是int类型数组的元素个数,第2个参数是要赋给每个元素的值。该函数调用malloc()创建一个大小合适的数组,将其每个元素设置为指定的值,并返回一个指向该数组的指针。show_array()函数显示数组的内容,一行显示8个数。

问题:还是没搞懂如何开辟动态内存
解决:在书中340~343有详细的介绍,弄懂例题,再尝试写程序,问题解决!

12.9.9
题目:编写一个符合以下描述的函数。
1️⃣首先,询问用户需要输入多少个单词。
2️⃣然后,接收用户输入的单词,并显示出来,使用malloc()并回答第1个问
题(即要输入多少个单词),创建一个动态数组,该数组内含相应的指向
char的指针(注意,由于数组的每个元素都是指向char的指针,所以用于储
存malloc()返回值的指针应该是一个指向指针的指针,且它所指向的指针指向char)。
3️⃣在读取字符串时,该程序应该把单词读入一个临时的char数组,使用malloc()分配足够的存储空间来储存单词,并把地址存入该指针数组(该数组中每个元素都是指向 char 的指针)。
4️⃣然后,从临时数组中把单词拷贝到动态分配的存储空间中。因此,有一个字符指针数组,每个指针都指向一个对象,该对象的大小正好能容纳被储存的特定单词。

下面是该程序的一个运行示例:
How many words do you wish to enter? 5
Enter 5 words now:
I enjoyed doing this exerise
Here are your words:
I
enjoyed
doing
this
exercise

问题:不知道怎么创建多个不同的大小刚好能容纳特定单词的数组;也不知道怎能清除缓冲区输入。
解决:(1)用二维数组储存每一个单词,并且if(tmp[i]==' '),则words[j][k]='\0';j++;k=0;指向下一行,存储新单词。
(2)上网搜索资料,发现了fflush(stdin)可以清空缓冲区,刚好是我想要的!

总结思考:
1.这次的作业我有很多不会做的地方,并且相较于前面的作业,我觉得12章的难度很大。可能是我没有好好看书
2.对于malloc()我不是很理解,也不是很会用,我觉得我应该再看看老师的课件,再看看书本
3.对于创建项目,我通过上网查资料,知道了如何创建和利用ifndef和endif进行同时编译,所以说,不会的还是得上网查。
4.但是值得高兴的是,我终于把前几节课不理解的二维数组的指针搞懂了!!

posted @ 2024-11-24 17:44  王馨怡  阅读(12)  评论(0编辑  收藏  举报