2 qq 28901839 qq_28901839 于 2015.06.10 18:40 提问

C语言 访问位置冲突 冒泡排序

程序运行到冒泡排序法的地方总是会出现访问冲突
#include
#include
#include
#include
#include
#define n 2//学校数目
#define m 2//男子项目数目
#define w 2//女子项目数目
#define null 0

typedef struct
{
int itemnum; //项目编号
int num; //取名次的数目
int range[5]; //名次
int mark[5]; //分数
}item; //定义项目结点的类型

typedef struct
{
int schoolnum; //学校编号
int score; //学校总分
int mscore; //男团体总分
int wscore; //女团体总分
item c[m+w]; //项目数组
}school;

school h[n];

void inputinformation() //输入信息,建立系统
{
int i,j,k,s;
for(i=0;i<n;i++)
{
h[i].score=0;
h[i].mscore=0;
h[i].wscore=0;
} //初始化头结点
for(i=0;i<n;i++)
{
printf("*****学校编号:");
scanf_s("%d",&h[i].schoolnum); //输入头结点信息
for(j=0;j<m+w;j++)
{

printf("*****项目编号:");
scanf_s("%d",&h[i].c[j].itemnum);
printf("*****取前名or前名:");
scanf_s("%d",&h[i].c[j].num);
printf("*****获得几个名次:");
scanf_s("%d",&k); //输入项目信息
for(s=0;s<5;s++)
h[i].c[j].range[s]=0, h[i].c[j].mark[s]=0; //初始化排名和分数
for(s=0;s<k;s++)
{

printf("*****名次:");
scanf_s("%d",&h[i].c[j].range[s]); //输入所获名次信息
if(h[i].c[j].num==3)
switch(h[i].c[j].range[s])
{
case 0: h[i].c[j].mark[s]=0; break;
case 1: h[i].c[j].mark[s]=5; break;
case 2: h[i].c[j].mark[s]=3; break;
case 3: h[i].c[j].mark[s]=2; break;
}
else
switch(h[i].c[j].range[s])
{
case 0: h[i].c[j].mark[s]=0; break;
case 1: h[i].c[j].mark[s]=7; break;
case 2: h[i].c[j].mark[s]=5; break;
case 3: h[i].c[j].mark[s]=3; break;
case 4: h[i].c[j].mark[s]=2; break;
case 5: h[i].c[j].mark[s]=1; break;
}

            h[i].score=h[i].score+h[i].c[j].mark[s];

//按取前三名还是取前五名分别记分
if(j<=m-1)
h[i].mscore=h[i].mscore+h[i].c[j].mark[s];
//是男子项目则记到男子分数里面去
else
h[i].wscore=h[i].wscore+h[i].c[j].mark[s];
//是女子项目则记到女子项目里面去
}
printf("\n");
}
}
}

void output() //输出函数
{
int b;
int remember[5];
int i,j,k;
int a;
do
{
printf("*******************1.按学校编号输出.*******************\n");
printf("*******************2.按学校总分输出.*******************\n");
printf("*******************3.按男团总分输出.*******************\n");
printf("*******************4.按女团总分输出.*******************\n");
printf("\n\n******************* 请选择编号*************************\n\n:");
scanf_s("%d",&b);
switch(b)
{
case 1:
for(i=0;i<n;i++)
{
printf("\n\n*****学校编号:%d\n",h[i].schoolnum);
printf("*****学校总分:%d\n" ,h[i].score);
printf("*****男团总分:%d\n",h[i].mscore);
printf("*****女团总分: %d\n\n\n",h[i].wscore);
} //按编号顺序输出
break;

    case 2:    
        for(i=0;i<n;i++)
            remember[i]=i;

        for(i=0;i<n;i++)
        { 
            for(j=i+1;j<n;j++)
            if(h[remember[i]].score<h[j].score)
                    k=remember[i];

remember[i]=remember[j];
remember[j]=k;

        }              // 用冒泡排序方法,用辅助数组记住头结点下标
        for(i=0;i<n;i++)
        {
             printf("\n\n*****学校编号:%d\n",h[remember[i]].schoolnum);                                           
           printf("*****学校总分:%d\n" ,h[remember[i]].score);
             printf("*****男团总分:%d\n",h[remember[i]].mscore);
             printf("*****女团总分: %d\n\n\n",h[remember[i]].wscore);

//按所记下标顺序输出
} //按学校总分输出
break;

    case 3:      
        for(i=0;i<n;i++)
            remember[i]=i;
        for(i=0;i<n;i++)
        { 
            for(j=i+1;j<n;j++)
            if(h[remember[i]].score<h[j].score)
                    k=remember[i];
        remember[i]=remember[j];
        remember[j]=k;

        }         

        for(i=0;i<n;i++)
        {
              printf("\n\n*****学校编号:%d\n",h[remember[i]].schoolnum);                                           
           printf("*****学校总分:%d\n" ,h[remember[i]].score);
             printf("*****男团总分:%d\n",h[remember[i]].mscore);
             printf("*****女团总分: %d\n\n\n",h[remember[i]].wscore);

        }                                      //按男团总分输出
        break;

   case 4:       
          for(i=0;i<n;i++)
            remember[i]=i;
        for(i=0;i<n;i++)
        { 
            for(j=i+1;j<n;j++)
            if(h[remember[i]].score<h[j].score)
                    k=remember[i];
                   remember[i]=remember[j];
                   remember[j]=k;

        }

       for(i=0;i<n;i++)
       {
            printf("\n\n*****学校编号:%d\n",h[remember[i]].schoolnum);                                           
           printf("*****学校总分:%d\n" ,h[remember[i]].score);
             printf("*****男团总分:%d\n",h[remember[i]].mscore);
             printf("*****女团总分: %d\n\n\n",h[remember[i]].wscore);

       }
       break;                                  //按女团总分输出
    }
    printf("请选择2 继续,0 跳出\n");
    scanf_s("%d",&a);
}while(a==2);                              //循环执行输出语句

}

