| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1520 人关注过本帖
标题:其实是这个代码有问题,但我看不出,求解答
只看楼主 加入收藏
小白来学技术
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2016-9-22
结帖率:100%
收藏
已结贴  问题点数:2 回复次数:2 
其实是这个代码有问题,但我看不出,求解答
源代码如下:
#include <iostream>
#include <stdio.h>
#include<malloc.h>
#define N 9
using namespace std;
typedef struct node{
int num;
char name[20];
int sum;
}vote[N+1];
vote *p;
int number;
void xs(){
int i=1;
int n;
p=(vote*)malloc(sizeof(vote));
cout<<"请输入选手的数量:";
cin>>n;
number=n;
cout<<"请输入"<<n<<"名选手的编号和姓名:"<<endl;
while (n--)
{
cin>>p[i]->num>>p[i]->name;
i++;
}
cout<<"选手信息如下:"<<endl;
cout<<" 编号 姓名"<<endl;
for(i=1;i<=number;i++)
{
cout<<p[i]->num<<" "<<p[i]->name<<endl;
}


}


void toupiao()
{
int i,n;
for( i=1;i<=number;i++){
p[i]->sum=0;}
cout<<"请观众通过按键进行投票,按'1'对1号选手投票,按'2'对2号选手投票,以此类推,以按'0'作为投票结束标志"<<endl;
while (1)
{
cin>>n;
if (n==0) break;
while(n<1||n>number)
{cout<<"不存在此选手,请重新输入:";
cin>>n;}
p[n]->sum ++;
}

cout<<"投票完成!"<<endl;


}


void shellsort(vote *R,int n ){
int i,j,d;
for (d=n/2;d>=1;d=d/2){
for (i=d+1;i<=n;i++)
{
*R[0]=*R[i];
for(j=i-d;j>0&&R[j]->sum>R[0]->sum;j=j-d)
*R[j+d]=*R[j];
*R[j+d]=*R[0];
}
}
}


void main(){
int n,i;
while(1){
cout<<"1.输入选手信息"<<endl;
cout<<"2.观众投票"<<endl;
cout<<"3.比赛结果"<<endl;
cout<<"0.退出"<<endl;
cout<<"请输入你要选择的操作序号,按回车键确认:"<<endl;
cin>>n;
switch (n){
case 1:
xs();
break;
case 2:
toupiao();
cout<<"编号 姓名 票数 "<<endl;
for( i=1;i<=number;i++){
cout<<p[i]->num<<" "<<p[i]->name<<" "<<p[i]->sum<<endl;}
break;
case 3:
shellsort(p,number);
int t=1;
cout<<"名次 姓名 票数 "<<endl;
for( i=number;i>=1;){
for(int e=i;p[e]->sum==p[e-1]->sum;e--){
cout<<t<<" "<<p[e]->name<<" "<<p[e]->sum<<endl;}
cout<<t<<" "<<p[e]->name<<" "<<p[e]->sum<<endl;
t++;i=e-1;}
}
}
}
如果结构体中N+1改为N,那就出现下面这张情况,为什么

图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: include 源代码 number 信息 姓名 
2016-09-22 22:09
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:2 

typedef struct node{
int num;
char name[20];
int sum;
}vote[N+1];
这是个蛮奇葩的用法。
这里声明了一种数据类型vote ,是机构体数组 struct node[N+1];//N还是N+1,其实待会都是错的
程序代码:
p=(vote*)malloc(sizeof(vote));//指针p指向了一个数组,数组大小神马的你先别在意
cout<<"请输入选手的数量:";
cin>>n;
number=n;
cout<<"请输入"<<n<<"名选手的编号和姓名:"<<endl;
while (n--)
{
cin>>p[i]->num>>p[i]->name;//p[i]是神马?p[i]能等于struct node[i]吗?很显然,不能!p[i]也就是p[1]此刻的地址等于p+sizeof(vote);
i++;
}
上个测试代码,输出这些变量的地址给你看,希望你能醒悟,这种稀奇古怪的typedef,以后还是少用为好。
程序代码:
#include <iostream>
#include <stdio.h>
#include<malloc.h>
#define N 9
using namespace std;
typedef struct node {
    int num;
    char name[20];
    int sum;
} vote[N+1];
vote *p;
int number;
void xs() {
    int i=1;
    int n;
    p=(vote*)malloc(sizeof(vote));
    printf("p=%d\n",p);
    printf(",sizeof()=%d\n",sizeof(vote));
    n=1;
//    cout<<"请输入选手的数量:";
//    cin>>n;
//    number=n;
//    cout<<"请输入"<<n<<"名选手的编号和姓名:"<<endl;
    while (n--) {
        printf("p[i]=%d\n",&p[i]);
//        cin>>p[i]->num>>p[i]->name;
        i++;
    }
    cout<<"选手信息如下:"<<endl;
    cout<<" 编号 姓名"<<endl;
    for(i=1; i<=number; i++) {
        cout<<p[i]->num<<" "<<p[i]->name<<endl;
    }


}


