第十四、十五周作业

7-10 简化的插入排序

1.实验代码

#include <stdio.h>
int main ()
{
  const int N=10;
  int n,i,j,m,a[N];
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%d",&a[i]);
  }
  scanf("%d",&m);
  if(n==0)
  {
      printf("%d ",m);
   }else if(n==1)
   {
       if(m>a[0])
       printf("%d %d ",a[0],m);
       else
       printf("%d %d ",m,a[0]);
   }else
    {
        if(a[n-1]<m)
        {
            for(i=0;i<n;i++)
            {
                printf("%d ",a[i]);
            }
            printf("%d ",m);
        }
  for(i=0;i<n;i++)
  {
  if((a[i]<m)&&(m<a[i+1]))
  {
  j=i;
   for(i=0;i<=j;i++)
  {
   printf("%d ",a[i]);
  }
  printf("%d ",m);
 for(i=j+1;i<n;i++)
 {
  printf("%d ",a[i]);
 }
}
}
 if(a[0]>m)
 {
 printf("%d ",m);
  for(i=0;i<n;i++)
  {
      printf("%d ",a[i]);
  }
}
}
}

2 设计思路
(1)主要描述题目算法

a.先定义N=10,再定义数组a[N],输入一个整数n,i,i=0,在循环结构中对a[i]进行赋值,输入要插进去的数m。

b.根据输入n的值情况的不同进行讨论;及当m插入开头,中间,结尾进行分类。

c.最后输出排列过顺序的值。

(2)流程图

 

  3.本题调试过程碰到问题及解决办法

 

遇到的问题是情况考虑的不全面,关于n=0时的情况;关于n=1时的情况;关于插入的值m在最前面及最后面的情况,这些一开始自己都没有写在程序中,后针对对测试点,完善代码。

7-1 求整数序列中出现次数最多的数

 1.实验代码

#include <stdio.h>
int main ()
{
const int N=1000;
int number[N],i,n,j,count[N],max,m;
max=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&number[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(number[i]==number[j])
count[i]=count[i]+1;
}
}
for(i=0;i<n;i++)
{
if(count[i]>max)
{
max=count[i];
m=i;
}
}
printf("%d %d",number[m],max);
return 0;
}

2 设计思路
(1)主要描述题目算法

a.对 number[N],i,n,j,count[N],max,m进行整型定义,N=1000,输入n,在循环结构中输入number[i]。

b.将number[i]数组中相同的数出现的次数与count[i]对应起来。

c.比较count[i]的最大值,并输出对应的number[m]。

 (2)流程图

 3.本题调试过程碰到问题及解决办法

 

 

一直错误在max在统计中多次更新,错误在for关于if(number[i]==number[j])双重循环中,一开始自己写的循环为for(i=0;i<n;i++);for(j=i;j<n-i;j++)这样的话,会使得之后的number[i]值不能和之前的number[j]值进行比较,会导致最后max的错误,甚至是结果的错误。

 7-4 数组元素循环右移问题

 1.实验代码

#include <stdio.h>
int main ()
{
  const int N=100;
  int number[N],m,n,i,tmp;
  scanf("%d %d",&n,&m);
  for(i=0;i<n;i++)
  {
    scanf("%d",&number[i]);
  }
  if(n>=m)
  {
      m=m;
  }else
  {
      m=m%n;
  }
  for(i=n-m;i<n;i++)
  {
    printf("%d ",number[i]);
  }
  for(i=0;i<n-m;i++)
  {
    printf("%d",number[i]);
    if(i<n-m-1)
    {
      printf(" ");
    }
  }    
}

2 设计思路
(1)主要描述题目算法

a.对number[N],m,n,i,tmp进行整型定义,输入n,m,在for循环语句中输入number[i]。

b.判断第二行输入的n个整数与m的关系,根据不同的关系,将原本的数组顺序相应的向右移动m位。

c.最后输出移动过后的数组number[n]。

(2)流程图

3.本题调试过程碰到问题及解决办法

 

遇到的问题为没有考虑到当输入向右移的m位值大于输入的n个数,及当m为n的倍数时的情况,后来经过一步步的调试及对过程的了解后将情况补全。

7-3 选择法排序

 1.实验代码

#include <stdio.h>
int main ()
{
  int a,i,j,min,tmp,number[10];
  scanf("%d",&a);
  for(i=0;i<a;i++)
  {
    scanf("%d",&number[i]);
  }
  for(i=0;i<a-1;i++) 
  {
    for(j=0;j<a-i-1;j++)
    {
      if(number[j]<number[j+1])
      {
      tmp=number[j+1];
      number[j+1]=number[j];
      number[j]=tmp;
     }
    }
  }for(j=0;j<a;j++)
  {
  if(j+1==a)
  printf("%d",number[j]);
  else
  printf("%d ",number[j]);
}
}

2 设计思路
(1)主要描述题目算法

a.对a,i,j,min,tmp,number[10]进行整型定义,输入a,在for的循环语句中输入number[i]的值。

b.在for的双重循环中对number[j]和number[j+1]进行比较,如果number[j]<number[j+1],则将number[j]与number[j+1]进行交换。

c.在for循环语句中输出排好顺序后的数组number[j]。

(2)流程图

 

3.本题调试过程碰到问题及解决办法

 

遇到的问题在于没有弄懂它的比较交换的思路,一直将for双重循环的内循环条件弄错,应为j<a-i-1,而自己一直写成j<a-i,在上完课并重新理解过流程后,最终改正。

我的git地址:https://git.coding.net/exo07/disizhouzuoye.git

冯子璇:http://www.cnblogs.com/fengzx/p/7955263.html

 

王姝雯:http://www.cnblogs.com/phsudie/p/7967173.html

李锐:http://www.cnblogs.com/572453251asd/p/7966992.html

 

个人总结

在本周我学习关于一维数组,二维数组,还看了一些关于函数的书籍,学到了很多,特别是关于冒泡排序法,选择排序法,虽然对我来说难度不小,但自己已经大致了解了思路;不足的为考虑关于这方面问题时,自己会考虑的不全面,比如在按照顺序插入一个数时,自己只考虑到插到中间的情况。

 

 

 

 

posted @ 2017-12-03 20:56  董雅洁  阅读(340)  评论(7编辑  收藏  举报