PRG29002 - Programação I - Eng.Telecom 2019-1

De MediaWiki do Campus São José
Ir para: navegação, pesquisa

Índice

PROFESSOR

Professor: Tiago Semprebom
Email: tisemp@ifsc.edu.br
diretório web:: tele.sj.ifsc.edu.br/~tisemp

IMPORTANTE: o direito de recuperar uma avaliação em que se faltou somente existe mediante justificativa reconhecida pela coordenação. Assim, deve-se protocolar a justificativa no prazo de 48 horas, contando da data e horário da avaliação, e aguardar o parecer da coordenação. O não cumprimento desse procedimento implica a impossibilidade de fazer a recuperação, e assim a reprovação na disciplina.

ATENDIMENTO PARALELO

SEGUNDA: 14h:30 às 15h35 QUINTA: 11h:00 às 12h:00.

LOCAL: Sala 2 de Professores de Telecomunicações.

MONITORIA

  • Aluno(a): Sarom da Silva Torres
  • e-mail: sarom.t@aluno.ifsc.edu.br
  • Horários:

Segunda-feira: 13:30 - 15:30
Terça-feira: 13:30 - 16:30
Quarta-feira: 13:00 - 16:00
Quinta-feira: 16:00 - 17:30
Sexta-feira: 11:30 - 14:00

  • Local de Atendimento: Sala de monitoria (ao lado do banheiro masculino do térreo).

Links Interessantes

Introdução a algoritmos - 13/02/2019

Objetivos

  • Apresentação do Plano de Ensino;
  • Introdução a Fluxograma e pseudocódigo.

Material de Referência

Aula Introdutória sobre Lógica de Programação

Introdução: fluxogramas e pseudocódigo - 15/02/2019

Objetivos

  • Introdução a Fluxograma e pseudocódigo.
  • Estruturas de Decisão

Material de Referência

Lógica de Programação: Estruturas de Decisão

Fluxograma e pseudocódigo: Estruturas de decisão - 20/02/2019

Objetivos

  • Introdução a Fluxograma e pseudocódigo.
  • Estruturas de Decisão

Material de Referência

Lógica de Programação: Estruturas de Repetição

Introdução à linguagem C - 22/02/2019

Objetivos

O aluno devera ser capaz de:

descrever o processo de compilação;
diferenciar código fonte, objeto e executável;
compilar, executar pequenos programa em C usando o gcc;
declarar e usar variáveis locais inteiras e reais;
usar as funções de entrada e saída: scanf() e printf.

Material de Referência

Introdução a Programação C

TAREFA

Programação C: estruturas de decisão - 27/02/2019

Objetivos

O aluno deverá ser capaz de:

Utilizar os operadores relacionais e lógicos na programação C
um pouco mais sobre variáveis: tipo char
Utilizar o comando de decisão if else
Utilizar o comando switch

Material e Referência

https://wiki.sj.ifsc.edu.br/index.php/AULA_5_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

Programação C: estruturas de decisão - 01/03/2019

  • Continuação da aula anterior.

Objetivos

O aluno deverá ser capaz de:

Utilizar os operadores relacionais e lógicos na programação C
um pouco mais sobre variáveis: tipo char
Utilizar o comando de decisão if else
Utilizar o comando switch

Material e Referência

https://wiki.sj.ifsc.edu.br/index.php/AULA_5_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

Programação C: estruturas de decisão - 06/03/2019

  • Quarta-feira de cinzas - aula a partir das 14h.
  • Resolução de exercícios

Programação C: estruturas de repetição - 08/03/2019

Objetivos

  • Estruturas de Repetição

Material e Referência

https://wiki.sj.ifsc.edu.br/index.php/AULA_6_-_Programa%C3%A7%C3%A3o_1_-_Engenharia


Programação C: estruturas de repetição (resolução exercícios) - 13/03/2019

Objetivos

  • Resolução de exercícios de fixação sobre estruturas de repetição.

Programação C: estruturas de repetição - 15/03/2019

Objetivos

  • Estruturas de Repetição: break, loop
  • Uso de biblioteca matemática;
  • Uso do Nemiver

