Skip to content

Latest commit

 

History

History
727 lines (568 loc) · 27.7 KB

README.md

File metadata and controls

727 lines (568 loc) · 27.7 KB

Introdução a Algoritmos

Componentes de algoritmos. Variáveis. Sistema de numeração. Tipos de dados. Declaração de Variáveis.

Quais são os elementos básicos de um algoritmo? Os elementos básicos de um algoritmo incluem variáveis, operadores, expressões, estruturas de controle e comentários.

Defina dados. Dados são informações que podem ser processadas por um programa de computador.

Quais as principais estruturas que podem compor um algoritmo? As principais estruturas que podem compor um algoritmo são sequência, seleção (como if/else) e repetição (como while/for).

O que são operadores? Operadores são símbolos que representam uma operação a ser realizada em um ou mais operandos.

Qual a função dos comentários em um código? A função dos comentários em um código é fornecer explicações e informações adicionais para ajudar os desenvolvedores a entender o que o código está fazendo.

Quais as outras estratégias para aumentar a legibilidade de um código? Outras estratégias para aumentar a legibilidade de um código incluem usar nomes descritivos para variáveis e funções, manter o código bem organizado e seguir convenções de estilo de codificação.

O que são variáveis? Variáveis são espaços de armazenamento na memória do computador que podem conter valores.

Qual a importância do tipo de dado usado em um programa? O tipo de dado usado em um programa é importante porque determina como os dados serão armazenados na memória e como serão tratados pelo programa.

O que são sistemas numéricos Sistemas numéricos são sistemas de representação de números. Os sistemas numéricos comuns incluem decimal, binário, octal e hexadecimal.

Qual(is) é(são) o(s) sistema(s) numérico(s) utilizado(s) pelo(s) computador(es)? Os computadores geralmente utilizam os sistemas numéricos binário e hexadecimal.

É possível representar um dado, originalmente representado no sistema numérico decimal, em outro sistema numérico? Sim, é possível representar um dado originalmente representado no sistema numérico decimal em outro sistema numérico, como binário, octal ou hexadecimal.

É possível realizar operações aritméticas em dados representados em outro sistema numérico que não seja o decimal? Sim, é possível realizar operações aritméticas em dados representados em sistemas numéricos diferentes do decimal, desde que os operadores sejam aplicados corretamente.

O que pode interferir nos tipos de dados disponibilizados por uma linguagem de programação? Os tipos de dados disponíveis em uma linguagem de programação podem ser limitados por fatores como a arquitetura do computador, as bibliotecas disponíveis e as escolhas de design da linguagem.

Descreva dois tipos de dados fundamentais indicando suas principais características. Dois tipos de dados fundamentais são inteiros e pontos flutuantes. Inteiros são números inteiros (sem parte fracionária) e pontos flutuantes são números reais (com parte fracionária).

Descreva dois tipos de dados fundamentais, diferentes daqueles apresentados na questão anterior, indicando suas principais características. Dois outros tipos de dados fundamentais são caracteres e booleanos. Caracteres representam símbolos individuais (como letras e números) e booleanos representam valores verdadeiros ou falsos.

O que são ponteiros? Ponteiros são variáveis que armazenam endereços de memória em vez de valores.

Quais as informações mínimas necessárias para a declaração de uma variável? Para declarar uma variável, é necessário fornecer seu tipo e um nome descritivo.

Como inicializar ou alterar o valor de uma variável? O valor de uma variável pode ser inicializado ou alterado atribuindo um valor a ela usando o operador de atribuição (=).

O que é uma constante e qual sua importância? Uma constante é um valor que não pode ser alterado durante a execução do programa. Sua importância está na garantia da consistência dos dados.

Qual a diferença entre tipificação forte e tipificação fraca? Tipificação forte significa que as variáveis têm um tipo de dado definido e não podem ser usadas de maneira incompatível com esse tipo. Tipificação fraca significa que as variáveis podem ser usadas de maneira mais flexível, com coerção automática de tipo, por exemplo.

