全國高校綠色計算大賽-專案挑戰組-模擬賽-第一階段
第1關:求和
挑戰任務
這次“綠盟杯”大賽,小明作為參賽選手在練習的時候遇到一個問題,他要對一個範圍的兩個數進行數位的累加,例如有兩個數 15
,19
則 他們的數位和應該為:
1+5+1+6+1+7+1+8+1+9,結果為40
。
你來幫他解決這個問題吧。
程式設計要求
補充完善右側程式碼區中的getSum(int num1,int num2)
函式,實現對兩個數num1
和num2
的數位和相加,最後返回計算的結果即可。
注:num1
和num2
的值都在1-999
之間。
測試說明
樣例1
輸入:
15
19
輸出:
40
注意:
- 針對本關的具體評測程式碼由平臺後臺提供,你只需補充完善
getSum
- 本關共包含
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 **********/
}