Mudanças entre as edições de "PRG29002 - Programação I - Eng.Telecom 2019-1"
Linha 1 210: | Linha 1 210: | ||
=Avaliação 3 - 12/06/2019 = | =Avaliação 3 - 12/06/2019 = | ||
− | [[Arquivo:Avaliacao3.pdf]] | + | <!--[[Arquivo:Avaliacao3.pdf]]--> |
− | [https://wiki.sj.ifsc.edu.br/images/7/70/Avaliacao_3.pdf Avaliação 3] | + | *[https://wiki.sj.ifsc.edu.br/images/7/70/Avaliacao_3.pdf Avaliação 3] |
=Recuperação da Avaliação 3 - 14/06/2019 = | =Recuperação da Avaliação 3 - 14/06/2019 = |
Edição das 12h45min de 14 de junho de 2019
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
- https://www.w3resource.com/c-programming-exercises
- Lógica de Programação, de Paulo Sérgio de Moraes
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
TAREFA
- Estudar AULA 2 e 3 de Apostila de C - UFMG
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
- Continuação do conteúdo de matrizes: resolução de exercícios.
- Aula com Prof. Eraldo Silveira e Silva.
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)
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 |
---|
|
Exercícios extras - Desafios
Desafios |
---|
EX1Considere 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:
#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"));
}
|