Material e Referência

https://wiki.sj.ifsc.edu.br/index.php/AULA_6_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

20/03/2019: Estruturas de Repetição (Prof. Eraldo)

Objetivos

  • Estruturas de Repetição: lista de exercícios de preparação para avaliação proposta no SIGAA

Material e Referência

https://wiki.sj.ifsc.edu.br/index.php/AULA_6_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

Avaliação 1 - 22/03/2019

  • Avaliação 1 - Laboratório de Programação.

Resolução Avaliação 1 (vista de prova) - 27/03/2019

  • Correção da Avaliação 1
  • Enviar os exercícios resolvidos por e-mail: tisemp@ifsc.edu.br

Arranjos unidimensionais - 29/03/2019

  • Vetores (arranjos unidimensionais).

Material de Referência

Vetores e Strings - 03/04/2019

Objetivos

  • Continuação Vetores e Strings
  • Funções

Material de Referência

https://wiki.sj.ifsc.edu.br/index.php/AULA_8_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

Recuperação Avaliação 1 - 05/04/2019

  • Recuperação da Avaliação 1 -

Funções - 10/04/19

Objetivos

  • Correção da Recuperação (Alternativas)
  • Funções e parâmetros
  • Variáveis Locais e Globais

Material de Referência

Vetores: continuação (int, float, etc) - 12/04/19

Objetivos

  • Vetores de inteiros, floats etc (arranjos unidimensionais)

Material de Referência

Matrizes - 17/04/19

Objetivos

  • Definindo matrizes no C
  • Operações com matrizes e passagem de parâmetros tipo matriz
  • Matrizes com caracteres


Material de Referência

Matrizes (cont) - 24/04/19

Objetivos

Material de Referência

Exercícios de Preparação para Avaliação 2 - 26/04/2019

Exercício 1

Elaborar uma função que recebe como parâmetro um vetor contendo uma string e um vetor com dados não identificados.

  • A função deve copiar a string do primeiro vetor para o segundo, invertendo a mesma.
  • A função também deve retornar a quantidade de caracteres 'i' na string. Exemplo:
#include <stdio.h>

int  copiar_string(char vet1[100], char vet2[100])
{
  /* implementar aqui */
}

main()
{
  char aux1[100]="ifsc", aux2[100]="instituto",aux3[100];
  int len;

  len=copiar_string(aux1,aux3);
  printf("%s %d\n", aux3,len);
  len=copiar_string(aux2,aux3);
  printf("%s %d\n", aux3,len);
}

A saída deve ser:

 csfi 1
 otutitsni 2
Solução exercício 1
#include<stdio.h>
#include<string.h>
 
int inverte (char vet1[10], char vet2[10]){
 
  int tam1=0,tam2=0,i=0,k=0,cont=0;
 
  tam1 = strlen(vet1);			//verifica tamanho dos vetores
  tam2 = strlen(vet2);
 
  for (i=0;i<tam1;i++){		        //varre o vetor até o final
     if (vet1[i] == 'i')		//conta ocorrências de 'i'
         cont++;  
  }
 
  for (i=tam1-1;i>=0;i--){		//inverte o vetor
     vet2[k] = vet1[i];
     k++;
  }
  vet2[k] = 0;				//indica o fim do vetor, após cópia
  return cont;
}
 
int main(){
 
   char aux1[10]="ifsc", aux2[10]="instituto", aux3[10];
   int  i,len=0;
 
   len=inverte(aux1,aux3);
   printf("%s %d\n", aux3,len);
 
   len=inverte(aux2,aux3);
   printf("%s %d\n", aux3,len);
 
   return 0;
}


solução 01
#include <stdio.h>
#include <string.h>

int copiar_string(char fonte[], char dest[]) {

  int i = strlen(fonte) - 1, j = 0;

  printf("tam : %d \n", i);
  int cont = 0;
  while (i >= 0) {
    if (fonte[i] != 0)
      dest[j] = fonte[i];
    if (fonte[i] == 'i') {
      cont = cont + 1;
    }
    i--;
    j++;
  }

  return cont; //numero de loops-1 corresponde ao tamanho da "string" copiada
}

