全国高校绿色计算大赛-项目挑战组-模拟赛-第一阶段

第1关:求和

挑战任务

这次“绿盟杯”大赛,小明作为参赛选手在练习的时候遇到一个问题,他要对一个范围的两个数进行数位的累加,例如有两个数 1519 则 他们的数位和应该为:
1+5+1+6+1+7+1+8+1+9,结果为40

你来帮他解决这个问题吧。

编程要求

补充完善右侧代码区中的getSum(int num1,int num2)函数,实现对两个数num1num2的数位和相加,最后返回计算的结果即可。

注:num1num2的值都在1-999之间。

测试说明

样例1

输入:

15
19

输出:

40

注意:

  1. 针对本关的具体评测代码由平台后台提供,你只需补充完善getSum函数,将计算结果作为返回值返回即可;
  2. 本关共包含4个测试用例,需所有测试用例评测通过才能得分;

开始挑战吧,祝你成功!

代码如下:

#include <iostream>

using namespace std;

/***************************
* 函数功能: 计算两个整数的和
* return: 计算结果
* @para num1: 第一个整数
* @para num2: 第二个整数
***************************/
int getSum(int num1, int num2)
{
	/********** BEGIN **********/
	int sum = 0;
	for (int i = num1; i <= num2; i++)
	{
		int ans = i;
		while (ans) sum += ans % 10, ans /= 10;
	}
	return sum;

	/********** END **********/
}

 

第2关:文件查看器

挑战任务

参加“绿盟杯”竞赛的小红遇到一个问题,她想要编写代码实现一个文件查看器,要实现指定文件夹下所有文件以及文件夹目录结构的展示。

你来帮她实现这个功能吧。

编程要求

编程实现对给定文件夹目录结构的展示,如果是文件夹则在其名字之前加上+--若是文件则加上--,上级目录与下级目录、下级文件用两个空格作为间隔,同级下依照文件夹、文件的首字母顺序依次打印;补充完善右侧代码区中的showDirStructure(char *folderPath)函数实现要求的功能,其中函数参数含义如下:

  • folderPath:指定要显示的文件夹

测试说明

样例1

输入src/step2/root

输出:

样例2

输入src/step2/dir

输出

提示: 在C语言中使用readdir函数可以获取目录内容,使用stat函数判断文件类型。

你可以通过如下链接下载本关涉及到的目录文件:
https://www.educoder.net/attachments/download/200773/step2Dir.zip


开始挑战吧,祝你成功!

 

解题思路:

首先要弄懂题目提供的两个函数的用法以及函数一些参数的含义;

readdir函数:返回参数dir 目录流的下个目录进入点。

                      d_name参数:文件名

具体请点击下面的链接:

https://blog.csdn.net/ztm521/article/details/44457601

stat函数:stat()用来将参数file_name 所指的文件状态, 复制到参数所指的结构中

                 st_mode参数:文件的类型和存取的权限

                S_ISDIR (st_mode) :判断是否为目录

                S_ISREG (st_mode) :判断是否为一般文件

具体请点击下面的链接:

https://blog.csdn.net/allenguo123/article/details/41011801

直接就是搜索,全部走一遍就可以了,注意理解两个函数的用法

代码如下:

#include <iostream>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>

using namespace std;

/***************************
* 函数功能: 遍历文件夹
* return: void
* @para folderPath: 文件夹路径
***************************/
void showDirStructure(char *folderPath)
{
	/********** BEGIN **********/
	static int temp = 0;
	char s[300];
	int i = strlen(folderPath) - 1;
	while (i>0 && folderPath[i] != '/') i--;
	//截取当前的文件名或文件夹名
	strncpy(s, folderPath + i + 1, strlen(folderPath) - i);
	//std::cout << s << std::endl;
	for (int i = 0; i<temp; i++)
		cout << "  ";
	cout << "+--" << s << endl;
	DIR *dir;
	struct dirent *ddir;
	//获取folderPath子目录下的所由文件和目录的列表,如果folderPath是个文件则返回值为NULL
	dir = opendir(folderPath);
	while ((ddir = readdir(dir)) != NULL) {
		//测试的好像是从压缩包里面读取的,所以可能会出现.或者..的文件名
		if (!strcmp(ddir->d_name, ".") || !strcmp(ddir->d_name, ".."))
			continue;
		struct stat ss;
		strcpy(s, folderPath);
		strcat(s, "/");
		strcat(s, ddir->d_name);
		stat(s, &ss);
		//判断是不是文件夹,如果是就直接进入更深的一层
		if (S_ISDIR(ss.st_mode)) {
			temp += 1;
			showDirStructure(s);
			temp -= 1;
		}
		else {
			for (int i = 0; i <= temp; i++)
				cout << "  ";
			cout << "--" << ddir->d_name << endl;
		}
	}
	closedir(dir);


	/********** END **********/
}

              

