同样的代码,为何.net可以,而C++不可以??

huaxiamengqing 2013-04-07 07:20:10
打印杨辉三角,用一维数组定义来模拟二维数组(为了让C++可以动态创建数组),代码如下:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
int n =10;//杨辉三角的行数

cout << "请输入杨辉三角的行数:";
cin >>n;

//int Mar[12][12];
//int n =12;
//int i,j;
//int Mbs = n/10+2;
// for(i=1;i<n;i++){
// for(j=1;j<=i;j++){
// if (i==j||j==1)
// {Mar[i][j] =1;}
// else
// {
// Mar[i][j] = Mar[i-1][j-1] + Mar[i-1][j];
// }
// }
//}
// for(i=1;i<n;i++){
// cout << setw((n-i)*Mbs)<<"";
// for(j=1;j<=i;j++){
// cout <<setw(Mbs*2)<<Mar[i][j];
// }
// cout << endl;
// }
int *Mar = new int((1+n)*n/2+n);
int i,j,Mbs = n/10+2;
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
if (i==j||j==0)
{Mar[(1+i)*i/2+j] =1;}
else
{
Mar[(1+i)*i/2+j] = Mar[(i-1)*i/2+j-1] + Mar[(i-1)*i/2+j];
}
}
}
for(i=0;i<n;i++){
cout << setw((n-i)*Mbs)<<"";
for(j=0;j<=i;j++){
cout <<setw(Mbs*2)<<Mar[(1+i)*i/2+j];
}
cout << endl;
}
/* delete [] Mar;*/

return 0;
}

但是C++输入4程序就死掉了。
VB.net代码如下:

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim n As Int16 = InputBox("请输入n")
Dim Mbs As Int16 = n \ 10 + 2
Dim Marr((1 + n) * n / 2 + n) As Int16
For I As Int16 = 0 To n
For j As Int16 = 0 To I
If I = j Or j = 0 Then
Marr((1 + I) * I / 2 + j) = 1
Else
Marr((1 + I) * I / 2 + j) = Marr((I - 1) * I / 2 + j - 1) + Marr((I - 1) * I / 2 + j)
End If
Next
Next
For I As Int16 = 0 To n
For k As Int16 = 1 To (n - I) * Mbs
Label1.Text &= " "
Next
For j As Int16 = 0 To I
For k As Int16 = 1 To 2 * Mbs
Label1.Text &= " "
Next
Label1.Text &= Marr((1 + I) * I / 2 + j)
Next
Label1.Text &= vbCrLf
Next
End Sub
End Class

这个则可以输出没有什么问题,输入什么值都可以,而C++输入大于三的数就不行了,这是为啥?难道我指针用错了?
...全文
276 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
漫步者、 2013-04-12
  • 打赏
  • 举报
回复
new数组对象,要注意越界
huaxiamengqing 2013-04-12
  • 打赏
  • 举报
回复
[quote=引用 11 楼 dahuaixiaohuai 的回复:] int *Mar = new int((1+n)*n/2+n); 这只是new了一个整数的内存,你却要当作数组来用。内存要越界了。[/quot] 恩,这错误一楼一间指出
huaxiamengqing 2013-04-11
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
C/C++ code ? 1234567891011121314151617181920212223242526272829 #include <stdio.h> #define MAXN 10 unsigned __int64 y[MAXN][MAXN]; int i,j; char s[60]; void main() { printf("%30s\n","1 ……
代码是简单,但是你不能输入一个数,然后开辟那么多空间,做出这个三角形。二维数组不能两个都动态分配,这是我使用一维数组的原因。
huaxiamengqing 2013-04-11
  • 打赏
  • 举报