int main() {
  char aux1[100] = "ifsc", aux2[100] = "inst", aux3[100];
  int len;

  len = copiar_string(aux1, aux3);
  printf("%s %d\n", aux3,len);
  len = copiar_string(aux2, aux3);
  printf("%s %d\n", aux3,len);
}

Exercício 2

Elaborar uma função que recebe um vetor de inteiros e sua dimensão como parâmetro. Ela deverá retornar a quantidade de números pares do vetor.

#include <stdio.h>

int conta_par(int vet[], int len)
{
 /* implementar aqui */
}

main()
{
  int x[10]={1,2,5,9,4,3,2,4,10,23};
  
  printf("Quantidade de pares = %d\n", conta_par(x,10));
}
solução exercício 2
#include <stdio.h>
 
int conta_par(int vet[], int len)
{
  int cont=0,i=0;
  while(i<len){
    if(vet[i]%2==0){
      cont++;
    }
    i++;
  }
  return cont;
}
 
main()
{
  int x[10]={1,2,5,9,4,3,2,4,10,23};
 
  printf("Quantidade de pares = %d\n", conta_par(x,10));
}

Exercício 3

Elaborar uma função que recebe uma matriz quadrada 5x5 de "floats" passada como parâmetro. A função deve retornar a média da diagonal. Teste a função chamando-a a partir do programa principal.

solução exercício 3
#include <stdio.h>
 
#define TAM 5
 
float diagonal(float mat[TAM][TAM])
{
  int i,j;
  float soma, media;
  
 
  for(i=0;i<TAM;i++){
     for(j=0;j<TAM;j++){
	if (i == j){
          soma = soma + mat[i][j];
	}
     }
  }
  media = (soma/TAM);
  return media;
}
 
int main()
{
  float mat[TAM][TAM]={ 1.1,1.2,1.3,1.4,1.5,
                        2.1,2.2,2.3,2.4,2.5,
		        3.1,3.2,3.3,3.4,3.5,
		        4.1,4.2,4.3,4.4,4.5,
		        5.1,5.2,5.3,5.4,5.5};

 printf("A média da diagonal principal eh: %.2f \n", diagonal(mat));
}


Avaliação 2 - 03/05/2019

  • Avaliação 2 (Lab. Redes de Computadores).

Resolução Avaliação 2 (vista de prova) - 08/05/2019

  • Correção da Avaliação 2
  • Enviar os exercícios resolvidos por e-mail: tisemp@ifsc.edu.br

Questão 1

Implementar uma função C que recebe dois vetores de char como parâmetro. No primeiro vetor se encontra uma string qualquer. A função deve copiar esta string para o segundo vetor. A função deve retornar a quantidade de espaços em branco eliminados. Segue o esqueleto e uma saída para a situação colocada no main.

#include <stdio.h>
int eliminar_espaco(char x[], char y[])
{
}

main()
{
}
solução
//desenvolvido pelo aluno: Jeferson Jair (2019-1)

#include <stdio.h>

int contar_espaco(char x[], char y[]){

    int i, cont=0;

    for(i=0; x[i]!=0 ;i++){
       y[i]=x[i];
       if(x[i]==' ')
         cont++;
    }
    y[i++]=0;
    return cont;
}

int main(){

   char a[40] = "Instituto Federal do Santa Catarina";
   char b[40];

   printf("String b = %s com um total de %d espaços\n", b, contar_espaco(a,b));

   return 0;
}

Questão 2

Implementar uma função que recebe um vetor de inteiros e sua dimensão como parâmetros. A função deve retornar a média de TODOS os números ímpares NÃO NEGATIVOS contidos no vetor. Uma demonstração do uso da função deve ser apresentado no programa principal (função main) usando variáveis inicializadas (NÃO USAR scanf)

solução
#include <stdio.h>
 
