第14、15周作业

要求二:
一、第十四、十五周pta附加题
7-1,输出数组元素
1,实验代码

#include<stdio.h>
int main()
{
  int a,i;
  scanf("%d",&a);
  int b[a],c[a];
  for(i=0;i<a;i++)
  {
    scanf("%d",&b[i]);
  }
  for(i=a-1;i>0;i--)
  {
    c[i]=b[i]-b[i-1];}
  
  printf("%d",c[1]);
  for(i=2;i<a;i++)
  {
    if((i-1)%3==0)
	printf("%d",c[i]);
    else
	printf(" %d",c[i]);
    if(i%3==0)
	printf("%c",'
'); 
}
  return 0;
}

2,设计思路
<1>第一步:定义两个数组,一个是输入的数组吧b[a],一个是后项减前项之差的数组c[a]。
第二步:是后项减前项,则i-1最小值为0,故i>0为循环结束条件。
第三步:因为每行的第一个数前没有空格,所以再第四,七,十等数需要标记,采用i-1的方式来形成标记,其他的前有空格,是三的倍数就换行。
<2>流程图:

3,本题调试过程中遇到的问题和解决方法
错误截图:
第一个数的输出有问题,是在第二个for语句时i大于零的条件加了一个等于号,导致c[i-1]为c[-1],才出现了这种情况,把‘=’号去掉就可以了。

二、第十四、十五周pta附加题
7-2查找整数
1,实验代码

#include <stdio.h>
int main(){
	int n,x,i;
	int a[20];
	scanf("%d %d",&n,&x);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<n;i++)
	{
	if(x==a[i])
	{
	
	printf("%d",i);
	break;
}
}
	if(a[i]!=x){
		printf("Not Found");}
return 0;
} 

2,设计思路
<1>第一步:要求正整数小于20,即可以定义的数组可以为a[20],用for中i<n的限制条件限制循环次数。
第二步:将数组中输入的值不断与一开始需要查找的数相比较,如果相等,即跳出程序,输出,如果不等,则输出题目需要的输出。
<2>流程图:

3:遇到的问题和解决办法
错误截图:


数组中有相应的数值却显示没有找到,这个错误程序并没有多次查找需要的数,需要加入一个for循环的语句,依次查找,找到后跳出该循环,没有找到则往下继续执行,输出Not Found。

三、第十四周题目二次第三题
7-4,交换最大值和最小值
1,实验代码

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

2,设计思路
<1>第一步:定义一个数组,先找出最小值,令数组的第一个数为最小值,然后加入循环中,若比第二个数大,则继续比较。如果第一个数不是最小值,则与找出的最小值交换位置。
第二步:令数组的第一个数为最大值,若比第二个数小,则继续循环。如果循环结束,最后一个数不是最大值,与找到的最大值交换位置。
第三步:然后再循环中输出数字。
<2>流程图:

3,遇到的问题和解决方法
错误截图:
一个代码写出来后发现多了我之前输入中没有的数,这就值得推敲了。这题自己没有想到解决的办法,请教了同学,发现是不能同时赋值最大最小值后在交换,这就有可能会出现我找到的最大值交换位置时,移动了最小值的位置。是需要我在找到最小值后就应该立即交换的。

四、第十五周题目一
7-1,求矩阵各元素之和
1,实验代码

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

2,设计思路
<1>第一步:定义一个数组的行列,然后再循环里相加。
第二步:注意sum需要在每列相加的时候清零,不然会出现累加的情况。
<2>流程图:

3,遇到的问题和解决办法
错误截图:
这个错误就很不应该了,没有清零的情况,居然还花费的大量的时间去找错误,写这道题是为了汲取这题的教训,不要再一些的简单的问题上犯错误。

五、第十五周第四题
7-4,数组元素循环右移的问题
1,实验代码

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

2,设计思路
<1>第一步:定义数组个数和移动的位数,当移动的位数大于数组的长度时,需要用j%m取余,得到移动次数最少的值。
第二步:数值长度为m,第i个数实际和m+i个数是等价的,当需要移动位置时,往右打印的一个位置。
第三步:移动2个位置,拿最后一个数举例,就是把a[5]的值赋值给a[1],即a[i]=a[i+m-j],a[1]=a[1+6-2]。
<2>流程图:

3,遇到的问题和解决办法
错误截图:

我原本想的是移动几个数,就是把a[i+j]的值赋给a[i];然而却出现了上图的错误,仔细检查过后,是我的思路出了问题,这题是把前面的值移到后面,把后面的值转移的到前面。不是把后面的值赋值给减去j后的前面的值。正确的办法是把数字往后面移,而我则是把数字往前面移,这次错误的思路。

要求三:
git地址:https://git.coding.net/WP2017024114/test.git
作业截图:

要求四:
个人总结:
学习到的:学习的数组,知道了简单一维,二维数值是怎么定义和输入的。在解决问题上,学会了数值的排列顺序,大小顺序的转换位置。还有使用选择排序法和冒泡排序法找出最大值或者最小值的值及其下标。
难点:用二维数值解决问题感觉比较难,在方形数值上的三角问题是很容易出问题的,我对这一方面还不是很熟悉。对方形数组的交换行列不理解,但我会在课下去认真熟悉。

要求五:
点评的作业:
孙娜:http://www.cnblogs.com/sun-na-/p/7875394.html

曹琪:http://www.cnblogs.com/blueblog6/

透光玻璃:http://www.cnblogs.com/boke2017boke/p/7965813.html

表格和折线图:

原文地址:https://www.cnblogs.com/WeiPeng-wuban/p/7919794.html