大一c语言自学提问的一个小问题

img


想问问为啥这个代码可以运行但运行结果和预期的不一致(方便的话最好用简单易懂的说法解答),谢谢!

你预期的是什么样的?aver() 里面的循环结束条件应该是 i<n,导致不符合预期的应该就是这里,数组下标越界,程序能运行的话,a[n]读到的数是其它程序内存里面的,数值不确定,输出结果也就不确定。
这个代码执行main()方法,里面先声明有一个aver(float a[], int n);方法,有两个参数,一个浮点数数组,一个是数组长度。
然后声明了两个浮点数数组,一个长度为5,一个长度为10。
两个printf()输出提示信息,紧跟后面的for循环及scanf("%f", &zu1[i]);表示循环接受输入将数字存入数组中。
然后调用aver()方法,分别计算这两个数组中数值的平均值,再输出这个平均值。输出fload的精度默认小数点后6位。如果要格式化指定小数点位数,可以在 %f之间添加数字,如 %.2f 表示2位小数,小数点前面一般不指定位数。如果需要指定,表示整个长度,前可以前补0,如 %07.2f 表示整个数值长7位(含小数点),2位小数,前补0

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/343928
  • 这篇博客也不错, 你可以看下从键盘输入10个成绩,然后求出最高成绩、最低成绩和它们在数组中的位置。分析运行结果。要求掌握用一维数组求若干个元素的最大(小)值的方法。掌握顺序查找的思想
  • 除此之外, 这篇博客: 【重要!】一文理解指针作为函数参数传递!看完不懂你打我中的 通过一段简单的代码理解指针作为参数传递(指针实参和形参) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <bits/stdc++.h>
    using namespace std;
    
    void test(int *b)
    {
    
    cout << "形参指针地址:" << &b << endl;
    cout << "形参指向内容:" << *b << endl;
    cout << "实参和形参指向同一地址,但实参指针变量和形参指针变量自身地址不一致,可以看出传参方式为值传递而并非引用传递" << endl;
    cout << endl;
    cout << "==更改后==" << endl;
    int num2 = 2;
    b = &num2;
    cout << "型参指向内容:" << *b << endl;
    }
    
    int main()
    {
    int num = 1;
    int *a = &num;
    
    cout << "==更改前==" << endl;
    
    cout << "实参指针地址:" << &a << endl;
    cout << "实参指向内容:" << *a << endl;
    test(a);
    
    cout << "实参指向内容:" << *a << endl;
    
    return 0;
    }

    运行结果:

    ==更改前==
    实参和形参指向同一地址,但实参指针变量和形参指针变量自身地址不一致,可以看出为值传参而并非引用传参
    实参指针地址:0x61fe10
    形参指针地址:0x61fdf0
    ==更改后==
    型参指向内容:2
    实参指向内容:1

    简而言之:指针a和指针b在一开始指向同一变量,但指针a和指针b自身所在的地址不同。

    在test函数中,指针b指向了其他的变量,所以修改内容没有同步到指针a指向的变量

    即test函数参数传递为值传递

    如果想要更加详细的理解,参考博客:很好的指针传参理解博客

  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 操作最后一个元素复杂度震荡问题的解决小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    段落3中的参考资料给出了一个问题描述和输出要求,即输入一个句子,计算其中单词个数和平均长度。段落6中给出了一个完整的C语言程序,来解决这个问题。因此,可以考虑阅读这个程序,找出其中的解决方法。

    这个程序中定义了一个max函数,它的参数是一个字符串和一个整型指针num,返回值是一个整型。主函数中定义了一个字符串English,并通过gets函数从标准输入中读取一行字符串。然后,调用max函数计算出单词的个数和平均长度,最后按要求格式输出这两个值。

    下面是max函数的具体实现:

    int max(char ch[],int *num)
    {
        int maxlength=0,i=0,length=0,len=0, j = 0;
        while(ch[i]!='\0')
        {
            if(ch[i]!=' ')
                length++;
            else if(ch[i]==' ')
            {
                if(length!=0)
                {
                    j++;
                    len+=length;
                }
                length=0;
            }
            i++;
            if(ch[i]=='\0')
            {
                if(length!=0)
                {
                    j++;
                    len+=length;
                }
            }
        }
        *num = j;
        len /= *num;
        return len;
    }
    

    这个函数的实现比较简单,它使用一个while循环遍历字符串中的每一个字符。如果遇到非空格的字符,就认为正在处理一个单词,此时单词长度加一。如果遇到空格,说明当前单词已经结束,如果当前单词长度不为0,就将单词个数加一,并将单词长度累加到总长度上。当循环结束后,需要特殊处理最后一个单词:如果最后一个单词的长度不为0, 就需要将它的长度累加到总长度和单词个数上。最后,计算出平均长度,将个数保存在num指向的位置上,返回平均长度。

    可见,这个程序的实现比较简单明了,通过遍历字符串并分析其中每个单词的长度,实现了对单词个数和平均长度的计算。因此,可以作为解决问题的一个参考。