阴茎表皮上长小肉疙瘩:数据结构题集(C语言版)算法设计题解析-第一章

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 06:58:44
以下算法均在VS2010上

    编译通过并运行

1.16 试写一算法,自大至小依次输出顺序读入的三个整数X,Y和Z的值。

#include
void sort(int *a,int n)
{
 int temp,i,j;
 for (i=0;i  for (j=0;j   //冒泡法使数组元素按自大至小排列
   if(a[j]   {
      temp=a[j];
      a[j]=a[j+1];
      a[j+1]=temp;
   }
}
main()
{
 int i, a[3];
 printf("请输入数组元素:");
 for(i=0;i<3;i++)
  scanf("%d",&a[i]);      //输入数组
 sort(a,3);
 for(i=0;i<3;i++)         //输出数组
  printf("自大至小数组元素%d ",a[i]);
}

 

1.17 已知k阶斐波那契数列的定义为

              f0=0,f1=0,...,fk-2=0, fk-1=1;

              fn=fn-1+fn-2+....+fn-k, n=k,k+1,...

         试编写求k阶斐波那契的第m项值的函数算法,k和m均以值调用的形式在函

      数参数表中出现。

解析:

    f(m)=f(m-1)+f(m-2)+f(m-3)+.......+f(m-k)

    f(m-1)=f(m-2)+f(m-3)+f(m-4)+.......f(m-k-1)

    f(m)=2*f(m-1)-f(m-k-1)     注:数组元素从0开始标号

#include
#define LENGTH 1000
int Fibonacci(int k, int m)

 int i,s,j,f,t[LENGTH];
    if(k<2||m<0)
  return 0;    
    if(m>=1&&m-1    f=0;        
    else
  if (m-1==k-1||m-1==k)
   f=1;
    else                       
    {
      for(i=0;i<=k-2;i++)
        t[i]=0; t[k-1]=1; t[k]=1;
      s=1; j=0;
      for(i=k+1;i<=m;i++,j++)
       {
          t[i]=2*s-t[j];
              s=t[i];
       }
              f=t[m-1];           
    }
   return f;
}
main()
 
 int k,m;
 printf("请输入斐波那契序列的阶数k:");
 scanf("%d",&k);
 printf("请输入序列元素的位置m:");
 scanf("%d",&m);
 printf("%d阶斐波那契序列的第%d项值为:%d",k,m,Fibonacci(k,m));
}

 

1.18 假设有A,B,C,D,E五个高等院校进行田径对抗赛,各院校的单项成绩均

已存入计算机,并构成一张表,表中每一行的形式为

     项目名称  性  别  校  名  成  绩  得 

编写算法,处理上述表格,以统计各院校的男、女总分和团体总分,并输出。

解析:

#include
 typedef enum {female,male} Sex;
 typedef struct  {
  char sport;              // 项目名称
  Sex gender;             // 性别(女:female;男:male)
  char schoolname;       // 校名为'A','B','C','D'或'E'
  char result[20];      // 成绩  最好定义为数组
  int score;           // 得分(7,5,4,3,2或1)
  }ResultType;

 typedef struct{
  char schoolname;      //学校名
  int malescore;    // 男子总分
  int femalescore; // 女子总分
  int totalscore; // 男女团体总分
} ScoreType;
void Scores(ResultType *result, ScoreType *score)
{
 int i=0;
  while(result[i].sport!=NULL)
  {
   switch(result[i].schoolname)
   {
   case'A':
    score[0].totalscore+=result[i].score;
    if(result[i].gender==male)
     score[0].malescore+=result[i].score;
    else
     score[0].femalescore+=result[i].score;
    break;
   case'B':
    score[1].totalscore+=result[i].score;
    if(result[i].gender==male)
     score[1].malescore+=result[i].score;
    else
     score[1].femalescore+=result[i].score;
    break;
   case'C':
    score[2].totalscore+=result[i].score;
    if(result[i].gender==male)
     score[2].malescore+=result[i].score;
    else
     score[2].femalescore+=result[i].score;
    break;
   case'D':
    score[3].totalscore+=result[i].score;
    if(result[i].gender==male)
     score[3].malescore+=result[i].score;
    else
     score[3].femalescore+=result[i].score;
    break;
   case'F':
    score[4].totalscore+=result[i].score;
    if(result[i].gender==male)
     score[4].malescore+=result[i].score;
    else
     score[4].femalescore+=result[i].score;
    break;
   }
   i++;
  }
  
     }
main()
{
 int i,n;
    ResultType result[100];
 ScoreType  score[100];
 for(i = 0; i < 100; i++)
 {
  result[i].sport = NULL;
  score[i].femalescore = score[i].malescore = score[i].totalscore = 0;
 }
 score[0].schoolname = 'A';
 for(i = 1; i < 5; i++)
  score[i].schoolname = score[0].schoolname + i;
 printf("请输入各院校参赛的总人数:");
 scanf("%d",&n);
 printf("请输入各院校运动员的项目名称、性别(female--0,male--1)、校名、成绩、得分:\n");
 for(i=0;i {
  printf("运动员%d:\n",i+1);
  fflush(stdin);
  printf("输入项目:\n");
     scanf("%c",&result[i].sport);
     fflush(stdin);
     printf("输入性别:\n");
     scanf("%d",&result[i].gender);
     fflush(stdin);
     printf("输入校名:\n");
     scanf("%c",&result[i].schoolname);
     fflush(stdin);
     printf("输入结果:\n");
     scanf("%s",result[i].result);
     fflush(stdin);
     printf("输入分数:\n ");
     scanf("%d",&result[i].score);
 }
 Scores(result,score);
 for(i=0;i<5;i++)
 {
       printf("the school %c:\n ", score[i].schoolname) ; 
       printf("Total score of male:%d\n",score[i].malescore);
       printf("Total score of female:%d\n",score[i].femalescore);
       printf("Total score of all:%d\n\n",score[i].totalscore);
    
}

 

1.19   试编写算法,计算i!*2*2*.....2(i个2相乘)(i=0,1,...,n-1)的值并分别存入数组a[arrsize]

       的各个分量中。假设计算机中允许的整数的最大值为MAXINT.则当n>arrsize或对某个k

       (0≤k≤n-1)使k!*2*2*2....*2(n个2相乘)>MAXINT时,应按出错处理。

       注意选择你认为较好的出错处理办法。

       #include
       #define arrsize 10
       #define MAXINT 65535
       main () {
       int i,j,k;
       int result;
       int temp;
       int a[arrsize];
       a[0]=1;
       printf("Enter the k:");
       scanf("%d",&k);
       temp = 1;
       if(k>arrsize)
       return 0;
       else
       for (i=1;i<=k;i++)
       {
        temp *= i;
        result = temp * 2 * i;
        if (result>= MAXINT) return 0;
        else
        a[i]=result;
        }
        j=0,a[0]=1;
       if((result< MAXINT)&&(k<=arrsize))
       printf("a[%d]=%d\n",j,a[0]);
       for(j=1;j       printf("a[%d]=%d\n",j,a[j]);
}

 

1.20 试编写算法求一元多项式Pn(x)=a0 + a1x + a2x^2 + ... + anx^n的值Pn(X0),并确定算法中每

一语句的执行次数和整个算法的时间复杂度。注意选择你认为较好的输入和输出方法。本题的输入为

ai(i=0,1,...n),x0和n,输出为Pn(x0)。

 

#include
#define LENGTH 1000
float Polynomial(int n, int a[], float x)
 
 int i;
    float b=1.0, P=a[0];
    if(n==0) P=a[0];
    else
 {
               for(i=1;i<=n;i++)
                 {
       b=b*x;
                   P=P+a[i]*b;
                 }
    
    return P;
}
main()
{
 int i,n,a[LENGTH];
 float x0;
 printf("请输入数组下标n:");
 scanf("%d",&n);
 printf("请输入数组元素:");
 for(i=0;i<=n;i++)
  scanf("%d",&a[i]);
 printf("请输入x0的值:");
 scanf("%f",&x0);
 printf("所求值Pn(x0)=%.2f\n", Polynomial(n,a,x0));
}