技術共有

2024 年 6 月 CCF-GESP プログラミング能力レベル認定 C プログラミング レベル 3 実際の試験問題分析

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

この記事はコラム「C++ レベル認定 CCF-GESP の実際の質問の分析》、コラム総合カタログ:ここをクリック 。ご購読いただくとコラムのすべての記事をお読みいただけます。

1. 選択問題(各2点、計30点)

質問1

Xiao Yang の両親は、CCF が主催する GESP 認定試験のレベル 1 に登録するために彼を訓練機関に連れて行きました。そして、彼が選択できる認定言語があります。
A. 1
B. 2
C.3
D.4

答え:C

質問2

以下のフローチャートで、yr に 2024 と入力すると、yr は閏年であると判断でき、2 月は 29 日であると出力され、図のひし形のボックスが埋められます。
ここに画像の説明を挿入します

A. (年%400==0) || (年%4==0)
B. (yr%400==0) || (年%4==0 && 年%100!=0)
C. (年%400==0) && (年%4==0)
D. (yr%400==0) && (yr%4==0 && yr%100!=0)

答え:B

質問3

一般に、デフォルトでは、64 ビット コンピュータ システムの整数変数 (int) は 32 ビットのままであるため、整数が表現できるデータ範囲は () です。
A. 0 0 0 ~ 2 32 2^{32} 232
B. 0 0 0 ~ 2 64 2^{64} 264
C. − 2 31 -2^{31} 231 ~ ( 2 31 ) − 1 (2^{31})-1 (231)1
D. − 2 63 -2^{63} 263 ~ ( 2 63 ) − 1 (2^{63})-1 (263)1

答え:C

質問4

次のコードは 10 進数を 8 進数に変換し、水平線に ( ) を記入する必要があります。

#include <iostream>

using namespace std;

