数组

一、PTA实验作业

题目1:7-3 出生年

1. 本题PTA提交列表(要提交列表,不是结果)

别看这题提交次数这么少,我可是在devc上做了很久哦

2. 设计思路(用代码表示扣分)

#include<stdio.h>
int main()
{
	int a[4] = {0};
	int x,n,i,d,j,cnt,s=-1,y;
	scanf("%d%d",&x,&n);
	y=x;
	int k;
	s=0;
	int index;
	while(s!=n){
	    k=x;	
		cnt=0;
		for(i=0;i<4;i++){
		d=k%10;
		a[i]=d;
		k=k/10;
	}
	for(i=0;i<3;i++){
		if(a[i]==a[i+1]){
			cnt++;
		}
	}
	if(!cnt){
		for(i=0;i<2;i++){
			if(a[i]==a[i+2]){
				cnt++;
		}
	}
	}
	if(cnt==0 || cnt==1){
		if(a[0]==a[3]){
			cnt++;
		}
	}

	    s=4-cnt;
		if(s!=n){
			x=x+1;
		}
	 
    }
	printf("%d %04d",x-y,x);
	return 0;
}
  • (1)首先scanf出生年份和不同数字的个数,在定义一个数组a[4]
  • (2)定义s=-1 因为n不可能等于-1.所以一定会进入while循环,循环外用y来记录出生的年份
  • (3)在循环内用一个for i=0 to i=3 将年份的各个为上的值都付给数组
  • (4)for i=0 to i=3
    if a[i]==a[i+1]
    则cnt+1(cnt用来记录相同的数)
    if cnt=0或者cnt=1的话,在将(1 3)(2 4)的值进行比较,
    if如果cnt仍然为0。则将(1 4)进行比较。
  • (5)cnt存放的是想同的值,s=4-cnt记录不相同的数字,
  • (6)再将s于n 进行比较,if(s==n)则结束最外层的while循环
    else x=x+1 在进行以上操作,直到满足条件
  • (7) 最后就输出x-y 与 x的值

4.本题调试过程碰到问题及PTA提交列表情况说明。

  • (1)

很显然这题我只对了一个,刚刚开始的时候,打算用双层循环通过遍历来找相同的数,可是发现这样会重复比如1113,这样会让cnt=3,则不相同的数s=1,显然不正确

  • (2)

然后我就想了很久,我就决定用单层循环,来先比较相邻的两个数不如1113,诶发现cnt=2,满足条件,可是当输入的数为1989的时候cnt是为0.
于是为了解决这个问题,我就在设了一个条件,if经过了第一次的判断后cnt仍然为0,则再将(1,3)和(2,4)进行比较,
如果cnt扔为0则在将1 4进行比较,如果相等则,cnt++

  • (3)可是有出现了一个问题

一开始根本不知道这是一个什么错误,在思考了下

  • (4)

就解决了。

题目2:7-5 数组循环左移

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(用代码表示扣分)

  • (1)首先先输入n和x的值(n表示数组的长度,x表示左移的位数)
  • (2)在利用一个循环输入数组a[n]的值,在定义一个吧b[n]
  • (3)if(n>x) 进行一个循环for i=0 to i<n,
  • (4)if (i<x)则让b[n-x+i]=a[i]
  • (5)if(x>=i] 则b[i-x]=a[i]
  • (6)else (n<x) 进行一个while 循环 每次x=x-n直到x<n结束
  • (7)到x<n是进行上面3~5部的相同操作。
  • (8)最后用循环输出数组b[n]的值即可。

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

#include<stdio.h>
int main()
{
	int n,x,i;
	scanf("%d%d",&n,&x);
	int a[n],b[n];
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	if(x<=n){
			for(i=0;i<n;i++){
		if(i<x){
			b[n-x+i]=a[i];
		}
		if(i>=x){
			b[i-x]=a[i];
		}
	}
	}
	else {
		while(x>n){
			x=x-n;
		}

		for(i=0;i<n;i++){
		if(i<x){
			b[n-x+i]=a[i];
		}![](https://images2018.cnblogs.com/blog/1233828/201712/1233828-20171203184340179-1438165894.png)


		if(i>=x){
			b[i-x]=a[i];
		}
	}
    }
	printf("%d",b[0]);
	for(i=1;i<n;i++){
		printf(" %d",b[i]);
	}
	return 0;
}

4.本题调试过程碰到问题及PTA提交列表情况说明

  • (1)

首先第一次全错了,第一个原因是,没有考虑到n<x的情况
再者就是判断条件错了在第一个if(i<x)的时候是不能取到等号的

  • (2)

然后我是先解决了那个取等的问题,

  • (3)最后我就加了一个if(n<x)的判断并用一个while 语句来让x-n直到x<n 就能够解决以上问题

题目3:7-9 判断上三角矩阵

1. 本题PTA提交列表(要提交列表,不是结果)

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

#include<stdio.h>
int main()
{
	int t,n;
	scanf("%d",&t);

	while(t){
		scanf("%d",&n);
	    int a[n][n];
	    int i,j,flag=1;		
		for(i=0;i<n;i++){
			for(j=0;j<n;j++)
			scanf("%d",&a[i][j]);
		}
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				if(i>j){
					if(a[i][j]==0){
					}
					else {
						flag=0;
					}
				}
				}

			}
		
	if(flag==1){
		printf("YES\n");
	}
	else {
    printf("NO\n");
	}
	flag=1;
	t--;
    }
	return 0;
 } 

