把苹果打哭 发表于 2013-11-11 19:41:35

一个月挑战c++难道最可靠的资料也有错?求检测。如果没错,求讲解

#include <stdio.h>

void main(void)
{

void reversal();
static int a = {0,1,2,3,4,5,6,7,8,9}; /* 建立一个数组并初始化 */
int i;
for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("\n");
reversal(a,10); /* 调用自定义涵数进行反向显示排序,并把数组a的起始地址传送给形式参数x */

for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("\n");

}

void reversal(x,n)
int x[],n; /* 定义形式参数 */
{
int m=(n-1)/2; /* 计算10个数需要循环几次,因为是两两调换第一个数组是x故应该是int(9/2) */
int temp,i,j; /* 建立零时变量temp用于每次交换处理时零时存储x的值 */
for (i=0;i<=m;i++)
{
j=n-1-i; /* 反向计算出被调换的数组下标,例如x 对应的x就是x */
temp=x;
x=x;
x=temp;
}
}

/* 次题需要注意的是:这里由于a和x是共同享内存地址位的所以进行交换后a的实际值也就发生了改变 */






上面的代码我把不懂的地方用红色标记了。然后自己测试了一下 编译器错误,说是不能转换。x=x;   


我个人是这么理解的: x是数组名。可以看成是一个指针变量。然后 x是一个普通的int型变量,怎么可以转换呢。