void decimal2octal(int decimal) {
	int oct_number[100];
	int i = 0;
	
	while (decimal > 0) {
		__________________________ //在此处填入代码
	}
	for (int j = i - 1; j >= 0; j--) {
		cout << oct_number[j];
	}
	cout << endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

A. oct_number[i] = 小数点 % 8; 小数点 /= 8;
B. oct_number[i] = 小数点 / 8; 小数点 %/= 8;
C. oct_number[i++] = 小数点 % 8; 小数点 /= 8;
D. oct_number[i++] = 小数点 / 8; 小数点 %= 8;

答え:C

質問5

2 進数 101.11 に対応する 10 進数は ( ) です。
6.5 回答
B. 5.5
5.75 秒
5.25 翻訳

答え:C

質問6

以下のフローチャートの出力結果は( )となります。
ここに画像の説明を挿入します

A. 5
B. 10
20世紀
D.30

答え:B

質問7

次のコードの出力は ( ) です。

#include <iostream>
using namespace std;

int main() {
	int a = 12;
	int result = a >> 2;
	cout << result << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

A. 12
B.6
C.3
D. 1

答え:C

質問8

次のコードの出力は ( ) です。

#include <iostream>
using namespace std;

int main() {
	int a = 5;
	int b = 10;
	
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	
	cout << "a = " << a << ", b = " << b << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

A. a = 5、b = 10
B. a = 5、b = 5
C. a = 10、b = 5
D. a = 10、b = 10

答え:C

質問9

文字列が char str[] = “GESP”; として定義されている場合、文字配列 str の長さは () です。
A.0
B.4
C.5
D.6

答え:C

質問10

次のコードの横線 ( ) を埋めて、出力を「7」にします。

#include <iostream>
using namespace std;

int main() {
	int array[5] = {37524};
	
	int max = 0;
	for(int i=0; i<5; i++)
		if(______________) // 在此处填入代码
			max = array[i];
			
	cout << max << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

A. 最大値 &gt; 配列[i]
B. 最大値 &lt; 配列[i]
C. 最大 = 配列[i]
D. 上記のどれも正しくありません

答え:B

質問11

Xiao Yang は数学の問題を行っています。この問題では、1 から 35 までの 7 で割り切れる数字、つまり [7、14、21、28、35] を見つける必要があります。どのコードを横線に記入する必要がありますか? ( )

#include <iostream>
using namespace std;

int main() {
	int arr[35];
	int count = 0;
	for (int i = 1; i <= 35; i++) {
		if (i % 7 == 0)
			__________________________ // 在此处填入代码
	}
	for (int i = 0; i < count; i++)
		cout << arr[i] << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

A. arr[count++] = i;
B. arr[i] = count++;
C. arr[i] = カウント;
D. arr[count] = count++;

答え: A

質問12

文字「0」の ASCII エンコード 10 進表現は 48 であることが知られています。次の C++ コードを実行すると、出力は () になります。

#include <iostream>
using namespace std;

int main() {
	string s = "0629";
	
	int n = s.length();
	int x = 0;
	for(int i = 0; i < n; i++)
		x += s[i];
		
	cout << x << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

A. 17
B. 158
209年頃
紀元316年

答え:C

質問13

小学生の男子バスケットボールチームが新入部員を募集しており、入部条件は身長135cm以上(135cmを除く)であることが求められる。今回の登録者は10名で、身長はそれぞれ125、127、136、134、137、138、126、135、140、145。次のコードを完成させて、今回チームが何人の新しいメンバーを採用できるかを調べてください。 ( )

#include <iostream>
using namespace std;

int main() {
	int arr[10] = {125, 127, 136, 134, 137, 138, 126, 135, 140, 145};
	
	int count = 0;
	for(int i=0; i<10; i++)
		__________________________ // 在此处填入代码
	
	cout << count << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

A. count = arr[i]&gt;135? 1: 0;
B. count += arr[i]&gt;135? 1: 0;
C. カウント++;
D. 上記のどれも正しくありません

答え:B

質問14

彼らは友人の誕生日のためにパーティーを計画しています. を正しく出力できる C++ ステートメントは何ですか? ( )
A. cout &lt;&lt;「彼らは友達の誕生日パーティーを計画しています。」 &lt;&lt; endl;
B. cout &lt;&lt;「彼らは友達の誕生日パーティーを計画しています。」&lt;&lt; endl;
C. cout &lt;&lt;「彼らは友達の誕生日パーティーを計画しています。」&lt;&lt; endl;
D. cout &lt;&lt;「彼らは友達の誕生日パーティーを計画しています。」 &lt;&lt; endl;

答え:D

質問15

以下のC++コードを実行した後の出力結果が「gesp ccf org cn」の場合、横行にはどのコードを記入すればよいでしょうか? ( )

#include <iostream>
using namespace std;

int main() {
	string str = "gesp.ccf.org.cn";
	
	string delimiter = ".";
	string result="";
	string token;
	size_t found = str.find(delimiter);
	while (found != string::npos) {
		token = str.substr(0, found);
		result += token;
		result += " ";
		__________________________ // 在此处填入代码
		found = str.find(delimiter);
	}
	//最后一部分
	result += str;
		result += " ";
	cout << result << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

A. str = str.substr(found + delimiter.length(), str.length() - 1);
B. str = str.substr(found, str.length() );
C. str = str.substr(見つかった、str.length() -1);
D. 上記のどれも正しくありません

答え: A

2. 正誤問題(各2点、合計20点)

質問16

GESP テストは、認定者のプログラミング能力をレベル認定するものであり、同じレベルの能力は基本的にプログラミング言語に依存しません。

答え: 正解

質問17

整数 -6 の 16 ビットの補数は、16 進数で FFFA として表すことができます。

答え: 正解

質問18

補数の利点は、減算演算を加算演算に変換できるため、コンピューターのハードウェア設計が簡素化されることです。

答え: 正解

質問19

文字定数「0」は文字列の終わりを示すためによく使用されます。これは文字定数「0」と同じです。

答え: 違います

質問20

配列のすべての要素はメモリに不連続に格納できます。

答え: 違います

質問21

C++ では、配列および各基本タイプの配列の要素に値を割り当てることができます。

答え: 違います

質問22

これが int 型の変数で、式 ((a | 3) == 3) の値が true の場合、それは 0 と 3 (おそらく 0、おそらく 3) の間であることを意味します。

答え: 正解

質問23

次の C++ コードを実行すると、出力結果は 8 になります。

int a = 0b1010;
int b = 01100;
int c = a & b;
cout << c <<endl;
  • 1
  • 2
  • 3
  • 4

答え: 違います

質問24

次の C++ コードを実行すると、出力結果が 89781 になることはありません。 ( )

#include <iostream>
#include <cstdlib> // 为了使用 rand() 和 srand()
#include <ctime> // 为了使用 time()

using namespace std;

int main() {
	// 设置随机种子
	srand(time(NULL));
	
	int i = 1;
	int s[5];
	while(i <= 5)
	{
		int a = rand() % 10;
		if(a % 3 == (i + 1) % 3)
			s[i++] = a;
	}
	for(int i = 1; i <= 5; i++)
		cout << s[i];
	cout << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

答え: 正解

質問25

整数 3025 を 30 と 25 の 2 つの数値に切り分けます。このとき、これら 2 つの数値の和を 2 乗すると、計算結果は元の数値と等しくなります。 (30 + 25) × (30 + 25) = 55 × 55 = 3025。この数値を「落雷数」と呼びます。列挙メソッドを使用して、このような条件を満たす 4 桁の数値をすべて検索できます。 ( )

答え: 正解

3. プログラミング問題(各25点、計50点)

質問26

質問名: シフト
制限時間:1.0秒
メモリ制限:512.0MB
質問の説明
Xiao Yang は、すべての大文字が一定の数値だけ後方にシフトされる暗号化テクノロジーの移行を学びました。オフセット プロセスでは、アルファベットが端から端まで接続されたリングとして扱われます。たとえば、オフセットが 3 の場合、大文字の A は D に置き換えられ、大文字の Z は C に置き換えられます。全体として、大文字のアルファベットは ABCDEFGHIJKLMNOPQRSTUVWXYZ になります。は DEFGHIJKLMNOPQRSTUVWXYZABC に置き換えられます。
注: オフセットが 26 の倍数の場合、各大文字はオフセット後の正確な元の位置に戻ります。つまり、大文字のアルファベット ABCDEFGHIJKLMNOPQRSTUVWXYZ はオフセット後も変更されません。
入力フォーマット
最初の行には正の整数が含まれています んん
出力フォーマット
出力がオフセットされています んん この場合、大文字のアルファベット ABCDEFGHIJKLMNOPQRSTUVWXYZ はシフト置換の結果です。
サンプル1

3
  • 1
DEFGHIJKLMNOPQRSTUVWXYZABC
  • 1

サンプル説明
オフセットが 3 の場合、大文字の A は D に置き換えられ、大文字の Z は C に置き換えられます。全体として、大文字のアルファベット ABCDEFGHIJKLMNOPQRSTUVWXYZ は DEFGHIJKLMNOPQRSTUVWXYZABC に置き換えられます。
データ範囲
すべてのデータについて、次のことが保証されています。 1≤n≤100 1≤n≤1001100

参考手順

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	int fl=0;
	for(int i=0;i<26;i++){
		int j = (i+n)%26;
		char ch = 'A'+j;
		cout<<ch;
	}
	cout<<"n";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

質問27

質問名: 倍数を検索
制限時間:1.0秒
メモリ制限:512.0MB
質問の説明
Xiao Yangには含まれています んん 正の整数のシーケンス A = [ a 1 , a 2 , . . . , an ] A=[a_1,a_2,...,a_n]=[1つの1,1つの2,...,1つの]、彼は、があるかどうかを知りたいと思っています。 わたし ( 1 ≤ わたし ≤ n ) わたし ( 1 ≤ わたし ≤ n )(1) 作る あいあい1つの シーケンスです AA 内のすべての数値の倍数。
入力フォーマット
最初の行には正の整数が含まれています ttt, はテスト ケース グループの数を表します。
次は ttt テスト ケースのセット。
テスト ケースのセットごとに 2 行があります。その中で、最初の行には正の整数が含まれています んん; 2行目には次の内容が含まれます んん シーケンスを表す正の整数 AA
出力フォーマット
テスト ケースのセットごとに、 わたし ( 1 ≤ わたし ≤ n ) わたし ( 1 ≤ わたし ≤ n )(1) 誰もが満足できる k ( 1 ≤ k ≤ n ) aik(1≤k≤n)a_i(1)1つの はい ああ、ああ1つの の倍数の場合は Yes が出力され、それ以外の場合は No が出力されます。
サンプル1

2
3
1 2 4
5
1 2 3 4 5
  • 1
  • 2
  • 3
  • 4
  • 5
Yes
No
  • 1
  • 2

サンプル説明
最初のデータセットについては、 3 = 4 a_3=41つの3=4、満足する 3 a_31つの3 はい 1 1_11つの1 そして 2 ...1つの2 倍数。
データ範囲
すべてのデータについて、次のことが保証されています。 1 ≤ t ≤ 10 , 1 ≤ n ≤ 1 0 5 , 1 ≤ ai ≤ 1 0 9 1≤t≤10,1≤n≤10^5,1≤a_i≤10^91t10,1105,11つの109
参考手順

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N];
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		int x = 0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			x =max(x,a[i]);
		}
		int fl = 0;
		for(int i=1;i<=n;i++){
			if(x%a[i])fl=1;
		}
		if(fl)cout<<"Non";
		else cout<<"Yesn";
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23