Junho de 2023 Certificação de nível de competência GESP C++ Nível 4 Perguntas reais do exame

 

Perguntas reais do exame GESP nível 4 de 2023-06

Número de perguntas: 27

Pontuação: 100

Duração do teste: 90min

1. Questões de múltipla escolha (2 pontos cada, 30 pontos no total)

1. Os programas escritos em linguagens de alto nível precisam passar pelas seguintes operações () para gerar código executável que roda no computador. (D) (2 pontos)

A.Editar

B.Salvar

C. Depuração

D.Compile

Análise da resposta: O objetivo final do programa é compilar o programa fonte em um programa alvo. Um compilador é um programa de tradução que traduz um programa fonte escrito em uma linguagem de programação de alto nível em um programa alvo equivalente em formato de linguagem de máquina. Um compilador é um programa de tradução implementado usando uma abordagem de implementação generativa, tomando como entrada um programa fonte escrito em uma linguagem de programação de alto nível e usando como saída um programa alvo expresso em linguagem assembly ou linguagem de máquina.

2. O algoritmo de classificação é estável (Classificação Estável), o que significa que o algoritmo de classificação pode garantir que haja dois registros iguais de palavras-chave R e S nos dados a serem classificados (R aparece antes de S).Na lista classificada, R Também deve estar em frente a S. A seguinte descrição da estabilidade de classificação está correta (C). (2 minutos)

A. A classificação por bolha é instável

B. A classificação por inserção é instável

C. A classificação por seleção é instável

D. Nenhuma das opções acima está correta

3. A seguinte afirmação sobre ponteiros na linguagem C++ está incorreta (C). (2 minutos)

A. A variável ponteiro armazena o endereço de memória.

B. Ao definir uma variável de ponteiro, você deve especificar o tipo para o qual ela aponta.

C. Variáveis ​​de ponteiro só podem apontar para variáveis ​​de tipo básico, não para variáveis ​​de ponteiro.

D. O endereço de memória apontado pela variável ponteiro pode não ser legalmente acessível.

4. A seguinte afirmação sobre arrays na linguagem C++ está incorreta (D). (2 minutos)

A. Matrizes unidimensionais devem ser armazenadas continuamente na memória.

B. Uma matriz bidimensional é uma matriz unidimensional de matrizes unidimensionais.

C. Cada matriz unidimensional na matriz bidimensional é armazenada continuamente na memória.

D. Matrizes bidimensionais não podem ser armazenadas continuamente na memória.

5. A seguinte afirmação sobre funções na linguagem C++ está correta (A). (2 minutos)

A. As funções devem ter nomes.

B. A função deve ter parâmetros.

C. A função deve ter um valor de retorno.

D. A definição da função deve ser escrita antes da chamada da função.

6. A seguinte afirmação sobre variáveis ​​na linguagem C++ está correta (D). (2 minutos)

A. As variáveis ​​sempre podem ser usadas depois de definidas.

B. Os nomes das variáveis ​​das duas variáveis ​​não podem ser iguais.

C. Os nomes de variáveis ​​de duas variáveis ​​podem ser iguais, mas seus tipos devem ser diferentes.

D. Os nomes de variáveis ​​de duas variáveis ​​podem ser iguais, mas seus escopos devem ser diferentes.

7. Um array bidimensional é definido como array duplo[3][10];, então o tamanho da memória ocupada por este array bidimensional é (D). (2 minutos)

A.30

B.60

C.120

D.240

8. Uma variável é definida como int *p = nullptr;, então a seguinte afirmação está correta (B). (2 minutos)

A. O tipo da variável ponteiro é int.

B. O tipo apontado por esta variável de ponteiro é int.

C. O endereço de memória apontado por esta variável de ponteiro é aleatório.

D. Ocorrerá um erro de compilação ao acessar a memória apontada pela variável ponteiro.

9. Um array bidimensional é definido como int array[5][3];, então quantos bytes diferem entre as posições de array[1][2] e array[2][1] na memória? (C) (2 pontos)

A.2 bytes

B.4 bytes

C.8 bytes.

D. Incapaz de determinar.

10. Se a for uma variável do tipo int e o valor de a for 6, então após executar a &= 3;, o valor de a será (C). (2 minutos)

A.3