O que são identificadores de variáveis? Descreva um cuidado que se deve ter ao definir um identificador. Identificadores de variáveis são nomes que representam variáveis. É importante escolher identificadores descritivos e seguir as convenções de nomenclatura da linguagem de programação.

Que cuidados devem ser tomados ao se utilizar ponteiros? Ao utilizar ponteiros, é importante tomar cuidado para garantir que eles apontem

Operadores, Entrada e Saída de dados, Estrutura Sequencial. Arquivos.

Como é feita a associação de um valor a uma variável? A associação de um valor a uma variável é feita através do operador de atribuição "=" em linguagens de programação. A variável é o identificador que representa um espaço na memória do computador onde o valor será armazenado.

O que pode ser usado à direita de um operador de atribuição? À direita do operador de atribuição podem ser usados constantes, variáveis, expressões ou funções que retornem um valor compatível com o tipo da variável.

Descreva dois cuidados a serem tomados para que uma atribuição possa ser realizada. Dois cuidados importantes a serem tomados ao realizar uma atribuição são: garantir que a variável esteja declarada e inicializada antes de ser utilizada, e verificar se o tipo do valor a ser atribuído é compatível com o tipo da variável.

O que acontece quando um valor em ponto flutuante é associado a uma variável do tipo inteiro? Quando um valor em ponto flutuante é associado a uma variável do tipo inteiro, o valor é truncado para o próximo inteiro mais próximo. Por exemplo, 3.7 seria truncado para 3.

O que acontece quando um valor inteiro é associado a uma variável do tipo float? Quando um valor inteiro é associado a uma variável do tipo float, o valor é convertido em um ponto flutuante, mantendo sua precisão. Por exemplo, 3 seria convertido em 3.0.

O que acontece quando um valor qualquer é associado a uma variável já inicializada? Quando um valor é associado a uma variável já inicializada, o valor anterior é substituído pelo novo valor.

O que acontece quando uma variável é utilizada em ambos os lados do operador de atribuição? Quando uma variável é utilizada em ambos os lados do operador de atribuição, o resultado pode ser imprevisível, dependendo do contexto em que é utilizado. É importante evitar esse tipo de operação.

Quais são os operadores aritméticos? Qual a precedência entre eles? Os operadores aritméticos são: + (adição), - (subtração), * (multiplicação), / (divisão) e % (resto da divisão). A precedência segue da matemática.

Qual a importância da observação da precedência entre operadores? A observação da precedência entre operadores é importante para garantir que as operações sejam realizadas na ordem correta e o resultado seja o esperado.

Qual o valor de X resultante da operação X = 7 / 2 ? O valor resultante de X = 7 / 2 seria 3.

O que precisa ser feito para garantir que o valor correto seja obtido? Para garantir que o valor correto seja obtido, pode utilizar um casting para forçar a conversão do resultado para o tipo desejado. Por exemplo: X = (float) (7 / 2) resultaria em X = 3.5. Ou pode utilizar 7 / 2.0

Como pode ser feita a combinação entre operadores aritméticos e o operador de atribuição? A combinação entre operadores aritméticos e o operador de atribuição é realizada através de operadores compostos, como +=,*= e /=. Por exemplo, X += 5 é equivalente a X = X + 5.

Cite os meios através dos quais um programa pode receber dados a serem processados. Um programa pode receber dados a serem processados através de entrada padrão (teclado), arquivos, dispositivos de rede ou outros dispositivos de entrada específicos.

Cite os meios através dos quais um programa pode apresentar os dados resultantes. Um programa pode apresentar os dados resultantes através de saída padrão (tela), arquivos, dispositivos de rede ou outros dispositivos de saída específicos.

Qual o conteúdo da biblioteca cmath? A biblioteca cmath é utilizada para realizar operações matemáticas mais avançadas, como funções trigonométricas e logarítmicas.

