C语言I博客作业02
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/CST2020-1 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2020-1/homework/11452 |
这个作业的目标 | <学习并掌握循环语句的应用,总结在PTA中出现的问题并说明解决的方式> |
学号 | <20208958> |
1.PTA实验作业(15分/题)
1.1 求分数序列前N项和
题目要求:本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
1.1.1实验代码截图
1.1.2数据处理
数据表达:使用了整型变量N,i,浮点型变量sum,x,a,b,输出N表示需计算循环的次数,给a,b赋值进入循环,计算sum
数据处理: 未使用表达式,结构为一个for循环嵌套
1.1.3 PTA提交列表及说明
- Q1:遇到较大N错误
- A1:用int定义N太大存不下,改用double
- Q2:提交后发现少打了;导致编译错误
- A2:在Dev-C++上发现后改正
1.2 比较大小
题目要求:本题要求将输入的任意3个整数从小到大输出。输入在一行中给出3个整数,其间以空格分隔。在一行中将3个整数从小到大输出,其间以“->”相连。
1.2.1 实验代码截图
1.2.2 数据处理
数据表达:使用了整型变量a,b,c,d,通过d储存数值转换到a,b,c中
数据处理:未使用表达式,使用了三次if语句,通过比较a,b,c大小进行输出
1.2.3 PTA提交列表及说明
- Q1:在使用if-else时提交后为部分正确
- A1:去掉了else后达到答案正确
- Q2:三个变量时无法输出正确答案
- A2:添加第四个变量进行转化
1.3.1 实验代码截图
1.3.2 数据处理
数据表达:使用了整型变量sum,i,n,通过对i的循环计算sum
数据处理:无表达式,使用了一个for循环
1.3.3 PTA提交列表及说明
- Q1:在输出时输出值与理想值不一致,输出的定义不明确
- A1:加入一个%d将定义明确
2.阅读代码(-5——5分)
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<queue>
#define ll long long;
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
#define inf 0x3f3f3f3f
#define ins 0xc0
using namespace std;
int M, N, sx, sy, ex, ey;
char a[305][305];
int t[305][305];
int d[4][2] = { 1, 0, 0, 1, 0, -1, -1, 0 };
struct pnt{
int x, y;
};
int bfs()
{
pnt p, np;
p.x = sx;
p.y = sy;
memset(t, 0x3f, sizeof t);
t[sx][sy] = 0;
queue< pnt > que;
que.push(p);
while (!que.empty()){
p = que.front(); que.pop();
for (int i = 0; i < 4; i++){
np.x = p.x + d[i][0];
np.y = p.y + d[i][1];
if (np.x >= 0 && np.x < M&&np.y >= 0 && np.y < N&&a[np.x][np.y] != 'R'&&a[np.x][np.y] != 'S'){
if (a[np.x][np.y] == 'E'||a[np.x][np.y]=='T'){
if (t[p.x][p.y] + 1 < t[np.x][np.y]){
t[np.x][np.y] = t[p.x][p.y] + 1;
que.push(np);
}
}
else if (a[np.x][np.y] == 'B'){
if (t[p.x][p.y] + 2 < t[np.x][np.y]){
t[np.x][np.y] = t[p.x][p.y] + 2;
que.push(np);
}
}
}
}
}
return (t[ex][ey] == inf ? -1 : t[ex][ey]);
}
int main()
{
while (scanf("%d%d", &M, &N) != EOF && (M || N)){
for (int i = 0; i < M; i++) scanf("%s", &a[i]);
for (int i = 0; i < M; i++){
for (int j = 0; j < N; j++){
if (a[i][j] == 'Y'){
sx = i;
sy = j;
}
else if (a[i][j] == 'T'){
ex = i;
ey = j;
}
}
}
int tt = bfs();
printf("%d\n", tt);
}
return 0;
}
我所读的代码是一个英文名叫作battle city,中文名叫90坦克大战的游戏代码,在Dev-c++上进行编译运行并输出,输出结果与所提供的答案一致,头文件过多让我有些看不懂,但加强了我对for语句和if-else语句的理解与熟练程度,
3.学习总结(15分)
3.1学习进度条(5分)
周/日期 | 这周所花时间 | 代码行 | 学到的知识点简介 | 目前比较困惑的问题 |
---|---|---|---|---|
第八周 | 33小时 | 182 | 基础常用代码知识,整型变量,浮点型变量,运算符的相关知识,markdown语法的运用 | 运算符的优先级的问题 |
第九周 | 39小时 | 251 | scanf调用函数,if-else语句,for循环结构 | if-else语句中else的使用问题 |
第十周 | 30小时 | 193 | 数学常用函数与数学函数的调用头文件的运用 | 流程框图的编写问题 |
3.2 累积代码行和博客字数(5分)
3.3 学习感悟(5分)
在这周的学习中,我已经能够较为熟练的编写代码,还记得在刚开始写代码时,连打开软件后能干吗都不知道,到现在熟练打开熟练码代码。重视每一次编译时出现的错误,特别是频繁出现的更要注意。出现错误也不要着急,多交流。也许别人会看到你发现不了的漏洞,交流会让人共同进步。最主要的是多去练习,失败是成功之母,一次又一次的尝试代表的是对自己知识一次又一次的检验,错误能够让你牢记。在刚接触c语言时,是直接观看他人的代码才写出,现在能够自己去尝试编写一些简单的代码。