float media_num_impar(int x[], int len)
{
  int i,soma,cont;
  
  soma=0;
  cont=0;
  for (i=0;i<len;i++){
     if (x[i]>0 && x[i]%2==1) {
        soma = soma + x[i];
        cont++;
     }
  }
  return (float)soma/cont; /* aqui teria um problema de truncamento se não houver casting*/
}
 
main()
{
  int alfa[5]={-5,-3,7,10,11};
  float media;

  media = media_num_impar(alfa, 5);
  printf("media ímpares não negativos do vetor = %f\n", media);
}

Questão 3

Implementar uma função que recebe uma matriz de floats 5x5 como parâmetro. A função deve computar a média de todos os números que fazem parte de linhas PARES e colunas ÍMPARES (considerando sempre que a primeira linha é a 0 e a primeira coluna é 0). Uma demonstração do uso da função deve ser apresentado no programa principal (função main) usando variáveis inicializadas (NÃO USAR scanf)

solução
#include <stdio.h>
 
#define TAM 5
 
float media_lin_col(float vet[TAM][TAM])
{
  int i,j;
  float media_soma=0;
  int cont=0;

  for (i=0;i<TAM;i++)
     for (j=0;j<TAM;j++) {
       if((i%2==0)&&(j%2==1)) {
          media_soma = media_soma + vet[i][j];
          cont++;
       }
     }
  media_soma = media_soma/cont;
  return media_soma;
}
 
int main()
{
  float x[TAM][TAM] = { 1 ,2, 3, 4 ,5,
                        1 ,2, 3, 4 ,5,
                        1 ,2, 3, 4 ,5,
                        1 ,2, 3, 4 ,5,
                        1 ,2, 3, 4 ,5,
                      };

  float media;

  media = media_lin_col(x);
  printf("Média: %.2f\n", media);
  return 0;
}

Estruturas no C - 10/05/2019

Objetivos

  • Estruturas no C;

Material de Referência

Paralização - 15/05/2019

  • Sem atividades letivas.

Avaliação de Recuperação 2 - 17/05/2019

  • Recuperação da Avaliação 2.

Estruturas no C - 22/05/2019

Objetivos

  • Estruturas no C;

Material de Referência

Introdução aos ponteiros no C - dia 24/05/2019

Objetivos

  • Introdução aos ponteiros no C.

Material de Referência

Introdução aos ponteiros no C - dia 29/05/2019

Objetivos

  • Resolução de exercícios sobre ponteiros no C.

Material de Referência

Vetor de Ponteiros, Ponteiros para estruturas e Passagem de argumentos em linha de comando - 31/05/2019

Objetivos

  • Vetor de Ponteiros, Ponteiros para estruturas e Vetor de Ponteiros. Passagem de Parâmetro na linha de comando.

Material de Referência

AULA 23 -

  • correção da avaliação II
  • revisão e exercícios para recuperação.

Correção da Avaliação A

Correção da Avaliação - B

Alocação Dinâmica de Memória - 05/06/2019

  • Alocação dinâmica de memória;
  • Discussão inicial sobre o projeto

SUGESTÕES DE PROJETOS

  • Sistema de Controle de Acesso:

Sistema de acesso de uma sala contendo controle de horário permitido por categoria: aluno, professor e visitante. O administrador poderá editar, criar e remover usuários. Cada usuário terá 3 tentativas de acesso quando então será bloqueado. Na segunda e terceira tentativa será perguntado, de forma randômica mas sem repetir, o dia do nascimento, o primeiro nome da mãe ou o primeiro nome do pai. As senhas configuradas deverão ser de exatamente 6 caracteres com 3 letras, 2 números e um símbolo. Uma mensagem de boas vindas configurável por usuário poderá ser configurada pelo administrador. Todos os dados de usuários deverão ser recuperados de um arquivo.

  • Sistema de controle de empréstimos de livro em uma biblioteca;
  • Sistema de controle de temperatura em salas do IFSC;
  • Batalha Naval incrementada. Controle de jogadores (login), controle de vitórias e pontuações. Configuração do número de embarcações.
  • Sistema de Gastos Pessoal: permite anotar gastos em dinheiro, cheque e cartão. Os gastos possuem categorias: saúde, lazer, transporte etc. Histórico de gastos pode deve ser armazenado.
  • Lista de Compras em supermercados;
  • Agenda de Eventos/Trabalho;

