回 帖 发 新 帖 刷新版面

主题:那个好心的高手帮忙做一下这几条简单的程序设计题?

[em2][em3] 给些相关资料的网站连接给小女子都可以~感激不尽
死人变态老师竟然要我们做这样的题目~就要开学了~我还没做完555555[em10]


1、 运动会分数统计
任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20)
功能要求:1).可以输入各个项目的前三名或前五名的成绩;
2).能统计各学校总分,
3).可以按学校编号、学校总分、男女团体总分排序输出;
4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)
输出形式:有中文提示,各学校分数为整形
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;
测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;


2、 一元多项式计算
任务:能够按照指数降序排列建立并输出多项式;
能够完成两个多项式的相加、相减,并将结果输入;
在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图) 、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;


3、 猴子选大王
任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:
输入数据:输入m,n m,n 为整数,n<m
输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能


4、最小生成树问题**
问题描述:若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。
如何以最低的经济建设这个通信网,是一个网的最小生成树
基本要求:
(1)利用克鲁斯卡尔算法求网的最小生成树。
(2)以文本形式输出生成树中各条边以及他们的权值


5、图的建立及输出
任务:建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。

6、拓扑排序
任务:编写函数实现图的拓扑排序。



请尽量写出每一步的算法说明~~~  

回复列表 (共25个回复)

21 楼

你参考一下
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 10
#define ERROR 0
typedef char VertexType;
typedef int VPType;
typedef int Graphkind;
typedef int status;
typedef enum {FALSE, TRUE} boolean;
boolean visit[MAX_VERTEX_NUM];
typedef struct Arcell
{
 VPType adj;
}Arcell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct 
{
 VertexType vex[MAX_VERTEX_NUM];//顶点标志 或者叫代号
 int vexnum, arcnum;//点的个数和边的条数
 AdjMatrix arcs;
 Graphkind kind;//图的类型
}MGraph;

status  CreatGraph(MGraph *G)       //建立图
{
 int i, j, select;

 printf("1:建立有向图!\n");
 printf("2:建立无向图!\n");
 printf("3:请选者种类!\n");
 scanf("%d",&select);
    if (select == 1)
 { 
  G->kind = 0;
 }
 else if (select == 2)
 {
  G->kind = 1;
 }
 else
 {
  return ERROR;
 }
    
 printf("\n请输入顶点的个数:");
 scanf("%d",&G->vexnum);
    getchar();// 吃掉内存中的残留数据
 printf("\n 请输入顶点的信息(代号)");
 for ( i = 0; i < G->vexnum; i++)
 {
  scanf("%c",&G->vex[i]);//注意一下

 }
    
 getchar();
 printf("\n 请输入2个顶点之间的相互关系(0表示相邻 1表示不相邻):\n");
 for ( i = 0 ; i < G->vexnum; i++)
  for ( j = 0; j < G->vexnum; j++)
  {
   scanf("%d",&G->arcs[i][j].adj);
  }

   printf("建立成功\n");
   return 0;
}

22 楼

status qiudu(const MGraph *G)//求度操作
{
 int sum1 , sum2 = 0;
    int i, j; 
 

 if (G->kind == 1)
 {
  for ( i = 0; i < G->vexnum; i++)
  {
   sum1=0;
   for ( j = 0; j < G->vexnum; j++)
   {
    if ( G->arcs[i][j].adj == 1)
    { 
     sum1++;
    }
   }
   printf("编号为%c的第%d的点的度为%d\n",G->vex[i], i+1, sum1);
  }
 }
 else
 {
  for ( i = 0 ; i < G->vexnum; i++)
  {   
    sum1=0, sum2=0;
   for ( j = 0 ; j < G->vexnum; j++)
   {
    if ( G->arcs[i][j].adj == 1)
    {
     sum1++;
                }
    if ( G->arcs[j][i].adj == 1)
    {
     sum2++;
    }
   }
   printf("编号为%d的第%d的点的出度为%d入度为%d\n",G->vex[i], i+1, sum1,sum2);

  }
 }

 return 0;
}