void toupiao() {
    int i,n;
    for( i=1; i<=number; i++) {
        p[i]->sum=0;
    }
    cout<<"请观众通过按键进行投票,按'1'对1号选手投票,按'2'对2号选手投票,以此类推,以按'0'作为投票结束标志"<<endl;
    while (1) {
        cin>>n;
        if (n==0) break;
        while(n<1||n>number) {
            cout<<"不存在此选手,请重新输入:";
            cin>>n;
        }
        p[n]->sum ++;
    }

    cout<<"投票完成!"<<endl;


}


void shellsort(vote *R,int n ) {
    int i,j,d;
    for (d=n/2; d>=1; d=d/2) {
        for (i=d+1; i<=n; i++) {
            *R[0]=*R[i];
            for(j=i-d; j>0&&R[j]->sum>R[0]->sum; j=j-d)
                *R[j+d]=*R[j];
            *R[j+d]=*R[0];
        }
    }
}


int main() {
    int n,i;
    while(1) {
        cout<<"1.输入选手信息"<<endl;
        cout<<"2.观众投票"<<endl;
        cout<<"3.比赛结果"<<endl;
        cout<<"0.退出"<<endl;
        cout<<"请输入你要选择的操作序号,按回车键确认:"<<endl;
        cin>>n;
        switch (n) {
            case 1:
                xs();
                break;
            case 2:
                toupiao();
                cout<<"编号 姓名 票数 "<<endl;
                for( i=1; i<=number; i++) {
                    cout<<p[i]->num<<" "<<p[i]->name<<" "<<p[i]->sum<<endl;
                }
                break;
            case 3:
                shellsort(p,number);
                int t=1;
                cout<<"名次 姓名 票数 "<<endl;
                for( i=number; i>=1;) {
                    for(int e=i; p[e]->sum==p[e-1]->sum; e--) {
                        cout<<t<<" "<<p[e]->name<<" "<<p[e]->sum<<endl;
                    }
//                    cout<<t<<" "<<p[e]->name<<" "<<p[e]->sum<<endl;
//                    t++;
//                    i=e-1;
                }
        }
    }
    return 0;
}

图片附件: 游客没有浏览图片的权限,请 登录注册

如果你有兴趣的话,可以修改一下n的值,多输出几个p[i]地址。

#define N 9,这件事情在编译的时候就替换掉了,在程序生成以前那个地方就变成了node[9+1]也就是node[10]了,是常数,不是导致这个程序有问题的根源。
typedef <类型名> 某种数据结构数组  这个用法通常是在嵌套for(auto k:a){for(auto u:k){...}}里面的第一个auto就应该是结构体数组类型,而第二个auto是是结构体类型。
你的程序要改的话,就得把p的类型改成struct node*
到我本人并不推荐这样的用法。因为sizeof(vote)本身其实就是等于sizeof(struct node)*(N+1)//或者N吧,反正不重要。
当用户输入的n大于等于你所define的N的时候,你的程序还是会出现指针越界的问题还是个废物。。。
malloc是个动态申请函数,既然如此何不直接malloc(sizeof(struct node)*n);//n来自用户输入的选手数量。




φ(゜▽゜*)♪
2016-09-23 19:01
小白来学技术
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 2楼 书生牛犊
明白了,其实只要定义int i=1;就不会出现这些问题了,不过还是谢谢大神,学到东西了。
2016-09-26 20:17
快速回复:其实是这个代码有问题,但我看不出,求解答
数据加载中...
 
   



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

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