REQUISITOS DOS PROJETOS

Requisitos de TODOS os projetos:

  • No arquivo da função main deve ter um texto explicativo do que o programa faz
  • Toda manipulação de string deve ser feita usando ponteiros;
  • A alocação dinâmica de memória deve ser usada em algum ponto;
  • Todo programa deverá acessar arquivos;
  • Constantes deverão ser defines;
  • As regras de indentação deverão ser seguidas segundo uma das convenções informadas no link da wikipedia. Deixar claro nos comentários qual regra está sendo seguida.

AVALIAÇÃO DO PROJETO

  • Avaliação individual;
  • A Cada semana de aula será realizado uma avaliação da evolução do trabalho.
  • O trabalho será defendido individualmente podendo ser solicitado pequenas implementações no processo.

GRUPOS (duplas)

  1. Layza: Sistema de Autenticação de Usuários;
  2. Murillo: Sistema de Agendamento de Eventos;
  3. Jeferson e Leonardo: Sistema de Gerenciamento de biblioteca;
  4. Maria e Cristiane: Sistema de Controle de listas de compras de supermercados;
  5. Maykon e Matheus: Sistema de Gerenciamento de biblioteca;
  6. Lucas e Salmom: Sistema de Controle de listas de compras de supermercados;
  7. Ary e Júlio: Sistema de Controle de alimentação de animais.

Referências

Acesso a Arquivos em C - 07/06/2019

  • Acesso a arquivos no C
  • Desenvolvimento do Projeto

Material de Referência

Avaliação 3 - 12/06/2019

Recuperação da Avaliação 3 - 14/06/2019

  • Recuperação Avaliação 3.

Desenvolvimento do Projeto - 19/06/2019

  • Desenvolvimento do projeto.

Desenvolvimento do Projeto - 26/06/2019

  • Desenvolvimento do projeto.

Apresentação/Defesa do Projeto - 28/06/2019

  • Defesa do projeto -> individual.

Apresentação/Defesa do Projeto - 03/07/2019

  • Defesa do projeto -> individual.

Recuperações (reapresentações projeto) - 05/07/2019

Encerramento da disciplina - 10/07/2019

Material extra - Uso de múltiplos arquivos nos projetos

  • Acesso a arquivos no C
  • uso de múltiplos arquivos nos projetos

Referências

Exemplo timer

// Baseado em http://forums.codeguru.com/showthread.php?356101-How-to-use-timer-in-Unix

  1. include <stdio.h>
  2. include <signal.h>
  3. include <sys/time.h>
  1. define INTERVALO 1

void set_alarm();


struct itimerval tout_val; int cont=0;

void meu_timer (int i) {

  printf("contador => %d\n",cont++);
  set_alarm();

}

void set_alarm() {

 tout_val.it_interval.tv_sec = 0;
 tout_val.it_interval.tv_usec = 0;
 tout_val.it_value.tv_sec = INTERVALO; 
 tout_val.it_value.tv_usec = 0;
 setitimer(ITIMER_REAL, &tout_val,0);
 signal(SIGALRM,meu_timer);

}

int main () {

 set_alarm();
 while (1)
 {
   ;
 }
 
 return 0;

} </syntaxhighlight>

Exercícios extras - Desafios

Desafios

EX1

Considere o código de um programa inacabado que visa construir e gerenciar uma tabela de alunos de um colégio. Alunos são colocados em uma tabela através de uma função insert_aluno e removidos através de uma função delete_aluno. Estude o código e faça as seguintes modificações:

  1. Modifique a função insert_aluno para que receba (e atualize) como parâmetro adicional a idade do aluno (resolvido na aula);
  2. Acrescente na estrutura um ponteiro para uma estrutura endereço (resolvido na aula). Crie uma função para atualizar o endereço de um determinado aluno passado como parâmetro (ver esqueleto da função);
  3. Crie uma função print_aluno para imprimir todos os dados específicos de um aluno;
  4. Crie uma função print_turma para imprimir dados de toda a turma.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct tipo_endereco {
  char rua[30];
  int numero;
};