第3关:图片查看器

挑战任务

参加“绿盟杯”竞赛的小明想要开发一个图片查看器,他想只显示文件夹下所有图片类型的文件。

你来帮小明实现这个功能吧。

编程要求

基本功能与第二题类似,编程实现对给定文件夹目录结构的展示,如果是文件夹则在其名字之前加上+--若是文件则加上--,上级目录与下级目录、下级文件用两个空格作为间隔,同级下依照文件夹、文件的首字母顺序依次打印;另外需要对文件进行过滤,只显示图片类型的文件,本关需要过滤的图片文件类型有:“jpg,png,bmp”,请补充完善右侧代码区中的showDirStructure(char *folderPath)函数实现本关要求的功能,其中函数参数含义如下:

  • folderPath:指定要显示的文件夹

测试说明

样例1

输入src/step3/root

输出

提示:

你可以通过如下链接下载本关涉及到的目录文件:

https://www.educoder.net/attachments/download/202620/step3Dir.zip


开始挑战吧,祝你成功!

 

解题思路:这题就在第二题的基础上稍微改一下就好了,利用文件名将文件的后缀截取出来,然后进行比较就行了。。。

代码如下:

#include <iostream>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>

using namespace std;

/***************************
* 函数功能: 遍历文件夹
* return: void
* @para folderPath: 文件夹路径
***************************/
void showDirStructure(char *folderPath)
{
	/********** BEGIN **********/
	static int temp = 0;
	char s[300];
	int i = strlen(folderPath) - 1;
	while (i>0 && folderPath[i] != '/') i--;
	//截取当前的文件名或文件夹名
	strncpy(s, folderPath + i + 1, strlen(folderPath) - i);
	//std::cout << s << std::endl;
	for (int i = 0; i<temp; i++)
		cout << "  ";
	cout << "+--" << s << endl;
	DIR *dir;
	struct dirent *ddir;
	//获取folderPath子目录下的所由文件和目录的列表,如果folderPath是个文件则返回值为NULL
	dir = opendir(folderPath);
	while ((ddir = readdir(dir)) != NULL) {
		//测试的好像是从压缩包里面读取的,所以可能会出现.或者..的文件名
		if (!strcmp(ddir->d_name, ".") || !strcmp(ddir->d_name, ".."))
			continue;
		struct stat ss;
		strcpy(s, folderPath);
		strcat(s, "/");
		strcat(s, ddir->d_name);
		stat(s, &ss);
		//判断是不是文件夹,如果是就直接进入更深的一层
		if (S_ISDIR(ss.st_mode)) {
			temp += 1;
			showDirStructure(s);
			temp -= 1;
		}
		else {
			//判断是不是普通文件
			if (S_ISREG(ss.st_mode)) {
				int i = strlen(ddir->d_name) - 1;
				while (i>0 && ddir->d_name[i] != '.') i--;
				//截取文件后缀名
				strncpy(s, ddir->d_name + i + 1, strlen(ddir->d_name) - i);
				if (!strcmp(s, "jpg") || !strcmp(s, "png") || !strcmp(s, "bmp")) {
					for (int i = 0; i<temp + 1; i++)
						cout << "  ";
					cout << "--" << ddir->d_name << endl;
				}
			}
		}
	}
	closedir(dir);


	/********** END **********/
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值