Linguagem C
UnB-\(\gamma\)

Table of Contents

1. Preâmbulo

Este é um material em construção a respeito de dicas e material sobre a Linguagem C.

Nesta página você encontrará links para vídeos e materiais de ajuda, bem como exercícios relacionado ao conteúdo.

Este material começou a ser feito e por isso será atualizado constantemente.

Tenho disponibilizado vários materiais em meu canal no YouTube, por favor, considere assinar o canal e deixar o joinha :)

2. SCANF

O SCANF é uma poderosa função capaz de ler dados da entrada padrão (e de outros arquivos com suas aliases como fscanf(3).

Na série Detonando o SCANF temos, além do uso básico da função abordo algumas curiosidades sobre as funções.

3. Strings em C

Aqui um apanhando geral em como se manipula strings na linguagem C. Em uma série que chamei de "Umas Palavras sobre String"

4. Ponteiros

Segue abaixo a playlist da revisão de ponteiros no Youtube. Por ora são 5 vídeos que exploram o que é necessário saber para a disciplina de EDA-2.

4.1. Introdução

4.1.1. Exercícios

  • Responda as perguntas abaixo. Se achar necessário, faça testes no computador.
    • Explique a diferença entre
      • p++;
      • (*p)++;
      • *(p++);
    • O que quer dizer *(p+10);?
    • Explique o que você entendeu da comparação entre ponteiros
  • Qual o valor de y no final do programa? Tente primeiro descobrir e depois verifique no computador o resultado.

    int main(void)
    {
      int y, *p, x;
      y = 0;
      p = &y;
      x = *p;
      x = 4;
      (*p)++;
      x­­;
      (*p) += x;
      printf ("y = %d\n", y);
      return 0;
    }
    
  • Diga quais expressões abaixo são válidas ou não. Considere as declarações:

    int vetor[10];
    int *ponteiro;
    
    • vetor = vetor +2;
    • vetor++;
    • vetor = ponteiro;
    • ponteiro = vetor;
    • ponteiro = vetor+2;
  • Explique o que faz o programa abaixo

    int main(void){
      float vet[5] = {1.1,2.2,3.3,4.4,5.5};
      float *f;
      int i;
      f = vet;
      printf("contador/valor/valor/endereco/endereco\n");
      for(i = 0 ; i <= 4 ; i++){
        printf("i = %d",i);
        printf("   vet[%d] = %.1f",i, vet[i]);
        printf("   *(f + %d) = %.1f",i, *(f+i));
        printf("   &vet[%d] = %X",i, &vet[i]);
        printf("   (f + %d) = %X\n",i, f+i);
      }
      return 0;
    }
    
  • Assumindo que M1[] é um vetor do tipo int, quais das seguintes expressões referenciam o valor do terceiro elemento de M1?
    1. *(M1 + 2)
    2. *(M1 + 4)
    3. M1 + 4
    4. M1 + 2
  • Seja vet um vetor de 4 elementos: TIPO vet[4]. Supor que depois da declaração, vet esteja armazenado no endereço de memória 4092 (ou seja, o endereço de vet[0]). Supor também que na máquina usada uma variável do tipo char ocupa 1 byte, do tipo int ocupa 2 bytes, do tipo float ocupa 4 bytes e do tipo double ocupa 8 bytes.
    • Qual o valor de vet+1, vet+2 e vet+3 se:
      1. vet for declarado como char?
      2. vet for declarado como int?
      3. vet for declarado como float?
      4. vet for declarado como double?
  • Verifique o programa abaixo. Encontre o seu erro e corrija­o para que escreva o numero \(10\) na tela.

    #include <stdio.h>
    int main(void)
    {
      int x, *p, **q;
      p = &x;
      q = &p;
      x = 10;
      printf("%d\n", &q);
      return 0;
    }
    
  • Exercícios inspirados da lista http://www.inf.ufes.br/~santos/files/active/0/lista-3.pdf

4.2. Alocação de Memória

4.2.1. Exercícios

  • Resolva os exercícios de http://www.ime.usp.br/~pf/algoritmos/aulas/aloca.html
  • Faça uma rotina que aloque memória dinamicamente e atribua o endereço alocado à uma variável pt. Em seguida mostre no monitor o endereço alocado (use %p, de pointer).
    • Coloque a linha de alocação e impressão dentro de um for e observe:
      • os endereçoes alocados;
      • o estouro de memória disponível quanto pt=0
  • Escreva um programa que leia da entrada padrão um vetor de notas (números reais) e imprima a média aritmética das notas. Importante: Não deve ocorrer desperdício de memória; e após ser utilizada a memória deve ser devolvida.
  • Escreva um programa que calcule a soma de duas matrizes MxN de números reais (double). A implementação deste programa deve considerar as dimensões fornecidas pela entrada padrão. (Dica: aloque a matriz usando alocação dinâmica de memória).
  • Implemente uma função concat() que concatena 2 (dois) strings recebidos como argumentos. A função deve retornar um ponteiro para o string resultante da concatenação. O espaço para o resultado deve ser alocado dinamicamente pela função. Use ponteiros o máximo possível.
  • O programa matsoma01.c calcula a soma de duas matrizes 5x5 de números reais (double). Mude a implementação deste programa de forma que a dimensão da matriz seja fornecida pelo usuário na linha de comando e que a matriz seja representada no programa através de variáveis do tipo double **, usando alocação dinâmica de memória.

Author: Bruno Ribas

Created: 2022-11-03 Thu 09:32

Validate