C语言I博客作业11

这个作业属于那个课程 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实验代码截图

C语言I博客作业11_第1张图片

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 = 这些整数的和

进行输出。题目保证0

裁判测试程序样例:

#include 

int is( int number );
void count_sum( int a, int b );

int main()
{
    int a, b;

    scanf("%d %d", &a, &b);
    if (is(a)) printf("%d is counted.\n", a);
    if (is(b)) printf("%d is counted.\n", b);
    count_sum(a, b);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

104 999

输出样例:

104 is counted.
count = 15, sum = 3720

1.2.1 数据处理

数据表达:

主函数定义了整型变量a,b为输入的范围
自定义函数is定义了整型变量i,sum,其中sum为传过来的number的每一位相加的和,i为返回值
自定义函数count_sum定义了整型变量count,sum,i;其中count为记录满足要求的个数,sum为每一个满足条件的数的和,i为控制循环

数据处理:

主函数:
定义a,b为输入的范围

输入范围
if 自定义函数is返回来的值不为0 then 输出a is counted
if 自定义函数is返回来的值不为0 then 输出b is counted
自定义函数 count_sum(a, b);

自定义函数is:
定义i为控制循环变量,sum为number的每一位数累加的和

while(number>0)
{
    sum+=number除以10的余数
    number自除10
}
if sum=5 then i=1
返回i的值

自定义函数count_sum
定义count用于记录满足条件数的个数,sum为满足条件的每一个数累加的和,i为控制循环

for(i=a;i<=b;i++)
{
    if 自定义函数is返回的值不为0 then sum自加i,count++
}
输出count,sum

1.2.2 实验代码截图

C语言I博客作业11_第2张图片

1.2.3 造测试数据

输入数据 输出数据 说明
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 实验代码截图

C语言I博客作业11_第3张图片

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提交列表及说明

C语言I博客作业11_第4张图片

提交列表说明

多种错误:我一开始是想着分四块写的,一块判断是不是素数,一块判断数的位数,一块判断各位数平方的和,一块用来输出,最后发现这根本行不通,在老师讲了全局变量之后再重新写了一遍。
部分正确:属于段错误,我的数组定义得太短了,导致测试点的结果超出数组的范围了,后来将1000改成10000后就正确了。

2.代码互评

(彭杰)同学的代码

C语言I博客作业11_第5张图片

我的代码

C语言I博客作业11_第6张图片

1.他的代码是定义m放N的平方根,n为m的平方,当n和N相等的时候再开始判断是否有相同的数,如果有则返回1,没有则返回0
2.我的代码是定义n放N的平方根,m放N的值,当n的平方和 N相等的时候用数组收集N的每一位数,然后再判断数组内是否有相同的数
3.相比之下,虽然我们的思路差不多,但是他的代码比我更好,他在收集N的每一位数的时候就顺便判断否有相同的数,节省了时间。

(王海靓)同学的代码

C语言I博客作业11_第7张图片

我的代码

C语言I博客作业11_第8张图片

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

C语言I博客作业11_第9张图片

3.3 学习内容总结和感悟

3.3.1 学习内容总结

C语言I博客作业11_第10张图片

3.3.2 学习体会

1.在学指针的过程中感觉一直是懵懂的状态,感觉看懂了但是写于指针有关的题目的时候却又不会写,弄得这几天又点泄气,一直没怎么去学习。
2.在自己最颓废的时候看了老师的博客园,觉得老师说的很对,“作业难度越来越大,已经超过自己的能力范围,而自己又没有办法解决时,通常会选择忘记自己最初设定的目标”,这周我就因为题目太难而写了很久却没写出来而开始变得颓废,去玩游戏没有去学习,看到老师的这篇博客园后,我醒悟了过来,逐渐的又开始进入学习的状态了。
3.这周写pta的时候就遇到了困难,由于题目做不出而开始变得急躁,在最后截止时间还没写完的时候甚至还有点沮丧。晚上睡觉的时候想了许久,想到了老师说的这句话“直到问题重新让人变得焦虑,这种张力才再次聚集起来,所以会出现从打鸡血到颓废的不断循环”,于是我第二天又从新振作了起来,最后将挑战题写了出来。

你可能感兴趣的:(C语言I博客作业11)