struct tipo_aluno {
  char nome[30];
  int  idade;
  struct tipo_endereco *endereco;
};
 

 
struct tipo_aluno *alunos[5]={NULL,NULL,NULL,NULL,NULL};
 
void insert_aluno(char *p_nome, int idade)
{
  int i;
 
  for(i=0;i<5 && alunos[i]!=NULL;i++);
  if(i<5) {
     alunos[i] = malloc(sizeof(struct tipo_aluno)); // lembrar: o retorno de malloc deveria sempre ser testado...
     strcpy(alunos[i]->nome, p_nome);
     alunos[i]->idade = idade;
     alunos[i]->endereco = NULL;
     printf("inserido aluno %s da posição %d\n", p_nome, i);
  }
}
 
void delete_aluno(char *p_nome)
{
  int i;
  int encontrado=0;
 
  for(i=0;i<5 && encontrado==0;i++) {    
     if (alunos[i]!=NULL && strcmp(alunos[i]->nome, p_nome)==0) {
         if (alunos[i]->endereco!=NULL)
             free(alunos[i]->endereco);
         free(alunos[i]);
         alunos[i]=NULL;
         printf("removido aluno %s da posição %d\n", p_nome, i);
         encontrado=1;
     }
  }
}
 
void print_aluno(char *pnome)
{
 
}
 
void print_turma()
{
 
}
 
void update_endereco(char *p_nome, char *rua,int numero)
{
  int i;
  int encontrado=0;

  for(i=0;i<5 && encontrado==0;i++) {    
     if (alunos[i]!=NULL && strcmp(alunos[i]->nome, p_nome)==0) {
         /* testar se o ponteiro de endereço já contém algo - caso tenho reutilizar */
         alunos[i]->endereco = malloc(sizeof(struct tipo_endereco));
         strcpy(alunos[i]->endereco->rua, rua);
         alunos[i]->endereco->numero = numero;
         encontrado=1;
     }
  }
}
 
main()
{
   insert_aluno("delta", 15);
   insert_aluno("blabla", 18);
   delete_aluno("delta");
   insert_aluno("gamma", 20);
   delete_aluno("blabla");
   insert_aluno("epson", 19); 
}

EX2

#include <stdio.h>

#define NUM_ALUNOS 5

struct TNotas{
  float bim1,bim2,bim3,bim4;
};

struct TAluno {
  char nome[50];
  char cpf[12];
  struct TNotas notas; 
} Alunos[NUM_ALUNOS] = { 
                {"joao","213124348-23",{3.5,4.6,7.8,9.5}},
                {"maria","265464668-13",{4.5,4.6,9.8,9.5}},
                {"jose","756789967-12",{3.5,4.6,2.8,1.5}},
                {"ana","567814668-11",{9.5,9.6,9.8,9.5}},
                {"clara","978324567-45",{6.5,6.6,4.8,7.5}},
              };

/* Esta função recebe o nome do aluno como parâmetro e retorna a média anual */
float media_anual_aluno(char nome[])
{

}

/* Esta função retorna a quantidade de alunos cujo nome começa com o parâmetro passado em letra */
int num_alunos(char letra)
{

}

/* Esta função retorna a quantidade de alunos abaixo da média da turma */
int abaixo_media()
{

}

/* esta função recebe a quantidade de alunos cujo cpf possue os dois últimos caracteres dado pela
   cadeia passada como parâmetro */
int num_cpfs(char cadeia[3])
{

}

/* a função main é dada e serve como referência de teste */
void main()
{
  printf("media do aluno joao %f\n", media_anual_aluno("joao"));
  printf("quantidade de alunos abaixo da média = %d\n", abaixo_media());
  printf("número de alunos que começa com a letra b -> %d\n", num_alunos('b'));
  printf("número cpfs terminados em 13 %d\n", num_cpfs("13"));
}

MATERIAIS EXTRAS DE APOIO