注册 登录
编程论坛 C++教室

这题目最少可用多少for语句?

孤魂居士 发布于 2007-05-22 01:18, 2809 次点击

昨天在机房上机,老师出了个题目,我做了很长时间 他说我做的太复杂了
他说还有可能是错的,题目是这样的:

X1 X2 X3

X4 X5 X6

X7 X8 X9

随便输入5个数放在两个对角线里面 第一个对角线 :X1--X5--X9 第2个对角线 :X7--X5--X3
求两个对角线所有数之和. 而且这现状大小是自己定义的的 你可以把对角线搞成4个数,5个数,6个数.....
意思就是说这个数组有是活的 可以是数组A[3][3],A[4][4],A[5][5].........求输入这两个对角线所有数之和,程序规定要是活,不是规定的```以上是个简单规模例子...这个程序别人说很简单,只要用几个循环就可以了 但是我做了很久 还是很难...
在此希望各位师兄师姐多多帮助....谢谢啦

41 回复
#2
孤魂居士2007-05-22 01:21

希望大哥大姐多多帮助```

#3
aipb20072007-05-22 08:49
不明白楼主的意思,任意输数计算和,怎么又和矩阵关系上?
对角线以外的元素呢?
#4
kisscjy2007-05-22 12:55
就是,为什么一定要用巨阵来实现咧~~~
#5
I喜欢c2007-05-22 13:13

define X ?; //数组宽或长...一样,?处自己写个值
int i,j;
int a[X][X];
int sum1=0,sum2=0;
//.... 矩阵附值,免写...

for(i=0,j=X;j;i++,j--) // j 可改为i<X
{
sum1+=a[i][i]; //你所说的第一对角线 的和
sum2+=a[i][j-1]; //第二对角线 的和
}

思路我觉得没问题,看看有没小毛病了....

#6
kisscjy2007-05-22 13:38

实在不太明白会什么要用距阵~~
按你的要求写了一个: 

#include<iostream>
using namespace std;

void main()
{
int n;
int sum1=0,sum2=0;
cout<<"输入矩阵的行数!"<<endl;
cin>>n;
int **p=new int *[n]; //定义动态二维数组
int i,j;
for(i=0;i<n;i++)
{
p[i]=new int [n];
}

cout<<"请输入数组的值:"<<endl;
for(i=0;i<n;i++) //输入数组的值
{
for(j=0;j<n;j++)
{
cin>>p[i][j];
}
}

cout<<endl;
for(i=0;i<n;i++) //输出距阵
{
for(int j=0;j<n;j++)
{
cout<<p[i][j]<<'\t';
}
cout<<endl;
}
cout<<endl;

for(i=0;i<n;i++) //计算对角线元素和
{
sum1=sum1+p[i][i];
}


for(i=0,j=n-1;i<n;i++,j--)
{
sum2=sum2+p[j][i];
}

cout<<"第一条对角线的和为:\t"<<sum1<<endl;
cout<<"第二条对角线的和为:\t"<<sum2<<endl;

}

#7
aipb20072007-05-22 13:52
楼上的没有释放动态内存哦

就是问问,这样使用动态内存了,怎么释放?
#8
aipb20072007-05-22 13:54
for (int i = 0;i < n;++i)
delete [] a[i];
delete [] a;


有没有比这更直接,简单的方法?
#9
kisscjy2007-05-22 15:48
小弟愚笨~~想问下为什么要释放动态内存啊??

释放了有什么好处??
#10
aipb20072007-05-22 16:58
以下是引用kisscjy在2007-5-22 15:48:02的发言:
小弟愚笨~~想问下为什么要释放动态内存啊??

释放了有什么好处??

每个程序在执行时都占用了可用内存空间,用于存放动态分配的对象,这个内存空间叫自由存储区,也都习惯叫它“堆内存”,c++中用new和delete来分配存储空间。

如果不显示的释放不用的内存,就会内存泄露,在一些大点的程序中会引起一些不易发现的致命错误。
关于内存泄露的话题就太多了,你找找看就知道了!

#11
孤魂居士2007-05-22 17:19

各位大哥 这个程序是有点不知所云..其实情况是这样的,上次在机房上机,老师出的题目很简单,没有这么复杂
他出的是个死的程序
只要求这样:

X1 X2 X3

X4 X5 X6

X7 X8 X9

