高级语言程序设计课程第八次个人作业
高级语言程序设计课程第八次个人作业
- 这个作业属于哪个课程: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++的项目的创建和不同文件之间的编译链接,收获非常丰富,我的写大型项目的能力得到了很大提升