高级语言程序设计课程第八次个人作业
高级语言程序设计课程第八次个人作业
- 这个作业属于哪个课程:2024高级语言程序设计
- 这个作业要求在哪里:高级语言程序设计课程第八次个人作业
- 学号:032201218
- 姓名:陈彦哲
一、编写并运行书本第11章11.13编程练习题目中的第1~3,6,7题。
11.1
题目:
设计并测试一个函数,从输入中获取下n个字符(包括空白、制表 符、换行符),把结果储存在一个数组里,它的地址被传递作为一个参数。
#include <stdio.h> void getNextNChars(char *arr, int n) { for (int i = 0; i < n; i++) { arr[i] = getchar(); } arr[n] = '\0'; } int main() { char buffer[101]; int n; scanf("%d", &n); getchar(); getNextNChars(buffer, n); printf("%s\n", buffer); return 0; }
思路:
根据题意理解即可。
问题:无
解决:无
11.2
题目:
修改并编程练习1的函数,在n个字符后停止,或在读到第1个空白、 制表符或换行符时停止,哪个先遇到哪个停止。不能只使用scanf()。
#include <stdio.h> void getNextNChars(char *arr, int n) { int i = 0, c; while (i < n) { c = getchar(); if (c == ' ' || c == '\t' || c == '\n' || c == EOF) { break; } arr[i++] = c; } arr[i] = '\0'; } int main() { char buffer[101]; int n; scanf("%d", &n); getchar(); getNextNChars(buffer, n); printf("%s\n", buffer); return 0; }
思路:按题意理解即可
问题:无
解决:无
11.3
题目:设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并 丢弃输入行中的其余字符。该函数应该跳过第1个非空白字符前面的所有空 白。将一个单词定义为没有空白、制表符或换行符的字符序列。
#include <stdio.h> void getWord(char *arr) { int c, i = 0; // 避开空字符 while ((c = getchar()) != EOF) { if (c != ' ' && c != '\t' && c != '\n') { break; } } // 读取字符 if (c != EOF) { arr[i++] = c; } // 丢弃其余字符 while ((c = getchar()) != EOF) { if (c == ' ' || c == '\t' || c == '\n') { break; } arr[i++] = c; } arr[i] = '\0'; while (c != '\n' && c != EOF) { c = getchar(); } } int main() { char word[101]; getWord(word); printf("%s\n", word); return 0; }
思路:按题意理解即可
问题:无
解决:无
11.6
题目:编写一个名为is_within()的函数,接受一个字符和一个指向字符串的 指针作为两个函数形参。如果指定字符在字符串中,该函数返回一个非零值 (即为真)。否则,返回0(即为假)。在一个完整的程序中测试该函数, 使用一个循环给函数提供输入值。
解答:
#include <stdio.h> int is_within(char c, const char *str) { while (*str) { if (*str == c) { return 1; } str++; } return 0; } int main() { char inputStr[101], ch; printf("请输入字符串: "); fgets(inputStr, 101, stdin); while (1) { printf("请输入一个要查找的字符: "); ch = getchar(); getchar(); if (is_within(ch, inputStr)) { printf("字符 '%c' 在字符串中\n", ch); } else { printf("字符 '%c' 不在字符串中\n", ch); } } return 0; }
思路:按题意理解即可
问题:无
解决:无
11.7
题目:strncpy(s1, s2, n)函数把s2中的n个字符拷贝至s1中,截断s2,或者有必 要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不能以空 字符结尾。该函数返回s1。自己编写一个这样的函数,名为mystrncpy()。在 一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
#include <stdio.h> char *strncpy(char *s1, const char *s2, int n) { int i; for (i = 0; i < n && s2[i] != '\0'; i++) { s1[i] = s2[i]; } for (; i <= n; i++) { s1[i] = '\0'; } return s1; } int main() { char s1[101], s2[101]; int n; while (1) { printf("请输入字符串s2:"); fgets(s2, 101, stdin); printf("请输入要复制的字符数:"); scanf("%d", &n); getchar(); strncpy(s1, s2, n); printf("复制后的字符串:%s\n", s1); } return 0; }
思路:按题意理解即可
问题:无
解决:无
二、编写并运行书本第12章12.9编程练习题目中的第1~3,8,9题。
12.1
题目:
不使用全局变量,重写程序清单12.4。
#include <stdio.h> void critic(int *units); int main() { int units = 0; printf("How many pounds to a firkin of butter?\n"); scanf("%d", &units); while (units != 56) { critic(&units); } printf("You must have looked it up!\n"); return 0; } void critic(int *units) { printf("No luck, my friend. Try again.\n"); scanf("%d", units); }
思路:按题意理解即可
问题:无
解决:无
12.2
题目:
在美国,通常以英里/加仑来计算油耗;在欧洲,以升/100 公里来计 算。下面是程序的一部分,提示用户选择计算模式(美制或公制),然后接 收数据并计算油耗。如果用户输入了不正确的模式,程序向用户给出提示消息并使用上一次 输入的正确模式。请提供pe12-2a.h头文件和pe12-2a.c源文件。源代码文件应 定义3个具有文件作用域、内部链接的变量。一个表示模式、一个表示距 离、一个表示消耗的燃料。get_info()函数根据用户输入的模式提示用户输入 相应数据,并将其储存到文件作用域变量中。show_info()函数根据设置的模 式计算并显示油耗。可以假设用户输入的都是数值数据
// pe12-2a.h void set_mode(int mode); void get_info(); void show_info();
// pe12-2a.c #include <stdio.h> #include "pe12-2a.h" static int mode = 0; static double distance = 0.0; static double fuel = 0.0; void set_mode(int new_mode) { if (new_mode != 0 && new_mode != 1) { printf("Invalid mode specified. Mode %d(%s) used.\n", mode, mode == 0 ? "metric" : "US"); } else { mode = new_mode; } } void get_info() { if (mode == 0) { printf("Enter distance traveled in kilometers: "); scanf("%lf", &distance); printf("Enter fuel consumed in liters: "); scanf("%lf", &fuel); } else { printf("Enter distance traveled in miles: "); scanf("%lf", &distance); printf("Enter fuel consumed in gallons: "); scanf("%lf", &fuel); } } void show_info() { if (mode == 0) { printf("Fuel consumption is %.2lf liters per 100 km.\n", (fuel / distance) * 100); } else { printf("Fuel consumption is %.2lf miles per gallon.\n", distance / fuel); } }
// pe12-2b.c #include <stdio.h> #include "pe12-2a.h" int main() { int mode; printf("Enter 0 for metric mode, 1 for US mode: "); scanf("%d", &mode); while (mode >= 0) { set_mode(mode); get_info(); show_info(); printf("Enter 0 for metric mode, 1 for US mode (-1 to quit): "); scanf("%d", &mode); } printf("Done.\n"); return 0; }
思路:按题意理解即可
问题:一开始没能编译成功,总是提示找不到函数
解决:研究了一下Dev C++的原理,把所有的文件赛到一个项目底下就解决问题了
12.3
题目:
重新设计编程练习2,要求只使用自动变量。该程序提供的用户界面 不变,即提示用户输入模式等。但是,函数调用要作相应变化。
// pe12-2a.h void set_mode(int *mode); void get_info(int mode, int *distance, int *fuel); void show_info(int mode, int distance, int fuel);
// pe12-2a.c #include <stdio.h> #include "pe12-2a.h" void set_mode(int *mode) { if (*mode != 0 && *mode != 1) { printf("Invalid mode specified. Mode 1 (US) used.\n"); *mode = 1; } } void get_info(int mode, int *distance, int *fuel) { if (mode == 0) { printf("Enter distance traveled in kilometers: "); scanf("%d", distance); printf("Enter fuel consumed in liters: "); scanf("%d", fuel); } else { printf("Enter distance traveled in miles: "); scanf("%d", distance); printf("Enter fuel consumed in gallons: "); scanf("%d", fuel); } } void show_info(int mode, int distance, int fuel) { if (mode == 0) { printf("Fuel consumption is %.2f liters per 100 km.\n", (fuel / (distance / 100.0))); } else { printf("Fuel consumption is %.2f miles per gallon.\n", (distance / (double)fuel)); } }
// pe12-2b.c #include <stdio.h> #include "pe12-2a.h" int main() { int mode; printf("Enter 0 for metric mode, 1 for US mode: "); scanf("%d", &mode); while (mode >= 0) { int distance, fuel; set_mode(&mode); get_info(mode, &distance, &fuel); show_info(mode, distance, fuel); printf("Enter 0 for metric mode, 1 for US mode"); printf(" (-1 to quit): "); scanf("%d", &mode); } printf("Done.\n"); return 0; }
思路:按题意理解即可
问题:一开始不知道怎么传参
解决:后面思考了一下,在头文件里用指针传参就可以了
12.8
题目:
提供make_array()和show_array()函数的定义,完成该程序。make_array() 函数接受两个参数,第1个参数是int类型数组的元素个数,第2个参数是要赋 给每个元素的值。该函数调用malloc()创建一个大小合适的数组,将其每个 元素设置为指定的值,并返回一个指向该数组的指针。show_array()函数显 示数组的内容,一行显示8个数。
#include <stdio.h> #include <stdlib.h> int *make_array(int elem, int val); void show_array(const int ar[], int n); int main() { int *pa; int size; int value; printf("Enter the number of elements: "); while (scanf("%d", &size) == 1 && size > 0) { printf("Enter the initialization value: "); scanf("%d", &value); pa = make_array(size, value); if (pa) { show_array(pa, size); free(pa); } printf("Enter the number of elements (<1 to quit): "); } printf("Done.\n"); return 0; } int *make_array(int elem, int val) { int *arr = (int *)malloc(elem * sizeof(int)); if (arr) { for (int i = 0; i < elem; i++) { arr[i] = val; } } return arr; } void show_array(const int ar[], int n) { for (int i = 0; i < n; i++) { printf("%d ", ar[i]); if ((i + 1) % 8 == 0 || i == n - 1) { printf("\n"); } } }
思路:按题意理解即可
问题:无
解决:无
12.9
题目:
编写一个符合以下描述的函数。首先,询问用户需要输入多少个单 词。然后,接收用户输入的单词,并显示出来,使用malloc()并回答第1个问 题(即要输入多少个单词),创建一个动态数组,该数组内含相应的指向 char的指针(注意,由于数组的每个元素都是指向char的指针,所以用于储 存malloc()返回值的指针应该是一个指向指针的指针,且它所指向的指针指 945
向char)。在读取字符串时,该程序应该把单词读入一个临时的char数组, 使用malloc()分配足够的存储空间来储存单词,并把地址存入该指针数组 (该数组中每个元素都是指向 char 的指针)。然后,从临时数组中把单词 拷贝到动态分配的存储空间中。因此,有一个字符指针数组,每个指针都指 向一个对象,该对象的大小正好能容纳被储存的特定单词。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int wordCount; char **words; char temp[100]; printf("How many words do you wish to enter? "); scanf("%d", &wordCount); words = (char **)malloc(wordCount * sizeof(char *)); printf("Enter %d words now:\n", wordCount); for (int i = 0; i < wordCount; i++) { scanf("%s", temp); words[i] = (char *)malloc((strlen(temp) + 1) * sizeof(char)); strcpy(words[i], temp); } printf("Here are your words:\n"); for (int i = 0; i < wordCount; i++) { printf("%s\n", words[i]); free(words[i]); } printf("\n"); free(words); return 0; }
思路:按题意理解即可
问题:无
解决:无
三、总结思考:
- 复习了C语言的字符串操作
- 复习了C语言的内存分配和管理,对与后期做嵌入式开发打下了良好的基础
- 复习了大型项目的编译和管理,复习了Dev C++的项目的创建和不同文件之间的编译链接,收获非常丰富,我的写大型项目的能力得到了很大提升
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」