| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 670 人关注过本帖
标题:我又来啦啦啦!!基础没扎牢!写啥错啥!!!再次请各位赐教
只看楼主 加入收藏
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
我又来啦啦啦!!基础没扎牢!写啥错啥!!!再次请各位赐教
程序代码:
#include <iostream>
using namespace std;
int sort(int n,int a[])
{
    int i,j,temp;
    for(j=0;j<=n-1;j++)
    {
        for (i=0;i<n-j;i++)
            if (a[i]>a[i+1])
            {
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
    }
    return a[1];
}
int main()
{
    int N;
    cin>>N;//输入行数
    int *A=new int[N];
    for(int k=1;k<=N;k++)
        cin>>A[k];//接收对应次数用户输入
    for(k=1;k<=N;k++)//调用sort函数并寻找经冒泡排序后最小数a[1]的原角标
        if(sort(N,A)==A[k])//应该是这里错了吧
            cout<<k<<endl;
    return  0;
}
2014-08-22 21:09
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
正值实践小学期,天天都是题啊!!!就算被你们骂,我也要问!!
这道题是这样的,输入行数,然后每行输入一个数据,比较数据大小,打印最小数据的行号
比如我输入行数5,每一行分别是10,9,8,7,6,经冒泡排序后,可知最小数据时6,则打印6的行号5,可是我的程序运行完后打印的是1
应该是if语句错了

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-22 21:16
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:3 
别担心,我不是骂你,是指出你存在的问题。

1、根据你问题的描述,想通过排序来解决是可以的,但要带着行号一起排才能达到目的,你的排序算法里根本没有行号的影子。

2、从你main函数中的第二个循环可以看出你的思维很混乱,排序就是为了找出最小值,进行一次就行了何以进行N次?还==A[k]?你的sort函数只返回a[1],那结果自然只输出1了。

3、C语言的数组下标是从0开始的,为什么排序后返回的是a[1]?乱了吧?

4、且不说你没带着行号(其实我更愿意叫下标或索引)排序,单讲你对这个数组的冒泡排序也是错的。内循环的条件应该是i < n - j - 1,你的条件会造成数组访问越界。

最后,“实践小学期”是什么意思?

重剑无锋,大巧不工
2014-08-22 23:47
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1506
专家分:9241
注 册:2010-3-16
收藏
得分:2 
A经过排序后,顺序已经变了,所以没法从A中在找的以前的顺序。需要复制一份数组到B,用A排序,用B查找顺序。

这个只需要找到数组中的最小值,并输出他的序号,不需要排序的。
2014-08-22 23:53
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:3 
再补充一下,关于你的问题用排序来解决其实并不适合。况且冒泡排序又是众多排序算法种效率最差的。你的问题只需要一遍扫描就可以了。

这里给一个理论解释。

1、当数组A中只有1个数时,其中的最小值就是这个唯一的值;

2、当数组A中有N个数时,已知其中最小的是A(i),其下标为i;这时再添加一个A(N),其下标为N;如果A(N) >= A(i),则这N+1个数中最小的数还是原来的A(i),否则是A(N)。(注,这里也是基于从0开始的下标分析的)

修改两处笔误并增加“注”部分,之前将N写成了i+1。

[ 本帖最后由 beyondyf 于 2014-8-23 00:01 编辑 ]

重剑无锋,大巧不工
2014-08-22 23:56
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1506
专家分:9241
注 册:2010-3-16
收藏
得分:2 
楼上说得对,其实在输入的时候就可以判断是否是最小值,并记录它的序号。输入结束后直接输出。
2014-08-23 00:02
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
程序代码:
#include <iostream>
using namespace std;
int main()
{
    int n,j;
    int min;
    cin>>n;
    int *a=new int[n];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    min=a[0];
    j=0;
    for(i=1;i<n;i++)
    {
        if(a[i]<min)
        {
            min=a[i];
            j=i;
        }
    }
    cout<<j+1<<endl;
return 1;
}
//重新写得,测试都通过了,大家看看还有什么不足没有,谢谢大家


走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-23 14:17
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1506
专家分:9241
注 册:2010-3-16
收藏
得分:0 
这代码只有在VC6通过了,第二个for里的i没有定义。
new 的变量最好delete一下。

程序代码:
#include <iostream>
using namespace std;
int main()
{
    int n,j=0;
    int min;

    cin >> n;
    int *a=new int[n];

    cin >> a[0];
    min=a[0];

    for(int i=1;i<n;i++)
    {
        cin>>a[i];
        if(min > a[i]) 
        {
            min = a[i];
            j=i;
        }
    }
    cout<<j+1<<endl;

    delete [] a;
    return 1;
}
2014-08-24 00:48
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
回复 8 楼 apull
谢谢

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-24 11:31
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:0 
回复 3 楼 beyondyf
大哥,能给些ACM的经验分享吗?谢谢

Maybe
2014-08-24 20:29
快速回复:我又来啦啦啦!!基础没扎牢!写啥错啥!!!再次请各位赐教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017010 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved