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) 函数中,使用 flasetrue 关键字进行返回(因为使用的认为返回的类型为真假而理解错误)之后改成返回 10 即可

二、代码互评

同学代码

我的代码

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,难又能有什么办法呢,还是得去学习,就算是偷的别人代码,也要把它搞懂。然后接下来这段时间好好复习吧不能挂科,寻思自己平时表现好像还不是很差哈,百分之五十加上笔试的话我觉得吧还是可以的。但是还是要复习的,也要好好学习,我渴望力量。

posted @ 2019-12-06 10:00  orange_toffee  阅读(302)  评论(1编辑  收藏  举报