马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 一叶枫残 于 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[0]);
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[0]);
不能够写成下面形式size = array / sizeof(array[0]);
size = sizeof(array) / array[0];
对于前者,编译器会进行报错,报错信息如下(作者使用的编译器是dev-c++):[Error] invalid operands of types 'int [10]' and 'long long unsigned int' to binary 'operator/'
意思是int [10]和long long unsigned int是操作符%的无效的操作数
原因是无法用一个地址除以一个整形这类错误
因为编译器会报错,所以很容易被发现
但是对于后者,大多数编译器并不会报错,但输出结果是空白
对于这类错误的解决方案很简单,设置断点调试,再运行到这段错误语句是编译器会弹出报错信息:program received signal SIGFPE,arithmetic exception
这个错误信息一般是数组越界、死循环或者对空容器进行某些操作导致,而导致这个原因是用整形除以一个地址,只要发现并改正就好
对于cout << "输出结果为:" << addArray(array, size) << endl;
后面的<<endl的作用是换行,去掉不会报错以及影响输出结果(只是少了段换行)
但夹在"输出结果为"与addArray(array, size)中间的<<要写,否则报错,所以使用cout<<时后面的每个变量(数量不限)的之间都要加上<<
对于如果不写这句话,输出就要改为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[100];
gets(charstr);
cout << Sum_stringint(charstr) << endl;
return 0;
}
int Sum_stringint(char charstr[])
{
int i, j=0 , sum = 0;
int array[100];
int getarray[10]={0};
for(i=0; charstr[i]!='\0';i++)
{
if(charstr[i]==' ')
{
j=0;
sum+=function_addarray_weight(getarray);
memset(getarray, 0, sizeof(int)*10);
}
else
{
getarray[j]=int(charstr[i])-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;
}
|