1. 程式人生 > >全國高校綠色計算大賽-專案挑戰組-模擬賽-第一階段

全國高校綠色計算大賽-專案挑戰組-模擬賽-第一階段

第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函式判斷檔案型別。

開始挑戰吧,祝你成功!

解題思路:

首先要弄懂題目提供的兩個函式的用法以及函式一些引數的含義;

readdir函式:返回引數dir 目錄流的下個目錄進入點。

                      d_name引數:檔名

具體請點選下面的連結:

stat函式:stat()用來將引數file_name 所指的檔案狀態, 複製到引數所指的結構中

                 st_mode引數:檔案的型別和存取的許可權

                S_ISDIR (st_mode) :判斷是否為目錄

                S_ISREG (st_mode) :判斷是否為一般檔案

具體請點選下面的連結:

直接就是搜尋,全部走一遍就可以了,注意理解兩個函式的用法

程式碼如下:

#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

輸出

提示:

你可以通過如下連結下載本關涉及到的目錄檔案:

開始挑戰吧,祝你成功!

解題思路:這題就在第二題的基礎上稍微改一下就好了,利用檔名將檔案的字尾截取出來,然後進行比較就行了。。。

程式碼如下:

#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 **********/
}