数组
一、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总是要做很久,到后期就有点吃力,
主要是平时对课本和翁恺视屏没有吃透,以后还是有先把基础弄扎实了再去做题。