鱼C论坛

 找回密码
 立即注册
查看: 3288|回复: 16

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

[复制链接]
发表于 2013-11-11 19:41:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>  
  
void main(void)  
{  
  
void reversal();  
static int a[10] = {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[0]故应该是int(9/2) */
int temp,i,j; /* 建立零时变量temp用于每次交换处理时零时存储x的值 */
for (i=0;i<=m;i++)  
{  
j=n-1-i; /* 反向计算出被调换的数组下标,例如x[0] 对应的x[n-1-i]就是x[9] */
temp=x;  
x=x[j];  
x[j]=temp;  
}  
}  
  
/* 次题需要注意的是:这里由于a[10]和x[10]是共同享内存地址位的所以进行交换后a[10]的实际值也就发生了改变 */






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


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


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


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


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


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


好苦恼。求高人指导学习。 现在不相信好多好多!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-11 20:57:25 | 显示全部楼层
真的是原版源代码?
光void reversal();  这一句就暴露了菜鸟的水平。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-11 21:44:16 | 显示全部楼层
不懂c++,帮顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-11 21:48:13 | 显示全部楼层
这代码很有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-11 22:32:51 | 显示全部楼层
确定是C++?扯谈了吧。。。
C++调用C标准库的话<stdio.h>应该为<cstdio>的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-11 22:59:58 | 显示全部楼层

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

错误的代码让我看了不下半个小时。硬是想不明白什么问题!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-11 23:00:43 | 显示全部楼层
叁er 发表于 2013-11-11 21:48
这代码很有问题

是有问题,我100%复制的书上的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-11 23:01:29 | 显示全部楼层
QQ官方 发表于 2013-11-11 20:57
真的是原版源代码?
光void reversal();  这一句就暴露了菜鸟的水平。。。

是的 参数不对。可是书上就是这么写的。  表示各种撞鼻子!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

}  

/*
*  函数定义:你的参数类型呢?
*  形参放的位置有往函数体放的么?
*  C++是不能省略返回值,你的函数返回值呢?
*/
void reversal(int arr[],int nLen) 
{  
        int m=(nLen-1)/2; /* 计算10个数需要循环几次,因为是两两调换第一个数组是x[0]故应该是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[i];
                arr[i] = arr[j];
                arr[j] = temp;
                
        }  
}  

/* 次题需要注意的是:这里由于a[10]和x[10]是共同享内存地址位的所以进行交换后a[10]的实际值也就发生了改变 */
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-12 08:46:30 | 显示全部楼层
星之陨 发表于 2013-11-11 22:32
确定是C++?扯谈了吧。。。
C++调用C标准库的话应该为的。。

C++标准库不应该是<iostream.h>?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-12 19:42:48 | 显示全部楼层

这个代码真的是从书上复制的。:sweat:  。不过还是谢谢你了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-12 21:56:54 | 显示全部楼层
叁er 发表于 2013-11-12 08:46
C++标准库不应该是?

<iostream>用于输入输出,也不一定所有都需要噶,我意思是在C++里用C的标准头应该是<cstdio>而不是<stdio.h>噶,就像你要在C++里用C的<ctype.h>这个头,正确的写法应该是<cctype>这样噶~可以看下C++ Primer这本书噶~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0] 对应的x[n-1-i]就是x[9]
temp=x[i];
x[i]=x[j];
x[j]=temp;

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

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

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

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

        return 0;
}  

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

使用道具 举报

发表于 2013-11-13 08:13:05 | 显示全部楼层
出书嘛,难免有不周全的时候。
你不懂的完全可以来论坛嘛,大家都热心的、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-13 08:33:22 | 显示全部楼层
星之陨 发表于 2013-11-12 21:56
用于输入输出,也不一定所有都需要噶,我意思是在C++里用C的标准头应该是而不是噶,就像你要在C++里用C的 ...

哦,懂你的意思了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-13 09:10:16 | 显示全部楼层
C++编译器下的C语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-13 10:07:48 | 显示全部楼层
这不扯呢吗 顿时对自己充满信心~~{:7_168:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 10:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表