void DFS(MGraph G) //深搜索   这里出现问题 
{
 int i, j;
    void DFS1( MGraph G, int i);//函数声明

 for (i = 0 ; i < G.vexnum; i++)
 {
  visit[i] = FALSE;
 }
 for (j = 0; j <G.vexnum; j++)
 {
  if (!visit[j])
   DFS1(G,j);//不要用&G 因为G已经是地址了
 }
    
// return 0; 
}

void DFS1(MGraph G, int i)
{
 int j;

 visit[i]=TRUE;
 printf("%c",G.vex[i]);
 
 for (j = 0; j < G.vexnum; j++)
 {
  if ((i != j) && (G.arcs[i][j].adj == 1) && !visit[j])
  {
   DFS1(G,j);
  }
 }
    
 // return 0;
}

status BFS( const MGraph *G,int k)//广度搜索
{
   int s = 0, g = 0;
   int i, j;
   char a[MAX_VERTEX_NUM];

   for (i = 0; i < G->vexnum; i++)
   {
    visit[i] = FALSE;
   }

   printf("%c ",G->vex[k]);
   visit[k]=TRUE;
   
   for ( j = 0; j < G->vexnum; j++)
   {
    a[j] = -1;
   } 
   a[s] = k;

   while(a[s]!=-1)
   {   
    int j;

    i = a[g];
    g++;
       for ( j = 0; j < G->vexnum; j++)
    {
     if (G->arcs[i][j].adj == 1 && !visit[j])
     {
      printf("%c ",G->vex[j]);
      visit[j] = TRUE;
      s++;
      a[s] = j;
     }
    
    }
   if ( s == G->vexnum-1)
   { 
   break;
   }
   }
   return 0;
}

int main(void)
{
    MGraph G;
    int flag, select;
 int flag1 = 0;
 int k;
 while(1)
 {
  do
  {
   printf("1:构建图\n");
   printf("2:求度\n");
   printf("3:深度搜索\n");
   printf("4:广度搜索\n");
   printf("5:退出\n");
   printf("6:请选择\n");
   scanf("%d",&select);
   if (select == 5)
   { 
    flag = 0;
   }
         else
   {
    flag = 1;  //这里出错
   }
  }while(select < 1 || select > 6);
 
        if (flag == 0)
  {
   break;
  }
  switch(select)
  {
   case 1:
               flag1 = 1;
               CreatGraph(&G);
      break;
        case 2:
               if(flag1 == 1)
      {
                  qiudu(&G);
      }
      else
      {
      printf(" 请先建立图\n");
      }
      break;
        case 3:
      if(flag1 == 1)
      {
                   printf("进行深度搜索:\n");
       DFS(G);
          printf("进行深度搜索:\n");
       printf("\n");
      }
      else
      {
                    printf(" 请先建立图\n");
      }
      break;

        case 4:
      if(flag1 == 1)
      {   
       printf("请哪个点开始搜索");
          scanf("%d",&k);
       getchar();
       printf("进行广度搜索\n");
       BFS(&G,k);
       printf("\n");
      }
               else
      {
                    printf(" 请先建立图\n");
      }
      break;
          
  default: continue;
  }
 }
      
}

23 楼

谢谢"中国台湾",不过没法输出图的邻接矩阵,还有吗?
谢谢!

24 楼

我家里的电脑上有的,你再找我吧,到时我给你,我的QQ是82585638

25 楼

你让别人为你做作业,你已经放弃学习电脑语言了!

为了中国软件工业的未来,有爱心的朋友请不要帮忙代做作业,或者至少是收费服务!谢谢大家!!!

1) 努力,自己做。
2) 放弃, 改行, 学别的。
3) 挂科,重修,不放弃,下学期努力。
4) 花大钱,雇别人做,欺骗老师,不过下学期你大概要努力一点了。
5) 不努力,不花钱,欺骗老师,下学期故技重演。

你选择!!!
But, the last two need help of other victims or volunteers. 

Good Luck!

我来回复

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