【问题标题】:Q: Arrays and Functions Homework问:数组和函数作业
【发布时间】:2019-07-30 03:23:22
【问题描述】:

坦率地说,就目前而言,我目前不太擅长编码。我真的很想完成这些功能,只是在执行其中一些功能时遇到了麻烦。

基本上,需要创建 10 个函数(其中我完成了 6 个?)。 有一个 int main() 但是,除了需要修复的字符串之外,不需要触及 int main()。

除了 int main() 之外,我还将发布程序(主要是为了让您可以看到我的工作),以便如果有人想检查意图,他们可以看到它。尽管我已经发布了整个程序,但我真正想要关注的只有 makeUpper,以及其中没有任何内容的函数,因为我真的不明白如何将字符串复制和编辑到另一个数组中。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

void makeUpper( char orig[], char result[] )
{
/*
        int i = 0;

        while ( str[i] != '\0' )
        {
                if ( str[i] >= 'a' && str[i] <= 'z' )
                        str[i] = str[i] - 32;

                k++;
        }
*/
}

int countDigit( char str[] )
{
        int i;
        int count = 0;
        int len;

        len = strlen(str);

        for ( i = 0; i < len; i++ )
        {
                if ( i >= '0' && i <= '9' )
                        count++;
        }

        return count;
}

int onlyLetters( char orig[], char letters[] )
{
}

int countOdd( int A[], int N )
{
        int i;
        int odd = 0;

        for ( i = 0; i < N; i++ );
        {
                if ( A[i] % 2 != 0 )
                        odd++;
        }

        return odd;
}

int sumList( int A[], int N )
{
        int i;
        int sum = 0;

        for ( i = 0; i < N; i++ );
                sum = sum + A[i];

        return sum;
}

void addToEach( int A[], int N, int val )
{
        int i;

        for ( i = 0; i < N; i++ )
                A[i] + val;

        printf("%d", A[i]);
}

void copyNumList( int orig[], int N, int result[] )
{
}

// populate list A with N items, random in range L to H
void fillNumList( int A[], int N, int L, int H )
{
}

// print the list, 10 items per line
void printList( int A[], int N )
{
        int i;

        for ( i = 0; i < N; i++ )
                printf("%d ", A[i]);

        printf("\n");
}

void rept( int n, char c )
{
        int i;

        for ( i = 0; i < n; i++ )
                printf("%c", c);

        printf("\n");
}

int main()
{
        char line[100], other[100];
        int i, len;

        printf("Phrase: ");
        fgets( line, 100, stdin );

        // fix the string....
        // ...
//              really, do this
        // ...

        rept(10,'-');
        printf("Orig:  @@%s@@\n", line);

        rept(10,'-');
        makeUpper( line, other );
        printf("toupper: %s\n", other);

        rept(10,'-');
        i = countDigit( line );
        printf("%d digits\n", i);

        rept(10,'-');
        len = onlyLetters( line, other );
        printf("only letters: %s\n", other );
        printf(" new len %d\n", len);

        int nums[30], vals[30];
        int many = 19;

        rept(5, '-');
        fillNumList( nums, many, 3, 11 );
        printList( nums, many );

        rept(5, '-');
        i = countOdd( nums, many );
        printf("%d odd values\n", i);
        rept(5, '-');
        i = sumList( nums, many );
        printf("%d is sum\n", i);

        rept(5, '-');
        copyNumList( nums, many, vals );
        printf("Copy\n");
        printList( vals, many );

        rept(5, '-');
        addToEach( vals, many, 4 );
        printf("Add 4\n");
        printList( vals, many );

        rept(5, '-');
        printf("Orig\n");
        printList( nums, many );
        rept(5, '-');

        return 0;
}

【问题讨论】:

  • 哎呀。首先 - Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers?。使用该空间来描述问题会更好。 Stack Overflow 不是代码编写服务。如果你有问题,问。如果你有一个任务,就像你做的那样,尽力而为,然后询问你被卡住的具体地方。
  • 明白了,我标记一下
  • 例如,“我真的不明白如何将一个字符串复制和编辑到另一个数组中。”是一个有趣问题的开始(假设您详细说明了您不了解的具体内容,以及您尝试做的事情失败了)。 “请为我实现这些功能”不是。最后,请每个问题一个问题。
  • 我明白,我很抱歉。我正在网上学习这门课程,我真的没有其他学生可以与之交谈以进行测试和交流建议。
  • 您应该查找&lt;ctypes.h&gt; 中的函数——它们将使makeUpper() 等函数更易于编写和阅读。

标签: c arrays string function int


【解决方案1】:

回答一个定义明确的问题(关于makeUpper):

首先,str 不是变量。你有origresult,并且没有在任何地方声明str

现在,如果 strorig,您将正确地大写原始字符串中的字符。但是,任务是保留原始字符串并制作大写副本。前者称为“破坏性操作”(不保留原始内容);后者,一种“非破坏性操作”(出于显而易见的原因)。以下是使您的函数具有非破坏性所需的更改:

void makeUpper( char orig[], char result[] )
{
        int k = 0;

        do
        {
                if ( orig[k] >= 'a' && orig[k] <= 'z' )
                        result[k] = orig[k] - 32;
                else
                        result[k] = orig[k];

        } while ( orig[k++] != '\0' );
}

请注意,我在 orig 上进行了迭代和测试,但分配给了 result

onlyLetters 应该类似;但是您将需要两个索引变量,而不仅仅是k,因为您将希望以不同的速度通过origresult(您只想复制一个字符,当它是一个字母时,您将只希望在复制时通过 result 进行 - 而不是 orig,每个循环总是消耗一个字符)。

由于您没有说明您对copyNumListfillNumList 的误解是什么,因此我无法提供任何帮助。

编辑:我忘记了终结器(并且没有测试它);谢谢汤姆卡泽斯!因为还需要复制零,所以您的循环从while (condition) { ... } 更改为do { ... } while (condition) - 而不是测试我们是否结束,如果没有,我们会先做这件事,然后之后才问我们是否完成了。这也需要在测试之后进行增量,所以k++ 被移动了。如果这对您来说太奇怪了,您可以通过在循环完成后显式添加终止符来获得类似的效果:

void makeUpper( char orig[], char result[] )
{
        int k = 0;

        while ( orig[k] != '\0' )
        {
                if ( orig[k] >= 'a' && orig[k] <= 'z' )
                        result[k] = orig[k] - 32;
                else
                        result[k] = orig[k];

                k++;
        }
        result[k] = '\0';
}

【讨论】:

  • 所以你正在测试 orig 的字符串内容;考虑是否有任何小写字符。但是,在“if”语句中,您正在运行操作并将结果设置为 = 到 orig,跳过将值发布到 orig。 “else”语句只是在没有小写的情况下。
  • result 什么都没有;因此,小写字母需要大写,非小写字母需要复制。因此,else 不是“仅以防万一”的东西,它是不从"Martin Luther King Jr." 获得"ARTIN UTHER ING R" 不可或缺的。
  • 这实际上很有意义。也谢谢你的例子。教授不希望我们使用 do 循环,只使用 for 和 while,所以我也很欣赏这个额外的例子。
猜你喜欢
  • 2016-12-27
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多