这个作业属于那个课程 | C语言程序设计II |
这个作业要求在哪里 | C语言I作业11 |
我在这个课程的目标是 | 能够编辑出一个能让我哥称赞的游戏 |
这个作业在那个具体方面帮助我实现目标 | 明白并区分局部变量和全局变量 |
参考文献 | PTA |
1.PTA实验作业
1.1统计某类完全平方数
本题要求实现一个函数,判断任一给定整数N
是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
函数接口定义:
int IsTheNumber ( const int N );
其中N
是用户传入的参数。如果N
满足条件,则该函数必须返回1,否则返回0。
裁判测试程序样例:
#include
#include
int IsTheNumber ( const int N );
int main()
{
int n1, n2, i, cnt;
scanf("%d %d", &n1, &n2);
cnt = 0;
for ( i=n1; i<=n2; i++ ) {
if ( IsTheNumber(i) )
cnt++;
}
printf("cnt = %d\n", cnt);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
105 500
输出样例:
cnt = 6
1.1.1数据处理
数据表达:
主函数定义了整型变量n1,n2,i,cnt;其中n1,n2位输入的取值范围,i用于控制循环,cnt用于记录满足条件的数有多少
自定义函数里定义了整型变量n,m,i,j,k,s;整型数组a[10],其中n用于放主函数传过来N的平方根,m用于判断N有多少位,i用于记录N的位数,整型数组a用于储存N每一个位的值,s为返回的数,j,k用于控制循环
数据处理:
主函数:
定义n1,n2为输入的范围,i用于控制循环,cnt用于记录满足条件的数有多少
输入范围
cnt=0
for(i=n1;i<=n2;i++)
{
if 自定义函数反回来的值不为零 then cnt++
}
输出cnt
自定义函数:
定义n用于放N的平方根,m用于判断N的位数,i用于记录N的位数,a[10]用于收集N每一位上的值,j,k用于控制循环,s为返回值
n=根号N
m=N
if n*n=N then
{
while(m>0)
{
a[i]=m除10的余数
m自除10
i++
}
for(j=1;j
1.1.2实验代码截图
1.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
100 300 | cnt = 4 | 100~300内有四个类完全平方数 |
300 1000 | cnt = 5 | 300~1000内有五个类完全平方数 |
10 30 | cnt = 0 | 10~30内没有类完全平方数 |
1.1.4 PTA提交列表及说明
提交列表说明
在devc++上运行的时候发现过以下错误
答案错误:自定义函数内判断数组收集的数中是否有相同的数,但是我却忘了一点,在a[j]=a[k]相同的时候下标不能相等,所以后来加上了j!=k这个条件。
1.2统计各位数字之和是5的数
本题要求实现两个函数:一个函数判断给定正整数的各位数字之和是否等于5;另一个函数统计给定区间内有多少个满足上述要求的整数,并计算这些整数的和。
函数接口定义:
int is( int number );
void count_sum( int a, int b );
函数is
判断number
的各位数字之和是否等于5,是则返回1,否则返回0。
函数count_sum
利用函数is
统计给定区间[a, b]内有多少个满足上述要求(即令is
返回1)的整数,并计算这些整数的和。最后按照格式
count = 满足条件的整数个数, sum = 这些整数的和
输入数据 | 输出数据 | 说明 |
---|---|---|
10 100 | count = 5, sum = 160 | 10~100内有五个各位数字之和是5的数,且他们的和为160 |
23 200 | 23 is counted. count = 9, sum = 756 |
20~200内有九个各位数字之和是5的数,且他们的和为756 |
32 320 | 32 is counted. 320 is counted. count = 15, sum = 2532 |
32~320内有十五个各位数字之和是5的数,且他们的和为2532 |
1.2.4 PTA提交列表及说明
提交列表说明
在devc++上运行的时候发现过以下错误
答案错误:我最开始的用数组收集好数字再求和的,最后将循环开始的i初始值赋值为1,导致答案错误,后来改为1才正确,现在的代码是我经过优化得到的
1.3特立独行的幸福
对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数的个数。如果这个数还是个素数,则其独立性加倍。例如 19 在区间[1, 100] 内就是一个特立独行的幸福数,其独立性为 2×4=8。
另一方面,如果一个大于1的数字经过数次迭代后进入了死循环,那这个数就不幸福。例如 29 迭代得到 85、89、145、42、20、4、16、37、58、89、…… 可见 89 到 58 形成了死循环,所以 29 就不幸福。
本题就要求你编写程序,列出给定区间内的所有特立独行的幸福数和它的独立性
输入格式:
输入在第一行给出闭区间的两个端点:1
输出格式:
按递增顺序列出给定闭区间 [A,B] 内的所有特立独行的幸福数和它的独立性。每对数字占一行,数字间以 1 个空格分隔。
如果区间内没有幸福数,则在一行中输出 SAD
。
输入样例 1:
10 40
输出样例 1:
19 8
23 6
28 3
31 4
32 3
注意:样例中,10、13 也都是幸福数,但它们分别依附于其他数字(如 23、31 等等),所以不输出。其它数字虽然其实也依附于其它幸福数,但因为那些数字不在给定区间 [10, 40] 内,所以它们在给定区间内是特立独行的幸福数。
输入样例 2:
110 120
输出样例 2:
SAD
1.3.1 数据处理
数据表达:
定义了整型全局变量数组n[10000],m[10000],n用于判断是否进入死循环,m用于放独立性
主函数定义了整型变量a,b,i,flag,其中a,b为输入的范围,i用于判断循环,flag用于判断是否有幸福数
自定义函数fact定义了整型变量c,i;其中a用于放x的值,i用于放各位数的平方和;
自定义函数fun定义了整型变量i,s;其中i用于控制循环,s为返回值
数据处理:
定义全局变量数组n[10000]用于判断是否进入死循环,m[10000]用于放独立性
主函数:
定义a,b放输入的范围,i用于控制循环
for(i=a;i<=b;i++)
{
将i传入fact函数中
}
for(i=a;i<=b;i++)
{
if n[i]!=-1 then
{
flag=-1
if fun(i)=0 then 输出i和m[i]
else 输出i和m[i]*2
}
}
if flag=0 then 输出SAD
自定义函数fact:
定义c用于放x的值
while(1)
{
定义i用于放x除以10余数的平方
while(x!=0)
{
i+=(x%10)的平方
x/=10
}
m[c]++;
if i=1 then 跳出循环
if i=4 then n[c]=-1 跳出循环
n[i]=-1;
x=i;
}
自定义函数fun:
定义i用于控制循环,s用于返回值
for(i=2;i<根号x;i++)
{
if x%i=0 then s=0
}
返回s的值
1.3.2 实验代码截图
1.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
10 20 | 13 4 19 8 |
10~20内幸福数有13和19,独立性分别为4和8 |
30 100 | 31 4 44 4 70 5 79 6 86 2 91 4 94 4 |
30~100内幸福数有31,44,70,79,86,91,94,独立性分别为4,4,5,6,2,4,4 |
11 12 | SAD | 11~12无幸福数 |
1.3.4 PTA提交列表及说明
提交列表说明
多种错误:我一开始是想着分四块写的,一块判断是不是素数,一块判断数的位数,一块判断各位数平方的和,一块用来输出,最后发现这根本行不通,在老师讲了全局变量之后再重新写了一遍。
部分正确:属于段错误,我的数组定义得太短了,导致测试点的结果超出数组的范围了,后来将1000改成10000后就正确了。
2.代码互评
(彭杰)同学的代码
我的代码
1.他的代码是定义m放N的平方根,n为m的平方,当n和N相等的时候再开始判断是否有相同的数,如果有则返回1,没有则返回0
2.我的代码是定义n放N的平方根,m放N的值,当n的平方和 N相等的时候用数组收集N的每一位数,然后再判断数组内是否有相同的数
3.相比之下,虽然我们的思路差不多,但是他的代码比我更好,他在收集N的每一位数的时候就顺便判断否有相同的数,节省了时间。
(王海靓)同学的代码
我的代码
1.他的代码自定义is函数定义digital来收集number的每一位数并用sum1累加贮存,然后判断当sum1=5时返回1否则返回0,自定义count_sum函数定义count来记录符合要求的个数,用sum来放累加和,当is函数返回的是1时count+1而sum+i然后输出count和sum
2.我的代码自定义is函数定义sum来累加number的每一位数,i用于返回的值,当sum=5时i=1,然后返回i的值,自定义count_sum函数定义count来记录符合要求的个数,用sum来放累加和,当is函数返回的是1时count+1而sum+i然后输出count和sum
3.他的count_sum函数和我的相差无几但是他的is函数和我的不一样,他是先执行再判断,而我是先判断再执行,然后他是直接返回1或0,而我是返回i的值。
3.学习总结
3.1学习进度条
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
第六周 | 25小时 | 434行 | 常用的数学函数,if-else语句,for语句,自定义函数 | 自定义函数不会用一个算法来运算多个式子 |
第七周 | 8小时 | 142行 | 二分支结构和用char输入字符 | 对于字符型的代码有点看不懂,getchar与putchar还不明白怎么运用 |
第八周 | 12小时 | 343行 | 多分支结构,switch语句 | switch语句用得有点混乱,搞不清什么时候该结束 |
第九周 | 14个半小时 | 503行 | 自定义函数的用法,怎样用一个算法来运算多个式子 | if语句的嵌套不明白是怎样分支的 |
第十周 | 8个半小时 | 181 | do-while,while循环语句和continue语句 | continue不知道怎么去运 |
第十一周 | 28个小时 | 1246 | 一维数组和二维数组的基本运用 | 数组用的不够熟练,老是犯错 |
第十二周 | 10个小时 | 391 | 学会了整型数组字,浮点型数组和符型数组,学会了结构体struct的运用 | struct的嵌套容易搞混变量 |
第十三周 | 8小时 | 436 | 学会了混合结构体和结构体数组 | 指针理解不了 |
第十四周 | 7小时 | 308 | 学会的指针如何取地址 | 但是不会如何使用 |
第十五周 | 10小时 | 220 | 弄清楚了自动变量,静态变量,局部变量和全局变量 | 全局变量容易找不到方向 |
3.2 累积代码行和博客字数
时间 | 博客字数 | 代码行数 |
---|---|---|
第四周 | 645 | 0 |
第五周 | 645 | 0 |
第六周 | 1275 | 434 |
第七周 | 2523 | 576 |
第八周 | 3371 | 938 |
第九周 | 5414 | 1441 |
第十周 | 6930 | 1622 |
第十一周 | 9584 | 2868 |
第十二周 | 13222 | 3259 |
第十三周 | 15483 | 3695 |
第十四周 | 18021 | 4003 |
第十五周 | 22382 | 4223 |
3.3 学习内容总结和感悟
3.3.1 学习内容总结
3.3.2 学习体会
1.在学指针的过程中感觉一直是懵懂的状态,感觉看懂了但是写于指针有关的题目的时候却又不会写,弄得这几天又点泄气,一直没怎么去学习。
2.在自己最颓废的时候看了老师的博客园,觉得老师说的很对,“作业难度越来越大,已经超过自己的能力范围,而自己又没有办法解决时,通常会选择忘记自己最初设定的目标”,这周我就因为题目太难而写了很久却没写出来而开始变得颓废,去玩游戏没有去学习,看到老师的这篇博客园后,我醒悟了过来,逐渐的又开始进入学习的状态了。
3.这周写pta的时候就遇到了困难,由于题目做不出而开始变得急躁,在最后截止时间还没写完的时候甚至还有点沮丧。晚上睡觉的时候想了许久,想到了老师说的这句话“直到问题重新让人变得焦虑,这种张力才再次聚集起来,所以会出现从打鸡血到颓废的不断循环”,于是我第二天又从新振作了起来,最后将挑战题写了出来。