0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
-
数组中查找数据:
- 数组的数据存放在下标不同的数组中,所以可将下标设为变量,输入确定的下标来寻找数;
- 学习过指针后,我们还可以用地址的加减来确定特定的数;
-
数组中如何插入数据
for j=k;j>n;j-- do//从尾部开始
a[j]=a[j-1];//将数组右移
end for
a[k-1]=temp;//插入数
-
数组中如何删除数据:确定删去的数,从该数开始,被赋予下一个数的值,这样要删的的数就被覆盖了;
-
数组中目前学到排序方法:
- 选择排序法:首先找出最大值或最小值,与开头或结尾的数调换,再找出次最值数,再次调换,直到剩下一个数;
- 冒泡排序法:从数组开头开始,每一个数与下一个数比较,若大于下一个数,调换位置,这样循环,叨叨一组有序数列;
-
数组做枚举用法:找重复数的题目中,以数组作为存放不同数的容器,当输入的数与数组的某个下标相同,开数组加一,计算数的出现次数;
1.2 本章学习体会
- 数组目前给我的感觉是一个工具,有一定的难度,尤其是字符数组,很多东西都没太搞懂,感觉不只在预习的时候要多翻书,平常有空时也要把书多翻几下,查漏补缺。
- 代码总量:793行
2.PTA实验作业
2.1 7-5 找鞍点
2.1.1 伪代码
定义数组a
输入行列数n
for i=0;i<n;i++ do
for j=0;j<n;j++ do
输入每个值
end for
end for
for i=0;i<n;i++ do
point1=a[i][0];
for(j=0;j<n;j++ do
比较每个值,找出最大值,记录下标
end for
for k0;k<n;k++ do
在确定的列中找到最小值,记录下标
end for
比较下标,确定是否为同一个数
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 | 2 1 | 正常数据 |
1 | 0 0 | 极小值 |
2.1.4 PTA提交列表及说明
Q1 编译错误:运用了多个循环后,{}被搞乱了,不知道哪个对应哪个,最后一一找对应,发现了错误;
Q2 部分正确:代码中没有考虑到相同值的出现,最后出现错误,其实加一个=就好了。
2.2 二维数组每列排序
2.1.1 伪代码
定义数组a[4][5]
for j=0;j<k;j++ do
for k=1;k<=3;k++ do
for i=0;i<3;i++ do
运用选择排序法,将每一列排列好
end for
end for
end for
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 | 1 1 7 4 3 4 6 8 1 1 2 6 0 7 8 9 | 正常数据 |
2.1.4 PTA提交列表及说明
Q1:运行超时:两次运行超时都是因为==打成了=,这是我打代码是的老毛病了,经常因此百思不得其解,其实只是自己犯二;
Q2:格式错误:没有审清楚题目,所以第一个数前按照习惯没有空格。
2.3 调查电视节目受欢迎程度
2.3.1 伪代码
静态定义数组a
输入个数n
for i=0;i<n:i++ do
输入每次投票
end for
for i=1;i<=8;i++ do
输出要求
end for
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
11042865468 | 112456899910 | 正常数据 |
111111........... | 崩溃 | 越界 |
2.3.4 PTA提交列表及说明
Q1:部分错误:段错误,没看清题目,全局变量小于最大数,数组越界
3.阅读代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 20
#define MAX 3628810
char s[3][N],op;
int n[3][N],len[3];
int num;
struct cha
{
char c;
int n;
}a[N];
bool OK;
void init(char *tmp)
{
bool used[2*N];
memset(n,0,sizeof(n));
memset(s,0,sizeof(s));
memset(a,0,sizeof(a));
memset(used,0,sizeof(used));
num=0;
int i,j,k;
for(i=0,j=0; i<3; i++)
{
len[i]=j;
for(k=0;;j++,k++)
{
if(tmp[j]=='+' || tmp[j]=='-' || tmp[j]=='=' || tmp[j]=='\0')
break;
s[i][k]=tmp[j];
if(tmp[j]>='0' && tmp[j]<='9') n[i][k]=tmp[j]-'0';
else
{
n[i][k]=tmp[j]-'A'+26;
if(!used[tmp[j]-'A'])
{
used[tmp[j]-'A']=true;
a[num++].c=tmp[j];
}
}
}
s[i][k]='\0';
if(i==0) op=tmp[j];
len[i]=j-len[i];
j++;
}
}
int tran(int i)
{
int ans=0;
for(int k=0; k<len[i]; k++)
ans=ans*10+n[i][k];
return ans;
}
void solve(int *per)
{
sort(per,per+num); //全排列前记得排序
do //对per枚举全排列
{
for(int i=0; i<num; i++) a[i].n=per[i];
for(int i=0; i<3; i++)
for(int j=0; j<len[i]; j++)
if(s[i][j]>='A' && s[i][j]<='Z')
for(int k=0; k<num; k++)
if(s[i][j] == a[k].c)
n[i][j]=a[k].n;
int ss[3];
for(int i=0; i<3; i++)
ss[i]=tran(i);
if(op=='+' && ss[0]+ss[1]==ss[2]) {OK=true; break;}
if(op=='-' && ss[0]-ss[1]==ss[2]) {OK=true; break;}
}
while(next_permutation(per,per+num));
}
int cmp(struct cha p ,struct cha q)
{
return p.c < q.c;
}
void BF()
{
int per[20];
OK=false;
sort(a,a+num,cmp);
for(int state=0; state<1024; state++)
{
int cc=0;
for(int k=0; k<10; k++) if(state&(1<<k)) per[cc++]=k;
if(cc==num)
solve(per);
if(OK) break;
}
for(int i=0; i<num; i++) printf("%c %d\n",a[i].c,a[i].n);
}
int main()
{
char tmp[3*N];
while(scanf("%s",tmp)!=EOF)
{
init(tmp);
BF();
}
return 0;
}