C语言I博客作业11
这个作业属于哪个课程 | C语言程序设计I |
---|---|
这个作业要求在哪里 | C语言I-2019秋作业11 |
我在这个课程的目标是 | 熟练使用程序语言并且能够写一个小游戏的程序 |
这个作业在那个具体方面帮助我实现目标 | 掌握各种类型函数的定义、调用和申明,熟悉变量的作用域、生存周期和存储类型。 |
参考文献 | 百度百科 |
一、PTA实验作业
1、统计某类完全平方数
题目
本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
函数接口定义:
int IsTheNumber ( const int N );
其中N是用户传入的参数。如果N满足条件,则该函数必须返回1,否则返回0。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
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
数据处理
数据表达: 编写判断完全平方数的代码
数据处理: 使用循环进行判断数是否包含相同的位数
伪代码:
- 获取
double
类型的根号数和int
类型的根号数,进行判断,是否为平方数 - 设置基数数组,作为桶模型,存放每一位的数据
- 如果有相似,即基数数组的大小
num[i] >= 2
,返回1 - 运行完毕仍然未返回,则返回0
源代码
int IsTheNumber(const int N)
{
int square = N;
int NumA = (int)sqrt(N);
double NumB = sqrt(N);
int num[10] = { 0 };
if (square == NumB * NumA)
while (square)
{
for (int i = 0; i <= 9; i++)
{
if (square % 10 == i)
{
num[i] += 1;
if (num[i] >= 2)
return 1;
}
}
square = square / 10;
}
return 0;
}
代码截图
造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
105 500 | cnt = 6 | 无 |
PTA提交列表及说明
在其他的编译软件上试过许多次了,然后运行成功后在Pta上面提交,一次就过了。
出现的错误:
之前的代码,并未进行 double
类型开方数判断,因而导致出现 if (square == NumB * NumA)
语句判断,必然为真的情况,之后经过调试,发现问题改正即可
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<a≤b≤10000。
裁判测试程序样例:
#include <stdio.h>
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
数据处理
数据表达: 判断每位数的和是否为5
数据处理: 位数加和即可
伪代码:
- 先编写函数用于每一位的加和
- 函数的流程为:使用
%
取余最后一位的数,进行加和,然后除以该数,抛弃尾部 - 随后使用
for
,然后在区间中符合情况的(即满足 if 函数的)进行个数的统计和值的加和 - 在
for
循环停止后,输出结果即可
源代码
int is(int number)
{
int sum = 0;
while (number > 0)
{
sum += number % 10;
number /= 10;
}
return sum == 5 ? 1 : 0;
}
void count_sum(int a, int b)
{
int count = 0, sum = 0;
for (int i = a; i <= b; i++)
{
if (is(i))
{
count++;
sum += i;
}
}
printf("count = %d, sum = %d", count, sum);
}
代码截图
造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
104 999 | 如图所示 | 无 |
PTA提交列表及说明
在其他的编译软件上试过许多次了,然后运行成功后在Pta上面提交,一次就过了。
出现的错误:
在 int is(int number)
函数中,使用 flase
和 true
关键字进行返回(因为使用的认为返回的类型为真假而理解错误)之后改成返回 1
和 0
即可
二、代码互评
同学代码
我的代码
int IsTheNumber(const int N)
{
int square = N;
int NumA = (int)sqrt(N);
double NumB = sqrt(N);
int num[10] = { 0 };
if (square == NumB * NumA)
while (square)
{
for (int i = 0; i <= 9; i++)
{
if (square % 10 == i)
{
num[i] += 1;
if (num[i] >= 2)
return 1;
}
}
square = square / 10;
}
return 0;
}
评价:
- 使用
int
类型的不取小数位的特点,来判断是否为平方数。 - 但是随后的桶排序却用了两个循环来判断是否出现了两次数,实在有点影响效率。
if (square % 10 == i)
{
num[i] += 1;
if (num[i] >= 2)
return 1;
}
- 在判断中存入桶中,并存入时判断个数,超1返回。可以极大地提高效率。
同学代码
我的代码
int is(int number)
{
int sum = 0;
while (number > 0)
{
sum += number % 10;
number /= 10;
}
return sum == 5 ? 1 : 0;
}
void count_sum(int a, int b)
{
int count = 0, sum = 0;
for (int i = a; i <= b; i++)
{
if (is(i))
{
count++;
sum += i;
}
}
printf("count = %d, sum = %d", count, sum);
}
评价:
is
函数结构繁琐,t = n % 10;
和s = s + t;
完全可以一条语句写完。
3.学习总结
3.1学习进度条
周/日期 | 周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
第3周/10月6~16 | 3天 | 181行 | if-else语句,递归,分段函数的计算 | 对这些还不是很熟练,对这些符号的使用跟空格的使用不是很清楚 |
第4周/10月10~17 | 2天 | 181行 | for循环语句与逻辑符 | 循环语句使用不够熟练,数学循环问题也有很多不明白的事情,不知道先后 |
第5周/10月18~24 | 10h | 148行 | 基本程序语言与生成乘方表与阶乘表 | 基本程序语言了解的都差不多了,有些不是特别熟练还是需要加强练习的,生成乘方表跟阶乘表这方面的内容还有很多不懂的,觉得完成作业很费力气,要查阅各种资料,可能跟我数学理解能力不强也有关系吧。 |
第6周/10月25~31 | 22h | 371行 | 多分支结构、字符型数据类型和逻辑运算符。顺便研究了几个心形的代码,觉得挺有趣。 | 就是有时候总是会丢三落四,然后也比较迷惑一些运算符使用方法,分之这一块还是不够熟练。 |
第7周/11月1~7 | 25h | 211行 | 熟悉多分支结构switch语句的使用、字符型数据类型和逻辑运算符。 | 迷惑的真的太多太多了,但是百度大法真不错,虽然没有白嫖别人的答案解释香,但是还是很有用,一学就让我停不下来的那种。对数学研究的还是不够好,所以做很多题目转不过弯来,要努力克服。 |
第8周/11月8~14 | 22h | 241行 | 熟悉使用while和do-while结构解决问题。 | 上课听的不太明白,课后也有查找资料,但是还是有很多不懂的,然后最近在做学习总结,想把自己不懂的都整理出来然后弄懂。 |
第9周/11月15~21 | 26h | 500行 | 熟悉break、continue的使用,熟悉使用循环的嵌套解决问题 | 想知道为什么会出现运行时错误 |
第10周/11月22~28 | 33h | 533行 | 能够根据实际情况,选择合适的算法、合理的循环结构,熟练的编写程序。 | 感谢每一个帮我解答问题的人,也很感谢听我抱怨的人,如果没有你们我估计都不能坚持这么久。 |
第11周/11月29~12月6 | 34h | 421行 | 掌握各种类型函数的定义、调用和申明,熟悉变量的作用域、生存周期和存储类型 | 宏函数除了做单行函数处理,可不可以想正常函数一样做多行操作呢 |
3.2累计代码行和博客字数
3.3学习内容总结和感悟
3.3.1 学习内容总结
3.3.2 学习体会
1,我又开始难过了啊这次题目真的不会写qaq,这也太难了吧。
2,希望自己以后多几分耐心吧,不要再毛毛躁躁的了,细心一点有耐心一点。有疑问的时候虚心请教,比如问朋友问老师问同学。
3,感觉自己的自学能力还是太弱了,然后对许多知识点的掌握也不够深,以后不能说感觉自己菜炸了,自己就是菜炸了。
4,突然发现自己身边挺多人对自己挺好的,会耐心回答我的疑问,会认真评论我的作业,希望在未来的道路上他们能够一直都在,然后一起进步。也希望自己不要辜负这么多人的期望,加油。
5,看了琛姐发的分享,我觉得我要好好学习c语言,也要好好练习一下自己的文笔,不能再像现在这样记流水账?
6,难又能有什么办法呢,还是得去学习,就算是偷的别人代码,也要把它搞懂。然后接下来这段时间好好复习吧不能挂科,寻思自己平时表现好像还不是很差哈,百分之五十加上笔试的话我觉得吧还是可以的。但是还是要复习的,也要好好学习,我渴望力量。