2. 设计思路(用代码表示扣分)

  • (1)先定义两个变量n,t ,t表示待测矩阵的个数,n表示矩阵的长度
  • (2)先输入t的值,在进行一个while循环 while(t)
  • (3)在while循环内,输入n的值,在利用两层循环输入啊a[n][n]的值
  • (4)在利用循环来判断矩阵的对角线的下半部分是否都为0,利用flag来判断
  • (5)是就输出Yes 不是就输出NO并在循环的最后让t自减

4.本题调试过程碰到问题及PTA提交列表情况说明

本题第一个错误就是在循环外输入n的值,这样会导致若每次循环时n的值不同会导致结果错误
然后还有就是判断对角线下部分是否为0是,我起先是利用了flag 来判断 既if(i>j){
if(a[i][j]==0){
flag=1
}
否则 falg =0
这样的话若是 有些为0 有些不为0,会导致flag的值覆盖,导致结果不正确。

二、截图本周题目集的PTA最后排名。(2分)

三、同学代码结对互评(1分)

1.互评同学名称

名称:黄炳炜

2.我的代码、互评同学代码截图

我的代码:

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

		printf("%4d",a[i][j]);
	}
		printf("\n");
	}
	return 0;
}

黄炳炜的代码:

include<stdio.h>

int main()
{
int a[1000]={0};
int i,n,m,t;
scanf("%d",&n);
scanf("%d",&m);
if(m>n)
m=m%n;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
{
t=a[i];
a[i]=a[n+i];
a[n+i]=t;
}
for(i=m;i<m+n-1;i++)
printf("%d ",a[i]);
printf("%d",a[m+n-1]);
}

3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。

答:我们的代码在移位这个操作上不同,我是多定义了一个数组,然后让b数组来存放调换位置后的数。
而,黄的代码他是先定义a[1000]然后全部定义为0;在条换位置在输出从a[m-1]到a[n+m-1]的数。

四、本周学习总结

1.你学会了什么?

1.1 C中如何存储字符串?

答:c中一般利用数组来储存字符串

1.2 字符串的结束标志是什么,为什么要结束标志?

答:字符串的结束标志是/0,有结束标志的目的是为了避免数组中那些不确定的量,影响程序的操作

1.3 字符串输入有哪几种方法?

有好几种1:可以用scanf语句输入 或者 gets 也行

1.4 数字字符怎么转整数,写个伪代码?

假设 ch为数字字符 让ch-'0'即可

1.5 16进制、二进制字符串如何转10进制?写伪代码?

for i=0 to i=n (n表示位数)让d=1,sum=0
d=d每个为上的数进制数的i次方
sum=sum+d

2.本周的内容,你还不会什么?

本周的内容,对于字符数组的运用还不是太熟悉,然后对于那些选择排序,冒泡排序等方法还是没有掌握

3.期中考试小结

3.1 你认为为什么没考好?

我觉得这次没考好的原因是对编程的不熟练,和基础的不扎实,手写代码很容易造成混乱,并且临场写代码,会有一些紧张感和没有头绪的感觉,再者平常编程都不可能一遍就对,所以这样是写一遍在时间很仓促的情况下,让我还是有一些不适应。

3.2 罗列错题

.3 下半学期要怎么调整C的学习?

c语言的确稍微有点麻烦,平时发最多时间就是在c语言上了,pta总是要做很久,到后期就有点吃力,
主要是平时对课本和翁恺视屏没有吃透,以后还是有先把基础弄扎实了再去做题。

posted @ 2017-12-03 22:35  z&jack  阅读(303)  评论(1编辑  收藏  举报