练习1.11

编程: 写一个单词计数程序

额。。。单词的定义。。这里按书上说的。。。采用简单的定义————即字母和数字组成的一个序列!!

代码:

 

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

#define bool _Bool
#define true 1
#define false 0
#define MAXNAME 30

size_t wordCount(FILE *fin);

int main(int argc, char *argv[])
{
    char name[MAXNAME] = "";
    printf("input name:\n");
    scanf("%s", name);
    FILE *fp = fopen(name, "r");
    if (fp == NULL) {
        perror("open file error");
        exit(1);
    }
    printf("%ld\n", wordCount(fp));
    return 0;
}

size_t wordCount(FILE *fin)
{
    size_t nWord = 0;
    bool inWord = false;
    int c;
    while ((c = fgetc(fin)) != EOF) {
        switch (inWord) {
            case false:
            {
                if (isalnum(c)) {
                    inWord = true;
                    ++nWord;
                }
            }
            continue;
            case true:
            {
                if (! isalnum(c)) {
                    inWord = false;
                }
            }
            continue;
            default:
                break;
        }
    }
    return nWord;
}


。。。没什么说的。。。

好的,根据您的要求,我将逐一解答练习1.11.9以及1.11。以下是详细的解答: ### 1.1 什么是算法?它与计算过程和程序有什么区别? **题目重述** 什么是算法?它与计算过程和程序有什么区别? **详解** - **算法**:是一系列明确定义的指令,用于解决某一特定问题或执行某项任务。 - **计算过程**:指的是计算机执行指令的过程,可以看作是算法的具体实施。 - **程序**:则是用某种编程语言实现的算法,包含了具体的语法和语法规则,能够在计算机上运行。 **知识点** 1. 算法定义:算法是解决问题的一系列步骤。 2. 计算过程:是算法在计算机上的实际运行。 3. 程序定义:实现算法的具体代码形式。 --- ### 1.2 程序证明和程序测试的目的各是什么? **题目重述** 程序证明和程序测试的目的各是什么? **详解** - **程序证明**:通过数学方法验证程序的正确性,确保程序在所有可能输入下都能产生正确的输出。 - **程序测试**:通过运行程序并提供各种输入来检测错误,以确保程序在实际运行时能正常工作。 **知识点** 1. 程序证明:数学验证程序正确性。 2. 程序测试:通过实际运行检测错误。 --- ### 1.3 使用欧几里得算法求31415和14142的最大公约数。估算一下【程序1-2】的算法比【程序1-3】的算法快多少倍? **题目重述** 使用欧几里得算法求31415和14142的最大公约数。估算一下【程序1-2】的算法比【程序1-3】的算法快多少倍? **详解** 欧几里得算法(辗转相除法)通过连续取余数的方式求两个整数的最大公约数。步骤如下: 1. $31415 \% 14142 = 3131$ 2. $14142 \% 3131 = 1618$ 3. $3131 \% 1618 = 1513$ 4. $1618 \% 1513 = 105$ 5. $1513 \% 105 = 98$ 6. $105 \% 98 = 7$ 7. $98 \% 7 = 0$ 因此,31415和14142的最大公约数是$7$。 关于算法速度比较,没有具体的【程序1-2】和【程序1-3】的实现细节,无法准确估算。通常,欧几里得算法的时间复杂度为$O(\log(\min(a, b)))$,相对高效。 **知识点** 1. 欧几里得算法:辗转相除法求最大公约数。 2. 时间复杂度:衡量算法效率的标准。 --- ### 1.4 名解释:问题、问题求解、问题求解过程、软件生命周期。 **题目重述** 名解释:问题、问题求解、问题求解过程、软件生命周期。 **详解** - **问题**:是指待解决的具体需求或挑战。 - **问题求解**:指识别问题、设计解决方案并验证其有效性的过程。 - **问题求解过程**:包括定义问题、提出假设、设计实验、收集数据和得出结论等步骤。 - **软件生命周期**:软件从概念形成直至最终退役的整个生命历程,包括需求分析、设计、编码、测试、维护等阶段。 **知识点** 1. 问题定义:明确的问题描述是解决问题的基础。 2. 软件生命周期:包含多个阶段的软件开发流程。 --- ### 1.5 算法研究主要有哪些方面? **题目重述** 算法研究主要有哪些方面? **详解** 算法研究主要包括以下方面: - **设计**:设计新的算法或改进现有算法。 - **分析**:评估算法的时间和空间复杂度。 - **优化**:提高算法的效率和性能。 - **应用**:将算法应用于实际问题。 **知识点** 1. 算法设计:创建新算法或改进现有算法。 2. 算法分析:评估算法效率。 --- ### 1.6 简述衡量一个算法的主要性能标准。说明算法的正确性和健壮性的关系。 **题目重述** 简述衡量一个算法的主要性能标准。说明算法的正确性和健壮性的关系。 **详解** 衡量算法的主要性能标准包括: - **时间复杂度**:算法执行所需的时间。 - **空间复杂度**:算法执行所需的内存空间。 - **正确性**:算法能否在所有情况下给出正确结果。 - **健壮性**:算法能否处理异常输入而不崩溃。 正确性和健壮性之间的关系:正确性是算法的基本要求,健壮性是在正确性基础上进一步保证算法在异常情况下也能合理处理。 **知识点** 1. 时间复杂度:衡量算法执行时间。 2. 正确性与健壮性:正确性是基础,健壮性是扩展。 --- ### 1.7 简述影响一个程序运行时间的因素。 **题目重述** 简述影响一个程序运行时间的因素。 **详解** 影响程序运行时间的主要因素有: - **硬件性能**:CPU速度、内存大小等。 - **算法效率**:时间复杂度越低,运行越快。 - **输入规模**:输入越大,运行时间越长。 **知识点** 1. 硬件性能:直接影响运行速度。 2. 算法效率:算法的时间复杂度。 --- ### 1.8 什么是算法的时间复杂度和空间复杂度?什么是最好、平均和最坏情况时间复杂度? **题目重述** 什么是算法的时间复杂度和空间复杂度?什么是最好、平均和最坏情况时间复杂度? **详解** - **时间复杂度**:衡量算法执行所需的时间。 - **空间复杂度**:衡量算法执行所需的内存空间。 - **最好情况时间复杂度**:算法在最优情况下所需的时间。 - **平均情况时间复杂度**:算法在平均情况下所需的时间。 - **最坏情况时间复杂度**:算法在最差情况下所需的时间。 **知识点** 1. 时间复杂度:衡量执行时间。 2. 最好/平均/最坏情况:不同输入下的性能现。 --- ### 1.9 什么是算法的事先分析,什么是事后测试? **题目重述** 什么是算法的事先分析,什么是事后测试? **详解** - **事先分析**:在编程序之前,通过理论推导预测算法的性能。 - **事后测试**:在程序运行后,通过实际测试评估算法的性能。 **知识点** 1. 事先分析:理论推导预测性能。 2. 事后测试:实际运行评估性能。 --- ### 1.11 确定下列各程序段的程序步,确定划线语句的执行次数,计算它们的渐近时间复杂度。 **题目重述** 确定下列各程序段的程序步,确定划线语句的执行次数,计算它们的渐近时间复杂度。 ```cpp (1) i=1; x=0; do { x++; i=2*i; } while (i < n); (2) for (int i = 1; i <= n; i++) for (int j = 1; j <= i; j++) for (int k = 1; k <= j; k++) x++; (3) x = n; y = 0; while (x >= (y + 1) * (y + 1)) y++; (4) m = 0; for (int i = 0; i < n; i++) for (int j = 2 * i; j < n; j++) m++; ``` **详解** #### (1) ```cpp i=1; x=0; do { x++; i=2*i; } while (i < n); ``` - **程序步**:每次循环`x++`和`i=2*i`执行一次。 - **执行次数**:`log₂(n)`次(因为`i`每次乘以2)。 - **渐近时间复杂度**:$O(\log n)$ #### (2) ```cpp for (int i = 1; i <= n; i++) for (int j = 1; j <= i; j++) for (int k = 1; k <= j; k++) x++; ``` - **程序步**:最内层循环执行`x++`。 - **执行次数**:$\sum_{i=1}^{n} \sum_{j=1}^{i} j = \frac{n(n+1)(n+2)}{6}$。 - **渐近时间复杂度**:$O(n^3)$ #### (3) ```cpp x = n; y = 0; while (x >= (y + 1) * (y + 1)) y++; ``` - **程序步**:每次循环`y++`。 - **执行次数**:$\sqrt{n}$次(因为`y`的平方增长)。 - **渐近时间复杂度**:$O(\sqrt{n})$ #### (4) ```cpp m = 0; for (int i = 0; i < n; i++) for (int j = 2 * i; j < n; j++) m++; ``` - **程序步**:最内层循环执行`m++`。 - **执行次数**:$\sum_{i=0}^{n-1} (n - 2i) = n^2 - n(n-1)/2 = O(n^2)$。 - **渐近时间复杂度**:$O(n^2)$ **知识点** 1. 时间复杂度:衡量执行时间。 2. 渐近时间复杂度:大O表示法。 希望这些解答能帮到您。如果有任何进一步的问题,请随时告知!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值