鱼C论坛

 找回密码
 立即注册
查看: 2438|回复: 9

[已解决]我也说不清是哪的问题,输入的次数少于6就没毛病,已超过就完蛋了

[复制链接]
发表于 2019-3-26 21:25:25 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. /*                     输入一组数据   放到数组中  然后将重复的数其中一个变成0
  3.                                                 我这个出了问题了,不知道为什么 只要输入的数超过6个 就
  4.                                                 无法在输入了,大家帮忙看下怎么回事呢 */
  5. int main()
  6. {
  7.     int i=0,j,temp,m;
  8.     int a[i];
  9.     printf("请输入\n");
  10.         do{
  11.     scanf("%d",&a[i]);
  12.     //a[i]=getchar();
  13.         //int(a[i]);
  14.         i=i+1;
  15.     }
  16.     while(a[i-1]!=0);
  17.     m=i-1;
  18.     for(j=0;j<m-1;j++)
  19.                 for(i=j+1;i<m;i++)
  20.                 {
  21.                 if(a[j]==a[i])
  22.                 char(a[i]='\t');
  23.                 }
  24.         for(i=0;i<m;i++)
  25.         printf("%d\t",a[i]);
  26.         return 0;
  27. }       
复制代码
最佳答案
2019-3-26 23:04:12
蜗牛冲上天 发表于 2019-3-26 22:37
我定义的那个数组 不是瞎定义的 ,因为不知道 用户会输入多少个数,这样定义不会使数组的内存被浪费,反 ...

谁告诉你变长数组是这么用的?先去把相关概念搞清楚,
从你问的问题就能看出来,你对内存根本没有概念,先去看看数据在内存里怎么存储,什么是栈,什么是堆,然后再来按自己的想法来写
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-26 21:42:49 | 显示全部楼层
本帖最后由 Croper 于 2019-3-26 21:51 编辑

话说你这很多写法都有问题啊

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int i=0,j,temp,m;
  5.     int a[i];           //这是什么写法,先不说常量表达式的问题,你这声明了一个零长度的数组是要搞哪样
  6.     printf("请输入\n");
  7.     do{
  8.             scanf("%d",&a[i]);
  9.          i=i+1;
  10.     }while(a[i-1]!=0);

  11.     m=i-1;
  12.     for(j=0;j<m-1;j++)
  13.             for(i=j+1;i<m;i++)
  14.        {
  15.               if(a[j]==a[i])
  16.                char(a[j]='t');  //这又是什么新写法,强制类型转换也不是这样写啊,然后你把一个整数赋值成⑨是要干什么
  17.        }
  18.    for(i=0;i<m;i++)
  19.         printf("%d\t",a[i]);
  20.   return 0;
  21. }      
复制代码


不过还好,思路没问题,把这两个地方改了就行
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int i = 0, j, temp, m;
  5.         int a[100];
  6.         printf("请输入n\n");
  7.         do {
  8.                 scanf("%d", &a[i]);
  9.                 i = i + 1;
  10.         } while (a[i - 1] != 0);

  11.         m = i - 1;
  12.         for (j = 0; j < m - 1; j++) {
  13.                 for (i = j + 1; i < m; i++)
  14.                 {
  15.                         if (a[j] == a[i]) {
  16.                                 a[i] = 0;
  17.                                 break;   //这里可以加个break,避免重复运算
  18.                         }
  19.                 }
  20.         }
  21.         for (i = 0; i < m; i++) printf("%d\t", a[i]);

  22.         return 0;
  23. }     
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-26 22:33:05 | 显示全部楼层
Croper 发表于 2019-3-26 21:42
话说你这很多写法都有问题啊

不过还好,思路没问题,把这两个地方改了就行

大佬 我在问你几个问题
1.啥叫重复运算啊
2.为啥在那加个break
3.可以换个别的什么东西表示结束吗 就是把我那个0给换成个别的 比如A-Z啥的字符
4.最后怎么把我替换成0,替换成别的东西最好是空白的 如果我的数据里有0就完蛋了
/*******谢谢大佬******/
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-26 22:37:46 | 显示全部楼层
蜗牛冲上天 发表于 2019-3-26 22:33
大佬 我在问你几个问题
1.啥叫重复运算啊
2.为啥在那加个break

