代码改变世界

第14.15周教学作业

2017-12-03 21:16  史晨宇  阅读(203)  评论(0编辑  收藏  举报

要求二

7-2

1.实验代码

#include<stdio.h>

int main(){

int i,j,a[4][4],sum=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
scanf("%d",&a[i][j]);
if(j<=i){sum+=a[i][j];}

}
}
printf("%d",sum);
return 0;
}

2.思路

1.敲定整个二维数组
2.由于左下三角形有的特点它的列 j 是不大于它的行 i 可以使用if(j<=i)进行判断

3.流程图

7-3

1.实验代码

 #include<stdio.h>
int main()
{
  int i,j,flag=1,n,b[1000]={0},k=0;
  scanf("%d",&n);
  int a[n];
  for(i=0;i<n;i++)
  {
    scanf("%d",&a[i]);
  }
  for(i=0;i<n;i++)
  {
    for(j=0;j<i;j++)
    {
      if(a[i]==a[j]){b[j]++;break;}
    }
    if(flag==1){b[i]++;}
  }
  int max=b[0];
  for(i=1;i<n;i++)
  {
    if(b[i]>max){max=b[i];k=i;}
  }
    printf("%d %d",a[k],max);
  return 0;
}
2.设计思路

1.,创建一个数组b[1000]初始化为0 输入一个数在对应的b[j]上++ 就可以记录当前j数子出现的次数
2. 定义b[0]为max 找到 b[i]大于max的 就记录b[i]为max

3流程图

7-4

1.实验代码

#include<stdio.h>
int main(){
int a,c,d,k[10];
int max=-1,min =11;
int j,l;
int o,p,v;
scanf("%d",&a);
for(d=0;d<a;d++){
scanf("%d",&k[d]);//输入
}
for(c=0;c<a;c++)//最小值 {
if(k[c]<min)
min=k[c];
}
for(o=0;o<a;o++){
if(k[o]-min==0)
break;
}
j=k[o];//替换
k[o]=k[0];
k[0]=j;
for(c=0;c<a;c++)//同上替换最大值 {
if(k[c]>max)
max=k[c];
}
for(p=0;o<a;p++){
if(k[p]-max==0)
break;
}
l=k[p];
k[p]=k[a-1];
k[a-1]=l;
for(v=0;v<a;v++){
printf("%d ",k[v]);//输出
}
return 0;
}

2.设计思路

1.先考虑移动n步 如果只有3个数 移动4步 与移动一步一样 就可以 考虑 把移动n步都转换为移动除于总个数的余数个步数。

2.右以后发现后面的都到前面去 就可以考虑把该数组扩大2倍复制一个同样的数组跟在后面 a[i+m]=a[i] (m为总个数) 

3.向右移动就可以变成 a[i]=a[i+m-n];

3.流程图

7-3选择排序法

#include<stdio.h>

int main()
{
int i; //定义一个i并且赋初值为0,i作为数组的下标
int j; //定义j并且赋初值为0,j作为找到最大值时所对应的下标
int k,n; //定义一个k,用来保存此次循环中最大值的下标
int temp; //定义一个中间变量temp,供以后交换值的时候使用
int a[100]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}

for(i = 0;i<n;i++) //判断i是否小于len,执行下面的语句
{
k = i; //假设此次循环中的最大值就是当前的值
for(j = i+1;j<n;j++)
{
if(a[j]>a[k]) //将假设的当前最大值与后面的值比较
{
k = j; //若后面的值更大,则交换下标
}
}
if(k != i) //比较之后如果此次循环中最大值并非当前值
{
temp = a[i]; //将此次循环中的最大值与a[k]交换
a[i] = a[k];
a[k] = temp;
}
}
for(i=0;i<n;i++) //利用for循环将结果依次输出
{
printf("%d ",a[i]);
}
return 0;
}

2.设计思路

 1.每次选择一个相应的元素,然后将其放到指定的位置 
  2.每次比当前位到后面的所有
  例如 
       1.第一轮:0位开始,比后面全部值,1轮后:得到最小值在0位置
       2.第二轮:1位开始,比后面全部值,2轮后:得第2小在1位置
       3.第二轮:2位开始,比后面全部值,3轮后:得第3小在2位置
       4.第二轮:3位开始,比后面全部值,4轮后:得第4小在3位置
       ......
 3.最终得到从左到右到大的值
7-5
1.实验代码

#include<stdio.h>
int main(){
int n,i,j,t,k;
scanf("%d %d",&n,&k);
int a[n+1];
for(i=1;i<=n;i++){
scanf("%d ",&a[i]);
}
for(j=1;j<=k;j++){
for(i=1;i<=n-j;i++){
if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}
}
}
printf("%d",a[1]);
for(i=2;i<=n;i++){
printf(" %d",a[i]);
}
return 0;
}

2.设计思路

1.从序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。
2.核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾。

3.流程图

要求四

1.本周我们学习了数组的排序,找重复等运算方法以及矩形阵等运用。使我们充分了’解了计算机关于数字的编程

2本周的难点我认为是各种排序法,比较难以记住

要求五

1.http://www.cnblogs.com/sun-na-/p/7875394.html

.

2.http://www.cnblogs.com/woshisun/p/7918490.html

3.http://www.cnblogs.com/SR1011/p/7965948.html