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

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


一、编写并运行书本第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;
}


思路:按题意理解即可
问题:无
解决:无

三、总结思考:

  1. 复习了C语言的字符串操作
  2. 复习了C语言的内存分配和管理,对与后期做嵌入式开发打下了良好的基础
  3. 复习了大型项目的编译和管理,复习了Dev C++的项目的创建和不同文件之间的编译链接,收获非常丰富,我的写大型项目的能力得到了很大提升
posted @ 2024-11-24 13:28  空余晚秋  阅读(5)  评论(0编辑  收藏  举报