我定义的那个数组 不是瞎定义的 ,因为不知道 用户会输入多少个数,这样定义不会使数组的内存被浪费,反正C99支持 数组大小可以改变 哈哈  不是随便定义的0长度数组奥  哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-26 23:01:11 | 显示全部楼层
蜗牛冲上天 发表于 2019-3-26 22:33
大佬 我在问你几个问题
1.啥叫重复运算啊
2.为啥在那加个break

1.啥叫重复运算啊
2.为啥在那加个

比如在数据{1,2,3,1,4}中,当j=3是,i=0时,已经有a[ i]==a[j]了,就不需要再继续比a[1]是否等于a[j],a[2]是否等于a[j]了,直接break掉;
3.可以换个别的什么东西表示结束吗 就是把我那个0给换成个别的 比如A-Z啥的字符
4.最后怎么把我替换成0,替换成别的东西最好是空白的 如果我的数据里有0就完蛋了

你既然已经printf("%d"),那么就是告诉编译器把这段数据当整数来解释,既然解释成整数了,怎么把这个数据显示成空白,
你一定要空白,加个判断,等于0就不显示呗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-26 23:04:12 | 显示全部楼层    本楼为最佳答案   
蜗牛冲上天 发表于 2019-3-26 22:37
我定义的那个数组 不是瞎定义的 ,因为不知道 用户会输入多少个数,这样定义不会使数组的内存被浪费,反 ...

谁告诉你变长数组是这么用的?先去把相关概念搞清楚,
从你问的问题就能看出来,你对内存根本没有概念,先去看看数据在内存里怎么存储,什么是栈,什么是堆,然后再来按自己的想法来写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-26 23:14:21 From FishC Mobile | 显示全部楼层
Croper 发表于 2019-3-26 23:04
谁告诉你变长数组是这么用的?先去把相关概念搞清楚,
从你问的问题就能看出来,你对内存根本没有概念, ...

的确 不太清楚 我们刚开这门课,老师还没讲到 数组跟指针,自己学的 也不扎实, 谢谢大佬,我这样定义数组我也感觉有隐患,但是假如不知道数组长度是多少,该怎样定义个数组才比较好呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-26 23:36:06 From FishC Mobile | 显示全部楼层
Croper 发表于 2019-3-26 23:01
比如在数据{1,2,3,1,4}中,当j=3是,i=0时,已经有a[ i]==a[j]了,就不需要再继续比a[1]是否等于a[j] ...

大佬,这个重复运算有问题,我这个程序是想把 所有重复的数字只留下一个,你这样做 后边会继续有重复的比如输入 1  3  1  5  1
得到的结果是1  3  0  5  1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-27 01:48:56 | 显示全部楼层
蜗牛冲上天 发表于 2019-3-26 23:14
的确 不太清楚 我们刚开这门课,老师还没讲到 数组跟指针,自己学的 也不扎实, 谢谢大佬,我这样定义数 ...

一般来说,往大的定义就是了,现在的电脑不差那点内存,

要知道,C和C++里,不存在真正的变长数组,如果你一定要实现内存的高效利用的话,一般是考虑动态内存:
  1. int arr_size=5
  2. int* arr= (int*)malloc(sizeof(int)*arr_size)
复制代码

这样就申请了一个5个整数大小的数组,当5个整数的空间不够用时
  1. arr_size+=5;
  2. arr=(int*)realloc(arr,sizeof(int)*arr_size);
复制代码

这样就把数组的大小扩展到了10个整数的空间

但是这种扩展其实是把这段内存里的数据拷贝到其他足够大小片段中,然后再将这段内存释放掉,本身这个过程就是极耗时间的。另外,这种动态申请的内存都是保存在堆里的,而直接申明的数组保存在栈里。而堆里的数据访问本身就比栈里要慢。所以在大部分时候,这种做法的效率是比直接定义一个大数组要低的。

如果你了解c++,stl库里的一堆容器仿佛实现了可变长度的数组,但底层仍然是和上面相似的方法,如果你非要一个字节一个字节地扣长度,那最终只能是降低程序的效率
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-27 01:57:45 | 显示全部楼层
蜗牛冲上天 发表于 2019-3-26 23:36
大佬,这个重复运算有问题,我这个程序是想把 所有重复的数字只留下一个,你这样做 后边会继续有重复的比 ...

好吧,break确实不应该在那儿,
但是改一下遍历顺序就能加入break
  1.     for (i=1;i<m;++i){
  2.             for (j=0;j<i;++j){
  3.                     if (a[i]==a[j]){
  4.                             a[i]=0;
  5.                             break;
  6.                         }
  7.                 }
  8.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 17:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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