同样的代码,为何.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++输入大于三的数就不行了,这是为啥?难道我指针用错了?
...全文
270 14 打赏 收藏 转发到动态 举报
写回复
用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开始的。
市面上能下载的《算法导论》中文版都没有目录(标签),阅读极不方便,翻阅困难。本人(crocostone)亲自手动制作了完整的标签,包括章、节、小节的标签,在Acrobat 7.0和9.0版本和FoxitReader 4.2版本均能打开。 而且,我精心调整了文档的大小,打开或点击标签的时候,默认就是最适合阅读、眼睛最舒服的文档大小,无需再调整大小。 本人亲自制作,在CSDN上奉献,欢迎使用!有了目录(标签),学习效率真的可以提高一大截啊!!!注意本压缩包使用WinRAR分卷压缩,4个部分都下载后才能解压! 为什么要分卷:整个文件有130MB,crocostone的上传权限不够,所以只能分卷压缩。已经测试:这4个压缩包,使用WinRAR/7zip/Haozip都能正确解压!!! 内容: 1、全世界唯一带“完整”目录的《算法导论》第二版中文版。 2、目前能找到的多个版本的习题答案和代码,有Java实现的,C++实现的,官方的、非官方的,教参,考试题答案等等! 3、讲义。 4、算法导论第二版最清晰的英文版,文字和伪代码可以拷出来。 书籍介绍: 《算法导论》(Introduction to Algorithms)原书第二版,Thomas H. Cormen(科曼)、Charles E. Leiserson、Ronald L.Rivest、Clifford Stein著,南京大学潘金贵、顾铁成、李成法、叶懋等译,机械工业出版社,2006。本书简称CLRS,麻省理工学院教材,全世界最广泛使用的算法超经典书籍,学习编程必看之书。作者之一的Rivest就是RSA算法发明者的R,2002年图灵奖得主。算法是程序员必练内功。此书主要讨论算法,数据结构方面的内容稍少。中文翻译质量不错。 ########################【对于crocostone本人前面发的算法导论的资源的说明】########################### download.csdn.net/source/3109111和download.csdn.net/source/3109150是一套两个部分的压缩文件,后缀名是001和002,不要改名,只能用7zip和Haozip解压,用WinRAR无法解压,解压后是带章、节、小节目录的算法导论。 download.csdn.net/source/3108513和download.csdn.net/source/3108520是另一套两个部分的压缩文件,后缀名是001和002,不要改名,只能用7zip和Haozip解压,用WinRAR无法解压,解压后是带章目录的算法导论,但是没有节和小节的目录。 本人的电脑以前没有WinRAR,而是一直使用7zip,但是7zip制作的zip分卷压缩格式竟然与WinRAR不兼容,导致前面发的资源,用WinRAR的网友说无法解压,在这里表示抱歉!使用7zip或Haozip的人都解压成功了。 这次发的资源,4个压缩包,使用WinRAR/7zip/Haozip都能正确解压! 请CSDN网友,下载完,评论的同时,要点击评论框上方的五角星(共5个五角星),这样你的被扣的积分就可以返还,还会加一分。如果只评论,不点击小五角星,积分不会返还。一定要先下载完,再评论。如果先评论后下载,或者在下载的过程中评论,积分同样不会返还。 数据结构教材,我强烈推荐Sartaj Sahni著《数据结构算法与应用——C++语言描述》。这是一部难得的好书,作者循序渐进,娓娓道来,每一种数据结构和算法都给出了详细的实现代码和运行结果,而且代码质量极高,甚至可以直接照搬到商业软件开发中。此书的算法部分也很精到,比算法导论更容易学习和入门。Sartaj Sahni《数据结构算法与应用——C++语言描述》全集,包含中英文图书、代码、习题答案、演示动画,都是我亲自从此书的官方网站下载并汇总的,绝对权威,请在这里下载:download.csdn.net/source/3043982 算法和数据结构是计算机的绝对核心技术。学好核心技术,既为了自己,也为了天空不落下别国的炸弹,别国的天空落下我们的炸弹!

64,682

社区成员

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

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