然后这个告诉我苦学好无奈啊。首先,网上没有可信的资料。让人很苦恼啊。(之前,觉得天草的逆向很厉害。那么他的编程


也一定很牛逼。他的VIP教程当时卖5000? 后来,知道他是一个业余的程序员。


然后现在把,很多培训机构都很扯淡。说白了,进去就是骗钱去了。真的不如我自己自学。我当时咨询达内c++的客服!如果我考研没时间去那里学习。抽空去的话能随时开课不? 他直接说:你可以交1w然后我们给你课件。你在学校自学。然后来了我们直接实践项目。


如果课件教程值1w的话。那么百度网盘的2012年的达内c++的教程就值5K了 ~可惜不是!!!!!!!


好苦恼。求高人指导学习。 现在不相信好多好多!!

QQ官方 发表于 2013-11-11 20:57:25

真的是原版源代码?
光void reversal();这一句就暴露了菜鸟的水平。。。

bigshan 发表于 2013-11-11 21:44:16

不懂c++,帮顶

叁er 发表于 2013-11-11 21:48:13

这代码很有问题

星之陨 发表于 2013-11-11 22:32:51

确定是C++?扯谈了吧。。。
C++调用C标准库的话<stdio.h>应该为<cstdio>的。。

把苹果打哭 发表于 2013-11-11 22:59:58

星之陨 发表于 2013-11-11 22:32 static/image/common/back.gif
确定是C++?扯谈了吧。。。
C++调用C标准库的话应该为的。。

一个月挑战c++.chm网上有书。可以去参考一下。我真的是被现在的资料打败了,真的 灰心啊

错误的代码让我看了不下半个小时。硬是想不明白什么问题!!!

把苹果打哭 发表于 2013-11-11 23:00:43

叁er 发表于 2013-11-11 21:48 static/image/common/back.gif
这代码很有问题

是有问题,我100%复制的书上的代码。

把苹果打哭 发表于 2013-11-11 23:01:29

QQ官方 发表于 2013-11-11 20:57 static/image/common/back.gif
真的是原版源代码?
光void reversal();这一句就暴露了菜鸟的水平。。。

是的 参数不对。可是书上就是这么写的。表示各种撞鼻子!

tmfish 发表于 2013-11-11 23:02:03

//C++头文件标准应该使用
//#include<cstdio>
#include <stdio.h>

////////////////////////////////////////////////////////////////////////////////////
/*
*   其实吧,看见您这杂乱的编码风格我是相当没心情帮你的
*   但是我为了论坛经验,还是硬着头皮看了,
*   评价:   您看书太不认真。任何一本书都不可能犯这么多低级错误。
*                       还是认认真真踏踏实实的看书,一个例子一个例子的敲.
*            如果您的书真的是这么教的话,换一本吧!我没什么推荐的
*                       网上有关新手推荐的书很多,多找基本。总有适合自己的
*   
*/
////////////////////////////////////////////////////////////////////////////////////

//这句话是意思应该是函数声明吧!函数声明有往函数体里面放的么?
//下面对这函数的定义有两个参数,但是声明却是没有参数的
//C++默认空括号为无参意即 void reversal(void);

void reversal(int arr[],int nLen);

void main(void)
{
        static int a = {0,1,2,3,4,5,6,7,8,9}; /* 建立一个数组并初始化 */
        int i;
        for (i=0;i<10;i++)
        {
                printf("%d ",a);   //这里应该是需要打出a数组所有类容,你的下标呢?
        }
        printf("\n");

        reversal(a,10); /* 调用自定义涵数进行反向显示排序,并把数组a的起始地址传送给形式参数x */

        for (i=0;i<10;i++)
        {
                printf("%d ",a);   //这个是上面一样的,你数组的下标呢?
        }
        printf("\n");
        getchar();

}

/*
*函数定义:你的参数类型呢?
*形参放的位置有往函数体放的么?
*C++是不能省略返回值,你的函数返回值呢?
*/
void reversal(int arr[],int nLen)
{
        int m=(nLen-1)/2; /* 计算10个数需要循环几次,因为是两两调换第一个数组是x故应该是int(9/2) */
        int temp,i,j; /* 建立零时变量temp用于每次交换处理时零时存储x的值 */
        //我简单说下交换的算法
        //1.计算出需要交换的两个数的下标
        //2.用一个临时变量存放位置在前的数
        //3.将位置在前的数替换为位置在后的数
        //4.将临时变量中的数放入位置在后的数中
        for (i=0;i<=m;i++)
        {
                j=nLen-i-1;
                temp   = arr;
                arr = arr;
                arr = temp;
               
        }
}

/* 次题需要注意的是:这里由于a和x是共同享内存地址位的所以进行交换后a的实际值也就发生了改变 */

叁er 发表于 2013-11-12 08:46:30

星之陨 发表于 2013-11-11 22:32 static/image/common/back.gif
确定是C++?扯谈了吧。。。
C++调用C标准库的话应该为的。。

C++标准库不应该是<iostream.h>?

把苹果打哭 发表于 2013-11-12 19:42:48

tmfish 发表于 2013-11-11 23:02 static/image/common/back.gif


这个代码真的是从书上复制的。:sweat:。不过还是谢谢你了。

星之陨 发表于 2013-11-12 21:56:54

叁er 发表于 2013-11-12 08:46 static/image/common/back.gif
C++标准库不应该是?

<iostream>用于输入输出,也不一定所有都需要噶,我意思是在C++里用C的标准头应该是<cstdio>而不是<stdio.h>噶,就像你要在C++里用C的<ctype.h>这个头,正确的写法应该是<cctype>这样噶~可以看下C++ Primer这本书噶~!

QQ[我在线上] 发表于 2013-11-13 08:07:00

/*
一般来说。C++头文件是在C的原头文件上去掉.h。
前面加上c。把所有函数都放进std命名空间
但是对于旧版编译器来说,可以用C的头文件(考虑到兼容问题),
新版编译器个人认为用最新的C++标准来使用最好,考虑到习惯命名空间这项功能
一般都会为主函数定义一个返回值(returned 0)来作为检测程序。


int main()
{
......;
return 0;
}

在函数定义的时候原文是这样写的
void reversal(x,n)
int x[],n; // 定义形式参数
其实这个是C语言中的 K&R 方法
一般我们都会同时定义
void reversal(int x[],int n)

文中出现这函数声明的地方是主函数,
或许你的编译器允许你这么做,
但为了兼容性,还有整体美观
应该在主函数上面声明这个函数。
说给编译器,你有这函数,让编译器去寻找

x并非数组名,而是一个指针常量,不能修改的值。
该值指向数组的开始地址

一般互换都是
t = a;
a = b;
b = t;
所以,这里应该是
j=n-1-i; // 反向计算出被调换的数组下标,例如x 对应的x就是x
temp=x;
x=x;
x=temp;

原文:
printf("%d ",a);
这里输出的是地址
应该是这样
printf("%d ",a);
*/

//修改后的程序
#include <cstdio>

void reversal(int x[],int n);
int main()
{
        using std::printf;
        int a = {0,1,2,3,4,5,6,7,8,9}; /* 建立一个数组并初始化 */
        int i;
        for (i=0;i<10;i++)
        {
                printf("%d ",a);
        }
        std::printf("\n");
        reversal(a,10); /* 调用自定义涵数进行反向显示排序,并把数组a的起始地址传送给形式参数x */

        for (i=0;i<10;i++)
        {
                printf("%d ",a);
        }
        printf("\n");

        return 0;
}

void reversal(int x[],int n) /* 定义形式参数 */
{
        int m=(n-1)/2; /* 计算10个数需要循环几次,因为是两两调换第一个数组是x故应该是int(9/2) */
        int temp,i,j; /* 建立零时变量temp用于每次交换处理时零时存储x的值 */
        for (i=0;i<=m;i++)
        {
                j=n-1-i; /* 反向计算出被调换的数组下标,例如x 对应的x就是x */
                temp=x;
                x=x;
                x=temp;
        }
}
/*
评价:这个程序以本人来是作者经验不够
一般的数组都用宏定义(C语言)
或者用常量const(C++)来作为下标
而且程序带有浓厚的C语言
比如 K&R 定义函数
*/

浮砂 发表于 2013-11-13 08:13:05

出书嘛,难免有不周全的时候。
你不懂的完全可以来论坛嘛,大家都热心的、

叁er 发表于 2013-11-13 08:33:22

星之陨 发表于 2013-11-12 21:56 static/image/common/back.gif
用于输入输出,也不一定所有都需要噶,我意思是在C++里用C的标准头应该是而不是噶,就像你要在C++里用C的 ...

哦,懂你的意思了

yinyuepingguo 发表于 2013-11-13 09:10:16

C++编译器下的C语言

花落、季 发表于 2013-11-13 10:07:48

这不扯呢吗 顿时对自己充满信心~~{:7_168:}
页: [1]
查看完整版本: 一个月挑战c++难道最可靠的资料也有错?求检测。如果没错,求讲解