B.9

C.2

D.7

11. Uma matriz é definida como inta[5]={1, 2, 3, 4, 5}; e um ponteiro é definido como int *p=&a[2];, depois de executar a[1] = *p ;, O valor no array a se tornará (A). (2 minutos)

R.{1,3,3,4,5}

B.{2,2,3,4,5}

C.{1,2,2,4,5}

D.{1,2,3,4,5}

12. Qual das seguintes declarações de função pode passar o nome de um array bidimensional como parâmetro quando chamada? (A) (2 pontos)

A.void BubbleSort(int a[][4]);

B.void BubbleSort(int a[3][]);

C.void BubbleSort(int a[][]);

D.void BubbleSort(int ** a);

13. Preencha () na linha horizontal do código a seguir para obter a saída “20 10”. (B) (2 pontos)

#include <iostream>
using namespace std;
void xchg(________) { // 在此处填入代码
	int t = *x;
	*x =*y;
	*y = t;
int main() {
	int a = 10, b = 20;
	xchg(&a, &b);
	cout << a << " " << b << endl;
	return 0;
}

A.int x, int y

B.int *x, int *y

C.int a, int b

D.int & a, int & b

14. Após executar o seguinte programa em linguagem C++, o resultado de saída é (C). (2 minutos)

#include <iostream>
using namespace std;
int main() {
	int array[3][3];
	for (int i = 0; i< 3; i++)
		for (int j = @; j < 3; j++)
			array[i][j] = i * 10 + j;
	int sum;
	for (int i = 0; i< 3; i++)
		sum += array[i][i];
	cout << sum << endl;
	return 0;
}

A.3

B.30

C.33

D. Incapaz de determinar

15. Preencha () na linha horizontal do código a seguir para completar a classificação do array com n elementos do tipo int, de pequeno a grande. (A) (2 pontos)

void SelectionSort(int array[], int n) {
	int i, j, min, temp;
	for (i = 0; i < n - 1; i++) {
		min = i;
		for (j = i + 1; j < n; j++)
			if (________) // 在此处填入代码
				min = j;
		temp = array[min];
		array[min] = array[i];
		array[i] = temp;
	}
}

A.matriz[min] > matriz[j]

B.matriz[min] > matriz[i]

C.min > matriz[j]

D.min > matriz[i]

2. Perguntas Verdadeiro ou Falso (2 pontos cada, 20 pontos no total)

1. Um nome de domínio é uma sequência de nomes separados por pontos para identificar o nome de um computador ou grupo de computadores na Internet. O nome de domínio do site oficial da Certificação de Nível de Proficiência em Programação CCF é gespccforgcn, e o nome de domínio de nível superior é gesp. (errado)

2. A sequência 1,1,2,3,5,8... é uma sequência que leva o nome do matemático italiano Leonardo Fibonacci. A partir do terceiro número, cada número é a soma dos dois itens anteriores.

Se calcularmos o enésimo item da sequência (onde n>3) fib(n), usamos o seguinte método:

①Deixe fib(1)=fib(2)=1

②Use o loop para i=3 a n para calcular f(i) respectivamente

③Saída fib(n).

Isso reflete a ideia de programação recursiva. (certo)

3. Na linguagem C++, os parâmetros de função são passados ​​por referência por padrão. (errado)

4. Na linguagem C++, você pode definir um array quadridimensional, mas é impossível usá-lo na resolução de problemas práticos porque o mundo é tridimensional. (errado)

5. Na linguagem C++, quando uma função não é chamada, seus parâmetros não ocupam memória. (certo)

6. Na linguagem C++, se uma função puder lançar uma exceção, a função deverá ser chamada na cláusula try. (certo)

7. Se você deseja gravar 10 strings com comprimento máximo de 99 bytes, você pode definir a matriz de strings como char s[100][10];. (errado)

8. As constantes de caracteres '@' e "\0" são equivalentes. (errado)

9.>= e >>= são ambos operadores da linguagem C++. (certo)

10. Devido à operação de redirecionamento de arquivo, os programadores não podem determinar se o conteúdo gerado por cout será exibido na tela ao escrever programas na linguagem C++. (errado)

3. Questões de programação (25 pontos cada, 50 pontos no total)

1. Número da sorte

【Descrição do Problema】

Xiao Ming inventou um “número da sorte”. Para um número inteiro positivo, os dígitos pares permanecem inalterados (o dígito das unidades é o primeiro dígito, o dígito das dezenas é o segundo dígito e assim por diante), e os dígitos ímpares são transformados da seguinte forma: multiplique o número por 7, e se for não for maior que 9, use-o como resultado da transformação. Caso contrário, some os dígitos do resultado. Se o resultado não for maior que 9, será usado como resultado da transformação. Caso contrário (o resultado ainda é maior que 9) , continue somando os dígitos até que o resultado não seja maior que 9, como o resultado da transformação.

Após a conclusão da transformação, some os dígitos do resultado da transformação. Se a soma obtida for um múltiplo de 8, o número inteiro positivo no início é chamado de número da sorte.

Por exemplo, 16347: O primeiro dígito é 7, multiplicado por 7 e o resultado é 49, que é maior que 9. A soma dos dígitos é 13, que ainda é maior que 9. Continue adicionando os dígitos e o resultado final é 4; o terceiro dígito é 3 e o resultado da transformação é 3: O quinto bit é 1 e o resultado da transformação é 7. O resultado final da alteração é 76344. A soma dos dígitos do resultado 76344 é 24, que é um múltiplo de 8. Portanto 16347 é o número da sorte.

[Insira a descrição]

A primeira linha de entrada é um número inteiro positivo N, o que significa que há N números inteiros positivos a serem julgados.

Concorda-se que 1<=N<=20.

N linhas a partir da linha 2, cada linha possui um número inteiro positivo, que é o número inteiro positivo a ser julgado.

número. Concorda-se que esses números inteiros positivos são menores que 1012.

[Descrição da saída]

Produza N linhas, correspondendo a se os N inteiros positivos são números da sorte. Nesse caso, produza T, caso contrário, produza F.

Dica: você não precisa esperar até que todas as entradas sejam concluídas antes de enviá-las em sequência. Você pode inserir um número, avaliar um número e produzi-lo e, em seguida, inserir o próximo número.

[Amostra de entrada 1]

2

16347

76344

Procedimento de referência:

#include <iostream>
using namespace std;

//奇数位要做的数字变换
int trans(int t){
	if(t == 0)
		return 0;
	return ( t * 7 - 1) % 9 + 1;
}

//判断是否为幸运数
bool judge(long long x){
	int sum = 0;
	for(int d = 1; x > 0; d++, x/=10){
		int t = (int)(x % 10);
		if(d % 2 == 0)
			sum += t;
		else
			sum += trans(t);
	}
	return (sum % 8 == 0);
}
int main(){
	int N =0;
	cin >> N;
	for (int n=0; n < N;n++){
		long long x =0;
		cin >> x;
		if(judge(x))
			cout << "T" << endl;
		else
			cout << "F" << endl;
	}
	return 0;
}

2. Compressão de imagem

【Descrição do Problema】

As imagens são compostas por muitos pixels. Se você usar 0 para representar preto, 255 para representar branco e valores entre 0 e 255 representarem diferentes graus de cinza, você pode usar um byte para expressar um pixel (o intervalo de valores é decimal 0-255 e hexadecimal 00-FF ). Uma imagem composta por tais pixels é chamada de imagem em tons de cinza de 256 níveis.

Agora queremos compactar a imagem em tons de cinza de 256 níveis em tons de cinza de 16 níveis, ou seja, a faixa de valores de cada pixel é decimal 0-15 e hexadecimal 0-F. A regra de compactação é: conte o número de cada escala de cinza e pegue as 16 principais escalas de cinza com o maior número (se o número de uma determinada escala de cinza for igual ao número de outra escala de cinza, então os valores da escala de cinza ​estão em ordem crescente), numerados OF respectivamente (o número mais alto é 0 e assim por diante). Converta outras escalas de cinza em uma das 16 escalas de cinza mais próximas. Subtraia o número da escala de cinza em um determinado ponto de uma das 16 escalas de cinza. O menor valor absoluto é o mais próximo. Se os valores absolutos forem iguais, o número menor é A escala de cinza está mais próxima .

[Insira a descrição]

A primeira linha de entrada é um número inteiro positivo N, o que significa que existem N linhas de dados para formar uma imagem em tons de cinza de 256 níveis. Concorda-se que 10<=N<=20.

N linhas começando na linha 2, cada linha é uma string de igual comprimento e um número par, e cada dois caracteres representam um pixel em hexadecimal.

É acordado que a imagem em tons de cinza de entrada possui pelo menos 16 tons de cinza. Combine um máximo de 20 pixels por linha.

[Descrição da saída]

A primeira linha gera a codificação hexadecimal das 16 escalas de cinza selecionadas para compactação, totalizando 32 caracteres.

As N linhas começando na segunda linha geram a imagem compactada. Cada pixel possui um número hexadecimal que representa o valor da escala de cinza compactado.

[Amostra de entrada 1]

10

00FFCFAB00FFAC09071B5CCFAB76

00AFCBAB11FFAB09981D34CFAF56

01BFCEAB00FFAC0907F25FCFBA65

10FBCBAB11FFAB09981DF4CFCA67

00FFCBFBFFAC0987A25CCFFC76

00FFCBAB1CFFCB09FC1AC4CFCF67

01FCCBAB00FFACF71A54CFBA65

10EFCBAB11FFAB09981B34CFCF67

01FFCBAB00FFAC0F071054CFAC76

1000CBAB11FFAB0A981884CFCF66

[Exemplo de saída 1]

ABCFFF00CB09AC0710119801186776FC

321032657CD10E

36409205ACC16D

B41032657FD16D

8F409205ACF14D

324F326570D1FE

3240C245FC411D

BF4032687CD16D

8F409205ACC11D

B240326878D16E

83409205ACE11D

[Explicação da amostra 1] Tons de cinza AB.CF e FF aparecem 14 vezes, 00 aparece 9 vezes, CB aparece 9 vezes, 09 aparece 7 vezes, AC aparece 6 vezes, 07 aparece 5 vezes, 10.11 e 98 aparecem 4 vezes, 01.1 B .67,76 e FC aparecem 3 vezes.

Resposta de referência:

#include <iostream>
#include <cstring>
using namespace std;
int image[20][20];
int cpimg[20][20];
int his[256];
int color[16];

//一位十六进制字符转换为数字
int trans(char a){
	if(a <= '9')
		return (a - '0');
	return (a - 'A' +10);
}

//一位十六进制字符转换为字符
char itrans(int n){
	if(n >= 10)
		return (char)(n -10 + 'A');
	return (char)(n + '0');
}

//寻找离C最近的灰阶
int compress(int c){
	int dis = 256, res =-1;
	for(int i =0;i < 16; i++){
		int d = c - color[i];
		if(d<0)
			d = -d;
		if(d < dis){
			dis = d;
			res = i;
		}
	}
	return res;
}

int main(){
	int N =0,M=0;
	cin >> N;
	//灰阶计数,初始化为-1
	for(int i=0;i<256;i++)
		his[i] = -1

	//输入图像,并对灰阶计数
	for(int i=0; i<N; i++){
		char line[50];
		cin >> line;
		M = strlen(line) / 2;
		for(int j =0;j<M;j++){
			int c = trans(line[j * 2]) * 16 + trans(line[j * 2 + 1]);
			image[i][j] = c;
			his[c]++;
		}
	}

	//选出出现次数最多的16个灰阶
	for(int c=0; c<16;c++){
		int max = 0, max_id = -1;
		for(int i=0; i<256;i++)
			if(his[i] > max){
				max = his[i];
				max_id = i;
			}
		color[c] = max_id;
		his[max_id] = -1;		
	}

	//讲image的灰阶压缩为cpimg
	for(int i=0;i<N;i++)
		for(int j=0; j<M;j++)
			cpimg[i][j] =compress(image[i][j]);

	//输出选取的16个灰阶
	for(int c=0;c<16;c++)
		cout << itrans(color[c] / 16) << itrans(color[c] % 16);
	cout << endl;

	//输入压缩后图像
	for(int i = 0; i< N; i++){
		for(int j=0; j<M; j++)
			cout << itrans(cpimg[i][j]);
		cout << endl;
	}
	return 0;
}

Acho que você gosta

Origin blog.csdn.net/m0_46227121/article/details/131304539
Recomendado
Clasificación