回 帖 发 新 帖 刷新版面

主题:求高手指点

我写了一个程序,首先询问用户是从文件还是键盘输入数字
,根据用户的选择,把一组数字输出到屏幕,然后记录有多少种不同的数字,
并且输出每个数字有多少个,
如:1 2 3 4 5 2 4 1
我想要的输出是Number    count 
                1        2
                2        2
                3        1
                4        2
                5        1
我写的不知哪错了,但我真的觉得没错,求指点:)


#include <iostream>
#include <fstream>
#include <cstdlib>
#include <iomanip>
using namespace std;
void main()
{int i=0;
int n,j,k=0;
int a[50],b[50];//a[50]用来存最初输入的数字,b[50]用来记录每种不同的数字有多少个重复
char x;
cout<<"Do you want to select printing from file or key?(f or k)\n";
cin>>x;
if(x=='f')
{ char next;
ifstream fin;
 fin.open("file1.dat");
 if(fin.fail())
 {cout<<"Input file opening failed.\n";
  exit(1);
  }
  fin.get(next);
  while(!fin.eof())
  { cout<<next;
  a[i]=next;
   i++;
  fin.get(next);
  }
  fin.close();
 // i=i-1;
  cout<<endl;
}
else if(x=='k')
{cout<<"enter the number of numbers:\n";
cin>>i;
cout<<"enter:\n";
for(n=0;n<i;n++)
cin>>a[n];}
else cout<<"error!\n";
for(n=0;n<i;n++)//我是从第一个数字开始,把后面跟它重复的赋值为0,并且记录下重复的次数
{b[n]=1;
for(j=n+1;j<i;j++)
while(a[n]==a[j])
{b[n]++;
a[j]=0;
}
}
cout<<setw(10)<<"Number"<<setw(10)<<"count"<<endl;
for(n=0;n<i;n++)//输出从第一个数开始,数组中不为0的数字和重复个数
if(a[n]!=0)
cout<<setw(10)<<a[n]<<setw(10)<<b[n]<<endl;

}

回复列表 (共5个回复)

沙发

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int buf[] = { 1, 2, 3, 4, 5, 2, 4, 1 };

    size_t len = sizeof(buf)/sizeof(buf[0]);
    sort( buf, buf+len );
    for( size_t i=0, count=0; ++count, i<len; ++i )
    {
        if( i==len-1 || buf[i]!=buf[i+1] )
        {
            cout << '\t' << buf[i] << '\t' << count << endl;
            count = 0;
        }
    }

    return 0;
}

板凳


for(j=n+1;j<i;j++)
while(a[n]==a[j])//错误在这,1,2,3,4,5,2,4,1,当n=5,j=6的时候,a[5],a[6]都已经被设置为0了,0==0条件永远为真,导致死循环
{b[n]++;
a[j]=0;
}


这里没必要使用,while改成if:
if(a[n]==a[j])
{b[n]++;
a[j]=0;
}

另外你的代码逻辑有个BUG,就是无法统计0

3 楼


1、同意上面说法,把while(a[n]==a[j])改成if(a[n]==a[j])
2、while(!fin.eof())
  { cout<<next;
  a[i]=next;
   i++;
  fin.get(next);
  }
中 next为char类型,a[i]为int类型,应该将next转变成int:a[i]=(int)(next -'0');
还有并没有对空格字符做判断,应该先对得到的next先做空格判断,如果为空格,就continue;上述程序应该修改为:
while(!fin.eof())
{
    cout<<next;
    
    if(next==' ')
    {
        fin.get(next);
        continue;
    }

    a[i]=(int)(next -'0');
    i++;
    fin.get(next);
}
还有一个bug,只能统计个位数,如23,会作为二个数(2,3)来统计。

4 楼

嗯,谢谢大家的指导,受益匪浅哈,说明还是我想的不够透彻,对于这题大家有好的算法思想么?可不可以跟我讲讲???

5 楼

用map

我来回复

您尚未登录,请登录后再回复。点此登录或注册