鱼C论坛

 找回密码
 立即注册
查看: 3846|回复: 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了 ~  可惜不是!!!!!!!


好苦恼。求高人指导学习。 现在不相信好多好多!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-11-11 20:57:25 | 显示全部楼层
真的是原版源代码?
光void reversal();  这一句就暴露了菜鸟的水平。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-11 21:44:16 | 显示全部楼层
不懂c++,帮顶
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-11 21:48:13 | 显示全部楼层
这代码很有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-11 22:32:51 | 显示全部楼层
确定是C++?扯谈了吧。。。
C++调用C标准库的话<stdio.h>应该为<cstdio>的。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

错误的代码让我看了不下半个小时。硬是想不明白什么问题!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是有问题,我100%复制的书上的代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的 参数不对。可是书上就是这么写的。  表示各种撞鼻子!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-11 23:02:03 | 显示全部楼层
  1. //C++头文件标准应该使用
  2. //#include<cstdio>
  3. #include <stdio.h>  

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

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

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

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

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

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

  35. }  

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

  59. /* 次题需要注意的是:这里由于a[10]和x[10]是共同享内存地址位的所以进行交换后a[10]的实际值也就发生了改变 */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

C++标准库不应该是<iostream.h>?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个代码真的是从书上复制的。:sweat:  。不过还是谢谢你了。
小甲鱼最新课程 -> https://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这本书噶~!
小甲鱼最新课程 -> https://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 定义函数
*/
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-13 08:13:05 | 显示全部楼层
出书嘛,难免有不周全的时候。
你不懂的完全可以来论坛嘛,大家都热心的、
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哦,懂你的意思了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-13 09:10:16 | 显示全部楼层
C++编译器下的C语言
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-13 10:07:48 | 显示全部楼层
这不扯呢吗 顿时对自己充满信心~~{:7_168:}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 01:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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