X1代表1 X2代表2 其实题目上的X1是用圈圈画的 共九个圈圈 把第一条对角线的数 1 5 9 输入 再输入第2条对角线的数 7 5 3 用循环求两条对角线的和 谁都知道等于25 我说这简单还要编写程序啊```我就自己把题目改造了下 把这个题目改成活的了 本来这个题目是个二维数组a[3][3],我的意思就是想改造下 搞成活的编写看看 a[4][4],a[5][5],a[6][6]....
根据这题的排序规律,对角线会越来越长`数字还是这个规律排序``从1开始的 再就不是任意输入啦```上次是我说错了`` 对不起哦```这个程序 我就是写了个 但是调试了很多次就是成不了```
希望 大哥大姐 根据这个意思 或者编辑个上面`a[3][3]死程序也可以`````要是用循环的哦,老师说了 这谁都知道这结果```

#12
I喜欢c2007-05-22 17:48
把你的发上来看看先..
#13
孤魂居士2007-05-22 17:52
  我怕发上来  你们会笑话我``
#14
孤魂居士2007-05-22 18:16

#include "iostream.h"
void main()
{
int a[3][3],i,j,s1,s2,s3,sum;

cout<<"输入3个数"<<endl;
for(i=0;i<=2;i++)
for(j=2;j>=i-1;j--)
cin>>a[i][j];

cout<<"输入3个数"<<endl;
for(i=0;i<=2;i++)
for(j=0;j<=i;j++)
cin>>a[i][j];

for(i=0;i<=2;i++)
for(j=0;j<=i;j++)
a[i][j]=a[i][j]+a[i+1][j+1];
s1=a[i][j];

for(i=0;i<=2;i++)
for(j=2;j>=i-1;j--)
a[j][i]=a[j][i]+a[j-1][i+1];
s2=a[j][i];

if(a[i][j]==a[j][i]) //如果奇数时候 那么两条对角线相加和的时候就要把中间的那个数加两次,所以减掉一个中间的数。
s3=a[j][i];

sum=s1+s2-s3;
cout<<"sum="<<sum<<endl;

#15
孤魂居士2007-05-22 18:16
请高手看看   我是 不是错的一踏糊涂````
#16
孤魂居士2007-05-22 21:23

六楼的哥哥 你太强悍了 我刚刚运行了一遍 是正确的
哇靠 编程真的有意思``不过就是有点点的问题``是要求出两个对角线所有的数的和
但是两个对角线加起来后,中间的数就加了两次``假如数组是
1 2 3
4 5 6
7 8 9

那加起来的对角线就是30了 正确答案是25 把中间的那个数加了两次哦
嘿嘿 改一下就是一个非常棒的程序啦```

#17
kisscjy2007-05-22 22:37

等一下我改一下再发上来好了~~~

#18
孤魂居士2007-05-22 22:43

嘿嘿 上面的哥哥 我刚刚就是改你的程序 改了半天改好了 就是不输出结果``我人都快急死``
程序是改成这样的了 哥哥看看\有什么错误:


#include<iostream>
using namespace std;

void main()
{
int n,sum3,sum;
int sum1=0,sum2=0;
cout<<"输入矩阵的行数!"<<endl;
cin>>n;
int **p=new int *[n]; //定义动态二维数组
int i,j;
for(i=0;i<n;i++)
{
p[i]=new int [n];
}

cout<<"请输入数组的值:"<<endl;
for(i=0;i<n;i++) //输入数组的值
{
for(j=0;j<n;j++)
{
cin>>p[i][j];
}
}

cout<<endl;
for(i=0;i<n;i++) //输出距阵
{
for(int j=0;j<n;j++)
{
cout<<p[i][j]<<'\t';
}
cout<<endl;
}
cout<<endl;

for(i=0;i<n;i++) //计算对角线元素和
{
for(i=0,j=n-1;i<n;i++,j--)
sum1=sum1+p[i][i];
sum2=sum2+p[j][i];

if(p[i][i]==p[j][i])
sum3=p[i][j];
sum=sum1+sum2-sum3;
}

cout<<"对角线的和为:"<<sum<<endl;


}

#19
孤魂居士2007-05-22 22:57
哥哥  你怎么还没有给我发上来啊``
#20
kisscjy2007-05-22 23:07

帮你改了下~~~


#include<iostream>
using namespace std;

void main()
{
int n,sum;
int sum1=0,sum2=0;
cout<<"输入矩阵的行数!"<<endl;
cin>>n;
int **p=new int *[n]; //定义动态二维数组
int i,j;
for(i=0;i<n;i++)
{
p[i]=new int [n];
}

cout<<"请输入数组的值:"<<endl;
for(i=0;i<n;i++) //输入数组的值
{
for(j=0;j<n;j++)
{
cin>>p[i][j];
}
}

cout<<endl;
for(i=0;i<n;i++) //输出距阵
{
for(int j=0;j<n;j++)
{
cout<<p[i][j]<<'\t';
}
cout<<endl;
}
cout<<endl;

for(i=0;i<n;i++) //计算对角线元素和
{
for(i=0,j=n-1;i<n;i++,j--)
{ //少了一对括号
sum1=sum1+p[i][i];
sum2=sum2+p[j][i];
}
}

if(n%2==1) //当为奇数时减去中间一项
{

sum=sum1+sum2-p[n/2][n/2];
}

else sum=sum1+sum2;

cout<<"对角线的和为:"<<sum<<endl;

for (i = 0;i < n;++i) //释放内存
delete [] p[i];
delete [] p;

}

顺便问一下,你这个距阵的元素是不是有规律的啊??

是不是按1,2,3,4.....这些顺序来给元素赋值的啊?

#21
孤魂居士2007-05-22 23:17
恩``是有规律的```老师出题目的时候就是这样给我们的`



1 2 3

4 5 6

7 8 9

所以是按1,2,3,4,....给元素赋值的```嘿嘿``

谢谢哥哥```
#22
孤魂居士2007-05-22 23:18

哥哥
为什么最后要来这几句``
for (i = 0;i < n;++i) //释放内存
delete [] p[i];
delete [] p;

}

#23
kisscjy2007-05-22 23:20

cout<<"请输入数组的值:"<<endl;
for(i=0;i<n;i++) //输入数组的值
{
for(j=0;j<n;j++)
{
cin>>p[i][j];
}
}

你将上面这段代码改为下面的,一个一个输入很麻烦~~

static int k=1;
for(i=0;i<n;i++) //输入数组的值
{
for(j=0;j<n;j++)
{
p[i][j]=k;
k++;
}
}

关于22楼的问题,你去看看7楼的解释~~

[此贴子已经被作者于2007-5-22 23:22:56编辑过]

#24
孤魂居士2007-05-22 23:23
哦好的``试试```
谢谢`` 哥哥```顺便问下 你是不是计算机专业的啊?
#25
kisscjy2007-05-22 23:24

是的~~~~

#26
孤魂居士2007-05-22 23:27
哥哥 不走啦 还有个事求你哦
希望你帮助我看看 我那个程序究竟是逻辑错误还是怎么出错误了啊``
在14楼```也是关于这个题目的程序``
#27
kisscjy2007-05-22 23:46
你自己调试一下不就好了???
#28
孤魂居士2007-05-22 23:49
有错误 但是我不知道错误出在哪里``
我英语基础太差了 不认识```
出错说明都是英文说的``` 哥哥
我找了半天还是找不出来``
哥哥帮帮我```
#29
kisscjy2007-05-22 23:56
你循环体很乱,应该有括号的地方没有括号.

本来要输入3个数的地方现在要输入4个;

第2次时要输入六个数.

我都给搞糊涂了~~~

你先看看书本中关于for循环体的正确表达方法,

看明白后再自己修改自己的程序~~
#30
孤魂居士2007-05-23 02:31
回复:(孤魂居士)这题目最少可用多少for语句?
哦 知道了  那我再看看循环语句吧
#31
孤魂居士2007-05-23 18:52

哥哥
我把我那程序改了下
现在运行还是可以运行,但是就是结果是错的
我不知道怎么回事,
哥哥帮助我看看我的程序:
#include "iostream.h"
void main()
{
int i,j,k,a[3][3],sum1,sum2,sum3,sum,n;
cout<<"请输入数组行数:"<<endl; //数组行数有可能问奇数。
cin>>n;
cout<<"请输入数组的值:"<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
i=0;j=0; //给下面循环中i,j赋初始值。
for(k=0;k<=n-1;k++)
{
i=i+1;
j=j+1;
sum1=sum1+a[i][j]; //求第1条对角线的和。
}
i=4;j=0; //给下面循环中i,j赋初始值。
for(k=0;k<=n-1;k++)
{
i=i-1;
j=j+1;
sum2=sum2+a[i][j]; //求第2条对角线的和。
}
if(n%2==1)
sum3=a[(n+1)/2][(n+1)/2];
else
sum3=0;
sum=sum1+sum2-sum3;
cout<<"对角线的和为:"<<sum<<endl;
}

这是用VC++6.0运行的 成了这样结果:

请输入数组行数:
3
请输入数组的值:
1 2 3 4 5 6 7 8 9
对角线的和为:-1716741790
Press any key to continue

#32
aipb20072007-05-23 19:32

[CODE]void main()
{
int i,j,k,a[3][3],sum1 = 0,sum2 = 0,sum3,sum,n; //sum1,sum2初始化为0
cout<<"请输入数组行数:"<<endl; //数组行数有可能问奇数。
cin>>n;
cout<<"请输入数组的值:"<<endl;
for(i=0;i< n;i++) //记住从0开始
for(j=0;j< n;j++)
cin>>a[i][j];
i=0;j=0; //给下面循环中i,j赋初始值。
for(k=0;k<=n-1;k++)
{
sum1=sum1+a[i][j]; //从0开始 //求第1条对角线的和。
i=i+1;
j=j+1;
}
i=n-1;j=0; //i因该是n-1最后一行 //给下面循环中i,j赋初始值。
for(k=0;k<=n-1;k++)
{
sum2=sum2+a[i][j]; //从0开始 //求第2条对角线的和。
i=i-1;
j=j+1;
}
if(n%2==1)
sum3=a[n/2][n/2]; //还是那句话,从0开始
else
sum3=0;
sum=sum1+sum2-sum3;
cout<<"对角线的和为:"<<sum<<endl;
}[/CODE]

尽量保持了你代码!只改了必要的部分,自己看吧!

#33
孤魂居士2007-05-23 20:49
无限循环哥哥```你是我的偶像``你太棒拉
#34
孤魂居士2007-05-23 20:56

哥哥 我刚刚运行了下 VC++6.0
还有个错误```我不知道出在哪里 就是有个错误``

编译是这样的 是这样说的错误 我看不懂英语 请哥哥看


Deleting intermediate files and output files for project 'dfdf - Win32 Debug'.
--------------------Configuration: dfdf - Win32 Debug--------------------
Compiling...
gege.cpp
c:\1000\gege.cpp(4) : error C2065: 'cout' : undeclared identifier
c:\1000\gege.cpp(4) : error C2297: '<<' : illegal, right operand has type 'char [17]'
c:\1000\gege.cpp(4) : error C2065: 'endl' : undeclared identifier
c:\1000\gege.cpp(5) : error C2065: 'cin' : undeclared identifier
c:\1000\gege.cpp(5) : warning C4552: '>>' : operator has no effect; expected operator with side-effect
c:\1000\gege.cpp(6) : error C2297: '<<' : illegal, right operand has type 'char [16]'
c:\1000\gege.cpp(9) : warning C4552: '>>' : operator has no effect; expected operator with side-effect
c:\1000\gege.cpp(29) : error C2297: '<<' : illegal, right operand has type 'char [14]'
执行 cl.exe 时出错.

dfdf.exe - 1 error(s), 0 warning(s)

#35
aipb20072007-05-23 20:56
回复:(孤魂居士)[em07] 无限循环哥哥```你是我的偶...
偶不叫无限循环啊!

呵呵!
#36
孤魂居士2007-05-23 20:59
  无限循环哥哥  这是怎么回事?
#37
aipb20072007-05-23 21:15
你是不是忘加头文件了???
#38
孤魂居士2007-05-23 21:17
那你怎么没有给我加```
我直接复制的``
嘿嘿```
哥哥``你太强悍了
你学C++学了多时间了?我看我学到N年也没有你牛``
#39
aipb20072007-05-23 21:23
这有什么牛的?很简单的啊!我大一下学,现在大二下。(中途堕落了阵)

呵呵,你努力的话很快就可以有这种水平,别抬举我了哈!
#40
孤魂居士2007-05-23 21:28
我现在大1下学期```
我就差这多````
哥哥 教教我怎么样学编程列`` 不胜感激``
#41
aipb20072007-05-23 21:38
教谈不上!

其实学这个东东道理很简单,“多看,多想,多练,多问”

做到就行了!

加油吧!
#42
孤魂居士2007-05-23 21:43

好的``谢谢无限哥哥````以后我会努力的``
也祝无限哥哥越学越厉害```

1