Cite uma vantagem do uso de arquivos. Uma vantagem do uso de arquivos é a possibilidade de armazenar dados permanentemente em um dispositivo de armazenamento secundário, como um disco rígido, mesmo após o término da execução do programa.

Qual biblioteca deve ser incluída para manipulação de arquivos? A biblioteca para manipulação de arquivos em C++ é a fstream.

O que faz a instrução ofstream arquivo ("musica.txt"); ? A instrução ofstream arquivo ("musica.txt") cria um objeto do tipo ofstream (output file stream

O que faz a instrução ifstream arquivo ("musica.txt"); ? A instrução ifstream arquivo ("musica.txt"); cria um objeto do tipo ifstream (input file stream) que permite a leitura de um arquivo de texto chamado "musica.txt". Ou seja, essa instrução abre o arquivo "musica.txt" para leitura e cria um objeto "arquivo" que pode ser usado para ler os dados armazenados no arquivo.

Qual é a diferença entre uma string e um vetor de caracteres?

A diferença entre uma string e um vetor de caracteres está na forma como são tratados. Uma string é um tipo de dado especial em C/C++ que é tratado como uma sequência de caracteres terminada por um caractere nulo (\0). Um vetor de caracteres, por outro lado, é apenas uma sequência de caracteres sem nenhum tratamento especial.


Para que servem as funções length(), size() e strlen()?

As funções length(), size() e strlen() servem para obter o tamanho de uma string ou vetor de caracteres. A função length() é usada para obter o tamanho de uma string no C++, ela retorna o número de caracteres na string, excluindo o caractere nulo (\0). A função size() é usada para obter o tamanho de um vetor, ela retorna o número de elementos no vetor. A função strlen() é usada para obter o comprimento de uma string em C, ela retorna o número de caracteres na string, excluindo o caractere nulo (\0).


Qual é o tipo de retorno dessa funções?

A função length() retorna um valor do tipo size_t, a função size() retorna um valor do tipo size_t e a função strlen() retorna um valor do tipo size_t.


Para que é utilizada a função getline()?

A função getline() é utilizada para ler uma linha inteira de entrada, incluindo espaços em branco, e armazená-la em uma string. Ela é especialmente útil quando se deseja ler uma linha inteira de texto digitada pelo usuário.


Qual é a diferença no uso de getline() com string e com vetor de caracteres?

A diferença no uso da função getline() com string e vetor de caracteres está na forma como os dados são armazenados. Quando usada com uma string (do tipo std::string), a função getline() armazena a linha lida diretamente na string. Já quando usada com um vetor de caracteres, é necessário fornecer o tamanho máximo do vetor como parâmetro e a função armazena a linha lida no vetor, limitando o número de caracteres ao tamanho máximo especificado.


Quando é necessário utilizar cin.ignore()?

A função cin.ignore() é utilizada para descartar caracteres indesejados do buffer de entrada. Ela é comumente usada após a leitura de dados numéricos usando cin, para descartar caracteres extras (como espaços em branco, novas linhas) que possam interferir na próxima leitura.


O que é uma matriz em C/C++?

Uma matriz em C/C++ é uma estrutura de dados bidimensional que consiste em uma coleção de elementos organizados em linhas e colunas.


Como se declara uma matriz?

Para declarar uma matriz em C/C++, você precisa especificar o tipo dos elementos da matriz e o tamanho das dimensões. A sintaxe geral é: tipo nome_da_matriz[linha][coluna];


É possível ter uma matriz de string?

Sim, é possível ter uma matriz de string em C/C++. Para isso, você precisa declarar uma matriz de ponteiros para char (ou seja, um vetor de strings) e alocar memória para cada string individualmente.


É possível percorrer os índices de uma matriz usando o incremento de um ponteiro?

Sim, é possível percorrer os índices de uma matriz usando o incremento de um ponteiro. Em C++, uma matriz é armazenada em memória como um bloco contíguo de elementos.


Modularização e passagem de parâmetros


O que é modularização? A modularização é o processo de dividir um programa em módulos independentes e interconectados. Cada módulo é responsável por uma tarefa específica e pode ser desenvolvido e mantido separadamente. Isso facilita a compreensão, o desenvolvimento e a manutenção do código.

Quais são os tipos de retorno que um módulo pode ter? Os tipos de retorno que um módulo pode ter são: Void: indica que o módulo não retorna nenhum valor. Tipos primitivos (como int, float, double, etc.): o módulo retorna um valor do tipo especificado. Objetos ou estruturas definidas pelo usuário: o módulo retorna um objeto ou uma estrutura personalizada.

Explique do se trata o escopo de variáveis? O escopo de variáveis se refere à região do código em que uma variável é visível e pode ser acessada. Em C++, existem três principais escopos de variáveis: Escopo global: as variáveis declaradas fora de qualquer função ou bloco são globais e podem ser acessadas por todo o programa. Escopo local: as variáveis declaradas dentro de uma função ou bloco são locais e só podem ser acessadas dentro desse escopo específico. Escopo de bloco: as variáveis declaradas dentro de um bloco delimitado por chaves ({}) só podem ser acessadas dentro desse bloco. Uma variável local é declarada dentro de uma função ou bloco e só é visível e acessível dentro desse escopo específico. Ela é criada quando a função é chamada ou o bloco é executado e é destruída quando a função ou o bloco é encerrado.

Explique o que é variável local e variável global. Uma variável global é declarada fora de qualquer função ou bloco e pode ser acessada por todo o programa. Ela existe durante toda a execução do programa. Uma função é um bloco de código que realiza uma tarefa específica e pode retornar um valor. Ela pode receber parâmetros como entrada e retornar um resultado.

Explique a diferença entre função e procedimento. Uma função é um bloco de código que realiza uma tarefa específica e pode retornar um valor. Ela pode receber parâmetros como entrada e retornar um resultado. Um procedimento, também conhecido como sub-rotina, é um bloco de código que realiza uma tarefa específica, mas não retorna um valor. Ele também pode receber parâmetros como entrada, mas não possui um valor de retorno.

O que são parâmetros formais? Parâmetros formais são as variáveis declaradas na definição de um subprograma (função ou procedimento) que são utilizadas para receber os valores passados como argumentos quando o subprograma é chamado. Eles são como "placeholders" para os valores reais que serão passados durante a chamada.

O que são parâmetros reais? Parâmetros reais são os valores ou expressões passados como argumentos durante a chamada de um subprograma. Esses valores são atribuídos aos parâmetros formais correspondentes no momento da chamada.

O que é passagem de parâmetros? A passagem de parâmetros é o mecanismo pelo qual os valores ou referências de variáveis são passados para um subprograma (como uma função ou procedimento) quando ele é chamado. Isso permite que os subprogramas utilizem os valores passados como argumentos para realizar suas operações.

Utilizando o código abaixo, explique quais os passos que ocorrem quando um subprograma é chamado?
    int soma (int a, int b) {
        return a+b;
    }
    int main(){
    int a,b;
    cin>>a>>b;
    cout<<soma(a,b);
    return 0;
    }

No código fornecido, os seguintes passos ocorrem quando o subprograma "soma" é chamado: a. O programa principal solicita a entrada de dois valores inteiros (variáveis "a" e "b") do usuário. b. O programa principal chama o subprograma "soma" passando os valores de "a" e "b" como argumentos. c. O subprograma "soma" recebe os valores dos parâmetros "a" e "b" e os utiliza para realizar a operação de soma. d. O resultado da soma é retornado pelo subprograma "soma". e. O programa principal imprime o resultado retornado pelo subprograma "soma" usando a função "cout".


Para que serve o comando return? O comando return é utilizado para retornar um valor de um subprograma de volta para o ponto de chamada. Ele também pode ser usado para encerrar precocemente a execução de um subprograma.

Um subprograma pode não ter retorno de valor? Sim, um subprograma pode não ter retorno de valor. Nesse caso, ele é chamado de procedimento. Um procedimento realiza ações sem retornar um valor específico.

É possível retornar duas informações pela instrução return? Exemplo, return a, b; No C++, não é possível retornar várias informações diretamente pela instrução return. Para retornar múltiplos valores, podem ser usados ponteiros ou referências, ou uma estrutura de dados (como uma struct ou uma classe) pode ser definida para armazenar os valores a serem retornados.

Subprograma para calcular o quociente inteiro de dois números sem usar a divisão (/) ou o operador resto (%):
int quocienteInteiro(int dividendo, int divisor) {
 int quociente = 0;
 while (dividendo >= divisor) {
  dividendo -= divisor;
  quociente++;
 }
 return quociente;
}

Explique com um exemplo o que é passagem de parâmetros por valor. A passagem de parâmetros por valor ocorre quando o valor de uma variável é copiado e passado como argumento para um subprograma. Qualquer alteração feita no valor do parâmetro dentro do subprograma não afetará a variável original. Exemplo:
void dobrarValor(int x) {
 x *= 2;
}

int main() {
 int num = 5;
 dobrarValor(num);
 cout << num;  // O valor impresso será 5, pois o valor de 'num' não foi alterado dentro do subprograma.
 return 0;
}

Explique com um exemplo o que é passagem de parâmetros por referência. A passagem de parâmetros por referência ocorre quando o endereço de memória de uma variável é passado como argumento para um subprograma. Qualquer alteração feita no valor do parâmetro dentro do subprograma afetará diretamente a variável original. Exemplo:
void dobrarValor(int& x) {
 x *= 2;
}

int main() {
 int num = 5;
 dobrarValor(num);
 cout << num;  // O valor impresso será 10, pois o valor de 'num' foi alterado dentro do subprograma.
 return 0;
}

Registros e vetores de registros

1. O que é um registro?

Um registro é uma estrutura de dados que permite armazenar diferentes tipos de informações relacionadas em um único objeto. Ele pode ser visto como uma coleção de campos ou variáveis, onde cada campo contém um valor específico e possui um nome para identificá-lo.

2. Qual tipo de dado pode ser usado para a criação de um registro? Para a criação de um registro, é possível utilizar diferentes tipos de dados, como números inteiros, números de ponto flutuante, caracteres, strings, booleanos, entre outros. É importante escolher o tipo de dado mais adequado para cada campo do registro, dependendo das necessidades do sistema.
3. Qual(is) a(s) vantagem(ns) do uso de registros? De que outro modo os problemas poderiam ser resolvidos? As vantagens do uso de registros incluem:

Organização e estruturação dos dados: registros permitem agrupar informações relacionadas em uma única estrutura, facilitando o acesso e a manipulação dos dados. Facilidade de leitura e compreensão: registros fornecem um formato claro e intuitivo para armazenar informações, o que facilita a compreensão do significado dos campos. Melhor eficiência em operações de busca e filtragem: registros podem ser utilizados para buscar ou filtrar informações com base em determinados critérios, o que pode ser mais eficiente do que percorrer uma lista de dados não estruturados. Os problemas também poderiam ser resolvidos de outras formas, como utilizando listas ou arrays separados para cada campo dos registros. No entanto, isso pode levar a uma estrutura mais complexa e dificultar a organização e manipulação dos dados.

4. Considere que você precisa armazenar os seguintes dados sobre filmes: Título, categoria, ano de lançamento, tempo de duração (em minutos). Como ficaria a definição de um registro para armazenar esses dados? A definição de um registro para armazenar os dados sobre filmes seria:
struct Filme {
    char titulo[50];
    char categoria[20];
    int anoLançamento;
    int duraçãoMinutos;
};
5. Considere os dados representados abaixo, faça: declare uma struct para representar os dados. declare um vetor para armazenar os dados e escreva um trecho de programa para preencher o vetor. um subprograma que retorna a posição do carro mais antigo. um subprograma que retorna o total de carros de uma cor que será informada pelo usuário. A cor a ser procurada deve ser um dos parâmetros do subprograma. um subprograma que retorna o total de carros que possuem ar condicionado e tem produção a partir do ano de 2010.

0 1 2 3 4

cor: preto ano: 2018 marca: fiat ar: sim

azul 2010 Volkswagen sim

branco 1990 ford nao

amarelo 1985 Chevrolet nao

preto 2020 Mercedes sim

Para representar os dados fornecidos, podemos utilizar a seguinte definição de struct:

struct Carro {
    char cor[20];
    int ano;
    char marca[20];
    char arCondicionado[4];
};

6. Para a representação gráfica dada a seguir, faça: Pessoa contém: nome cpf estado civil sexo endereço
struct Carro carros[5];

carros[0].cor = "preto";
carros[0].ano = 2018;
carros[0].marca = "fiat";
carros[0].arCondicionado = "sim";

carros[1].cor = "azul";
carros[1].ano = 2010;
carros[1].marca = "Volkswagen";
carros[1].arCondicionado = "sim";

carros[2].cor = "branco";
carros[2].ano = 1990;
carros[2].marca = "ford";
carros[2].arCondicionado = "nao";

carros[3].cor = "amarelo";
carros[3].ano = 1985;
carros[3].marca = "Chevrolet";
carros[3].arCondicionado = "nao";

carros[4].cor = "preto";
carros[4].ano = 2020;
carros[4].marca = "Mercedes";
carros[4].arCondicionado = "sim";

7. O Endereço é composto de: rua número bairro cep cidade

a) defina a estrutura para representar Pessoa e Endereço. b) crie um vetor de Pessoa com capacidade para 5 elementos. Construa um trecho de código que permita leitura dos dados de entrada de um único elemento, mantendo o controle das posições ocupadas. c) crie um subprograma que retorna o total de pessoas que moram em uma cidade cujo o nome será informado pelo usuário.

    struct Pessoa {
        char nome[50];
        char cpf[12];
        char estadoCivil[20];
        char sexo[10];
        struct Endereço endereço;
    };

    struct Endereço {
        char rua[50];
        int numero;
        char bairro[30];
        char cep[10];
        char cidade[30];
    };

    struct Pessoa {
        char nome[50];
        char cpf[12];
        char estadoCivil[20];
        char sexo[10];
        struct Endereço endereço;
    };

    struct Endereço {
        char rua[50];
        int numero;
        char bairro[30];
        char cep[10];
        char cidade[30];
    };

    struct Pessoa pessoas[5];
    int posiçãoOcupada = 0;

    if (posiçãoOcupada < 5) {
        printf("Digite o nome: ");
        scanf("%s", pessoas[posiçãoOcupada].nome);

        printf("Digite o CPF: ");
        scanf("%s", pessoas[posiçãoOcupada].cpf);

        printf("Digite o estado civil: ");
        scanf("%s", pessoas[posiçãoOcupada].estadoCivil);

        printf("Digite o sexo: ");
        scanf("%s", pessoas[posiçãoOcupada].sexo);

        printf("Digite a rua: ");
        scanf("%s", pessoas[posiçãoOcupada].endereço.rua);

        printf("Digite o número: ");
        scanf("%d", &pessoas[posiçãoOcupada].endereço.numero);

        printf("Digite o bairro: ");
        scanf("%s", pessoas[posiçãoOcupada].endereço.bairro);

        printf("Digite o CEP: ");
        scanf("%s", pessoas[posiçãoOcupada].endereço.cep);

        printf("Digite a cidade: ");
        scanf("%s", pessoas[posiçãoOcupada].endereço.cidade);

        posiçãoOcupada++;
    } else {
        printf("O vetor de Pessoa está cheio.\n");
    }