回复
引用 7 楼 zhcosin 的回复:
引用 2 楼 huaxiamengqing 的回复: 引用 1 楼 zhcosin 的回复:问题1: 33行的new后面应是中括号。 问题2: 38和41行的下标都是错的,要注意C/C++数组的下标是从0开始的。 多谢提醒第一个问题!问题就在这里,第二个问题估计是你没有看懂代码 你知道你用小括号会发生什么后果吗,比如你想开五个整数的空间,你写成这样: C/C++ code ? ……
佩服,佩服,研究的透彻,最牛逼的人永远是基础掌握最牢固的人。
星空独行 2013-04-11
  • 打赏
  • 举报
回复
一叶之舟 2013-04-11
  • 打赏
  • 举报
回复
int *Mar = new int((1+n)*n/2+n); 这只是new了一个整数的内存,你却要当作数组来用。内存要越界了。
赵4老师 2013-04-10
  • 打赏
  • 举报
回复
#include <stdio.h>
#define MAXN 10
unsigned __int64 y[MAXN][MAXN];
int i,j;
char s[60];
void main() {
    printf("%30s\n","1  ");
    printf("%33s\n","1     1  ");
    y[1][0]=1ui64;y[1][1]=1ui64;
    for (i=2;i<MAXN;i++) {
        y[i][0]=1ui64;sprintf(s,"1  ");
        for (j=1;j<=i-1;j++) {
            y[i][j]=y[i-1][j-1]+y[i-1][j];
            sprintf(s,"%s   %-3I64u",s,y[i][j]);
        }
        y[i][i]=1ui64;sprintf(s,"%s   1  ",s);
        printf("%*s\n",30+i*3,s);
    }
}
//                           1
//                        1     1
//                     1     2     1
//                  1     3     3     1
//               1     4     6     4     1
//            1     5     10    10    5     1
//         1     6     15    20    15    6     1
//      1     7     21    35    35    21    7     1
//   1     8     28    56    70    56    28    8     1
//1     9     36    84    126   126   84    36    9     1
//按如下格式打印杨辉三角形的前MAXN行。
//  1
//  1 1
//  1 2 1
//  1 3 3 1
//  1 4 6 4 1
//  1 5 10 10 5 1
#include <stdio.h>
#define MAXN 68
unsigned __int64 y[MAXN][MAXN];
int i,j;
void main() {
    printf("1\n");
    printf("1 1\n");
    y[1][0]=1ui64;y[1][1]=1ui64;
    for (i=2;i<MAXN;i++) {
        y[i][0]=1ui64;printf("1 ");
        for (j=1;j<=i-1;j++) {
            y[i][j]=y[i-1][j-1]+y[i-1][j];
            printf("%I64u ",y[i][j]);
        }
        y[i][i]=1ui64;printf("1\n");
    }
}
//1
//1 1
//1 2 1
//1 3 3 1
//1 4 6 4 1
//1 5 10 10 5 1
//1 6 15 20 15 6 1
//1 7 21 35 35 21 7 1
//1 8 28 56 70 56 28 8 1
//1 9 36 84 126 126 84 36 9 1
//...
//1 67 2211 47905 766480 9657648 99795696 869648208 6522361560 42757703560 247994680648 1285063345176 5996962277488 25371763481680 97862516286480 345780890878896 1123787895356412 3371363686069236 9364899127970100 24151581961607100 57963796707857040 129728497393775280 271250494550621040 530707489338171600 972963730453314600 1673497616379701112 2703342303382594104 4105075349580976232 5864393356544251760 7886597962249166160 9989690752182277136 11923179284862717872 13413576695470557606 14226520737620288370 14226520737620288370 13413576695470557606 11923179284862717872 9989690752182277136 7886597962249166160 5864393356544251760 4105075349580976232 2703342303382594104 1673497616379701112 972963730453314600 530707489338171600 271250494550621040 129728497393775280 57963796707857040 24151581961607100 9364899127970100 3371363686069236 1123787895356412 345780890878896 97862516286480 25371763481680 5996962277488 1285063345176 247994680648 42757703560 6522361560 869648208 99795696 9657648 766480 47905 2211 67 1
zhcosin 2013-04-09
  • 打赏
  • 举报