void refer() //查询函数
{

int a,i,j,k,s;
printf("\n*****1:按学校编号查询\n");
printf("\n*****2:按项目编号查询\n");
printf("\n\n*****请选择查询方式:");                //提供两种查询方式
scanf_s("%d",&a);
switch(a)
{  
 case 1:
    do
    { 
        printf("要查询的学校编号:");
        scanf_s("%d",&i);
        if(i>n)
            printf("错误:这个学校没有参加此次运动会!\n\n\n");
        else
        {
            printf("要查询的项目编号:");
            scanf_s("%d",&j);
            if(j>m+w||j==0)
                printf("此次运动会没有这个项目\n\n\n");

//学校编号超出范围,则输出警告
else
{

printf("这个项目取前%d名,该学校的成绩如下:\n", h[0].c[j-1].num);
for(k=0;k<5;k++)
if(h[i-1].c[j-1].range[k]!=0)
printf("名次:%d\n",h[i-1].c[j-1].range[k]);
//输出要查询学校项目的成绩
}
}
printf("请选择继续, 0 跳出\n");
scanf_s("%d",&s);
printf("\n\n\n");
}while(s==2); //循环执行输出语句
break;

case 2:
    do
    { 
        printf("要查询的项目编号:");
        scanf_s("%d",&s);
        if(s>m+w||s==0)
            printf("此次运动会不包括这个项目.\n\n\n");

//项目编号超出范围则输出警告
else
{
printf("该项目取前%d名,取得名次的学校\n",h[0].c[s-1].num);
for(i=0; i<n;i++)
for(j=0;j<5;j++)
if(h[i].c[s-1].range[j]!=0)
printf("学校编号:%d,名次:%d\n",h[i].schoolnum,
h[i].c[s-1].range[j]);
} //输出该项目取得名次学校的成绩
printf("\n\n\n继续,跳出\n");
scanf_s("%d",&i);
printf("\n\n\n");

    }while(i==2);
    break;

}
}

int main()
{
int i;
printf("======================欢迎使用======================\n");

printf("\n\n*****************运动会分数统计系统********************\n");
printf("\n\n********************1.输入信息*************************\n");
printf("********************2.输出信息*************************\n");
printf("********************3.查询信息*************************\n");
printf("********************4.退出系统*************************\n");
printf("================================================\n\n");
printf("********请选择要实现步骤的编号:\n\n");
scanf_s("%d",&i);
switch(i)
{
case 1:
inputinformation();main();
case 2:
output();main();
case 3:
refer();main();
case 4:
printf("谢谢使用\n");
}
return 0;
}

5个回答

Bruce_why
Bruce_why   2015.06.10 18:51

注意 没有大括号,在if语句的后边

91program
91program   Ds   Rxr 2015.06.10 18:52

建议你调试一下,找到是哪一行代码出的错
然后,再分析一下此行的代码是否存在数组操作越界,或者指针异常的问题。

91program
91program 回复qq_28901839: 数组的下标你应该 懂吧? i 和 remember[i]].schoolnum 都是下标。如果这个都不懂,建议你先去看看基础的语言知识,再来编程、与调试。
2 年多之前 回复
qq_28901839
qq_28901839 回复91program: 什么意思,初学,不太懂。。
2 年多之前 回复
91program
91program 回复qq_28901839: 分别将 i 和 remember[i]].schoolnum 的数值打印出来看看吧
2 年多之前 回复
qq_28901839
qq_28901839 printf("\n\n*****学校编号:%d\n",h[remember[i]].schoolnum); 调试后显示的是从这一句出了问题,可是并没看出有什么问题,求解
2 年多之前 回复
EnderSnow
EnderSnow   2015.06.13 07:44

用printf输出关键的值来调试看看

q3733353520
q3733353520   2015.06.15 15:11

而且你case完以后要用break来跳出switch

zhangweilst
zhangweilst   2015.06.19 12:19

出问题的提示写出来?是不是内存访问有问题?

Csdn user default icon
上传中...
上传图片
插入图片