一叶枫残 发表于 2021-1-29 20:17:35

C++(1st)

本帖最后由 一叶枫残 于 2021-2-8 17:58 编辑

对于小甲鱼的数组求和代码的深入探究
源代码如下
#include <iostream>

using namespace std;

int addArray( int *array, int n);

int main()
{
        int array[]={0,1,2,3,4,5,6,7,8,9};
        int size;
       
        size = sizeof(array) / sizeof(array);
        cout << "输出结果为:" << addArray(array, size) << endl;
       
        return 0;
}

int addArray( int *array , int n)
{
        int sum = 0;
        int i;
       
        for( i = 0; i < n; i++ )
        {
                sum+=*array++;
        }
       
        return sum;
}

问题注意:
对于下行代码
size = sizeof(array) / sizeof(array);
不能够写成下面形式
size = array / sizeof(array);
size = sizeof(array) / array;
对于前者,编译器会进行报错,报错信息如下(作者使用的编译器是dev-c++): invalid operands of types 'int ' and 'long long unsigned int' to binary 'operator/'
意思是int 和long long unsigned int是操作符%的无效的操作数
原因是无法用一个地址除以一个整形这类错误
因为编译器会报错,所以很容易被发现

但是对于后者,大多数编译器并不会报错,但输出结果是空白
对于这类错误的解决方案很简单,设置断点调试,再运行到这段错误语句是编译器会弹出报错信息:program received signal SIGFPE,arithmetic exception
这个错误信息一般是数组越界、死循环或者对空容器进行某些操作导致,而导致这个原因是用整形除以一个地址,只要发现并改正就好

对于
cout << "输出结果为:" << addArray(array, size) << endl;
后面的<<endl的作用是换行,去掉不会报错以及影响输出结果(只是少了段换行)
但夹在"输出结果为"与addArray(array, size)中间的<<要写,否则报错,所以使用cout<<时后面的每个变量(数量不限)的之间都要加上<<

对于
using namespace std
如果不写这句话,输出就要改为
std::cout << "输出结果为:" <<addArray(array, size) << std::endl;

课后思考作业
要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置。当用户按下键盘上的
“Enter”键时,数据输入结束,程序自动对所有的整数进行求和并打印出结果。
#include <iostream>
#include <string.h>
using namespace std;

int Sum_stringint(char charstr[]);
int function_addarray_weight(int *getarray);
int function_index(int ind, int j);

int main()
{
        char charstr;
        gets(charstr);
        cout << Sum_stringint(charstr) << endl;
       
        return 0;
}

int Sum_stringint(char charstr[])
{
        int i, j=0 , sum = 0;
        int array;
        int getarray={0};
       
        for(i=0; charstr!='\0';i++)
        {
                if(charstr==' ')
                {                       
                        j=0;
                        sum+=function_addarray_weight(getarray);
                        memset(getarray, 0, sizeof(int)*10);
                }
                else
                {
                        getarray=int(charstr)-48;
                        j++;
                }
        }
        sum+=function_addarray_weight(getarray);
       
        return sum;
}

int function_index(int ind, int j)
{
        int i;
        int sum=1;
        for(i=0; i<j; i++)
        {
                sum*=ind;
        }
        return sum;
}

int function_addarray_weight(int *getarray)
{
        int i, len=0,sum=0;
        int *p = getarray;
        for(i = 0; *p!=0; i++)
        {
                *p++;
                len++;
        }
        for(i = len-1; i>=0; i--)
        {
                sum+=(*getarray) *function_index(10,i);
                *getarray++;
        }
       
        return sum;
       
}

嘉岳呀 发表于 2021-1-29 20:54:12

不错!
还有
辛苦啦!~~~

daniel59 发表于 2021-1-30 15:24:17

非常感谢,MARK

野比大雄 发表于 2021-3-4 15:28:03

感谢
{:5_105:}

夏日哟 发表于 2021-3-5 00:17:50

辛苦了{:9_231:}
页: [1]
查看完整版本: C++(1st)