回复
引用 2 楼 huaxiamengqing 的回复:
引用 1 楼 zhcosin 的回复:问题1: 33行的new后面应是中括号。 问题2: 38和41行的下标都是错的,要注意C/C++数组的下标是从0开始的。 多谢提醒第一个问题!问题就在这里,第二个问题估计是你没有看懂代码
你知道你用小括号会发生什么后果吗,比如你想开五个整数的空间,你写成这样: [code=c/c++] int *p = new int(5); [/code] 你知道这会发生什么事情吗?这里只分配了一个整数的空间,而且这个空间里放进了一个整数:5 这个5就成了整数类型的构造函数的参数!
zhcosin 2013-04-09
  • 打赏
  • 举报
回复
引用 2 楼 huaxiamengqing 的回复:
引用 1 楼 zhcosin 的回复:问题1: 33行的new后面应是中括号。 问题2: 38和41行的下标都是错的,要注意C/C++数组的下标是从0开始的。 多谢提醒第一个问题!问题就在这里,第二个问题估计是你没有看懂代码
估计我算错了,呵呵
ri_aje 2013-04-09
  • 打赏
  • 举报
回复
引用 4 楼 huaxiamengqing 的回复:
引用 3 楼 ri_aje 的回复:楼主的 c++ 代码太乱了,看着就头疼。下面是我写的一个小例子,有兴趣的话可以看看。 C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#in……
那里不明白?
huaxiamengqing 2013-04-09
  • 打赏
  • 举报
回复
引用 3 楼 ri_aje 的回复:
楼主的 c++ 代码太乱了,看着就头疼。下面是我写的一个小例子,有兴趣的话可以看看。 C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#include <iostream>#i……
不好意思,刚从.net转到C++,没看懂你写的是什么意思?我是用vs编译的。
ri_aje 2013-04-08
  • 打赏
  • 举报
回复
楼主的 c++ 代码太乱了,看着就头疼。下面是我写的一个小例子,有兴趣的话可以看看。

#include <iostream>
#include <iomanip>
#include <vector>

size_t ndigits (size_t n)
{
 if (0 == n) { return 1; }
 size_t ans = 0;
 while (n)
 {
  n /= 10;
  ++ans;
 }
 return ans;
}

int main (int ac, char** av)
{
 if (ac < 2)
 {
  std::cerr << "usage: " << av[0] << " positive-integer" << std::endl;
  return-1;
 }
 size_t const N = std::atoi(av[1]);
 if (N > 100)
 {
  std::cerr << "problem [" << N << "] too big" << std::endl;
  return-1;
 }

 // generation
 std::vector<std::vector<size_t>> rows(N);
 for (size_t i = 0; i != N; ++i)
 {
  auto& row = rows[i];
  if (0 == i) { row.push_back(1); }
  else
  {
   auto const& prev = rows[i-1];
   row.push_back(1);
   for (size_t j = 0, J = prev.size()-1; j != J; ++j)
   {
    row.push_back(prev[j]+prev[j+1]);
   }
   row.push_back(1);
  }
 }

 // print
 size_t const n = ndigits(rows.back()[rows.back().size()/2]);
 for (size_t i = 0; i != N; ++i)
 {
  std::cout << std::setw((N-i-1)*(n+2)/2) << "";
  for (auto const& x : rows[i])
  {
   std::cout << std::setw(n+2) << x;
  }
  std::cout << std::endl;
 }
}
huaxiamengqing 2013-04-07
  • 打赏
  • 举报
回复
引用 1 楼 zhcosin 的回复:
问题1: 33行的new后面应是中括号。 问题2: 38和41行的下标都是错的,要注意C/C++数组的下标是从0开始的。
多谢提醒第一个问题!问题就在这里,第二个问题估计是你没有看懂代码
zhcosin 2013-04-07
  • 打赏
  • 举报
回复
问题1: 33行的new后面应是中括号。 问题2: 38和41行的下标都是错的,要注意C/C++数组的下标是从0开始的。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