Buscar

Aula 01

Prévia do material em texto

SI 200 – Algoritmos e Programac¸a˜o
de Computadores II
Prof. Cla´udio Alessandro de Carvalho Silva
cacs@ft.unicamp.br
Aula 01
Apresentac¸a˜o da Disciplina e Revisa˜o de Conceitos
de C
Conteu´do
U¨bersicht
Objetivos.
Introduzir os conceitos e te´cnicas de alocac¸a˜o dina^mica
de memo´ria e manipulac¸a˜o de arquivos.
Desenvolver a capacidade de implementar programas.
Utilizar te´cnicas avanc¸adas de programac¸a˜o na
linguagem C.
Professor.
Cla´udio A. C. Silva, cacs@ft.unicamp.br.
Incluir [SI200A] ou [SI200B] no in´ıcio do campo Subject.
Ementa.
1 Alocac¸a˜o dina^mica de memo´ria.
2 Manipulac¸a˜o de arquivos.
3 Bibliotecas esta´ticas e dina^micas.
4 Atividades pra´ticas de implementac¸a˜o de programas,
utilizando a Linguagem estudada em Algoritmos e
Programac¸a˜o de Computadores I.
Metodologia de ensino.
Aulas presenciais teo´ricas e pra´ticas em laborato´rio. Tarefas
teo´ricas e pra´ticas extra-classe.
Aulas.
Sexta-feira, 14:00 – 18:00 (turma B). Sexta-feira, 19:00 –
23:00 (turma A).
Carga hora´ria.
60 horas.
Exerc´ıcios.
Sera˜o disponibilizadas listas de exerc´ıcios para trabalho
extra-classe.
Tais exerc´ıcios sa˜o parte integrante do programa da
disciplina.
Os exerc´ıcios na˜o tera˜o seus gabaritos disponibilizados.
Du´vidas devem ser sanadas nos hora´rios de atendimento
com os monitores.
Atividades de laborato´rio.
Havera´ um conjunto de atividades pra´ticas que o aluno
devera´ cumprir.
O acesso e submissa˜o das atividades sera´ feita via
Internet.
A correc¸a˜o sera´ feita por sistema automatizado a partir
de conjunto de testes pre´-definidos.
Alguns testes sera˜o abertos (vis´ıveis aos alunos), outros
sera˜o fechados (invis´ıveis aos alunos).
O valor 𝑇 sera´ a me´dia aritme´tica das atividades.
As duas atividades iniciais na˜o valera˜o nota e servira˜o
para que os alunos se familiarizem com o ambiente de
trabalho.
Projeto.
Os alunos desenvolvera˜o um projeto de software em
grupo que sera´ apresentado em tre^s fases.
O software devera´ ser compat´ıvel com padra˜o ANSI C e
compilador GCC do sistema operacional GNU/Linux.
O software desenvolvido em cada projeto deve estar em
reposito´rio Git privado compartilhado com o professor da
disciplina. Os grupos tera˜o de 2 a 4 participantes sem
excec¸o˜es.
Nas datas de entrega especificadas, cada grupo
isoladamente apresentara´ seus resultados ao professor.
Sera´ atribu´ıda uma nota a cada fase do projeto e a nota
final do grupo sera´ a me´dia aritme´tica das notas de cada
fase.
Avaliac¸o˜es teo´ricas.
Havera´ uma prova teo´rica durante o semestre, ambas
com durac¸a˜o de 120 minutos e feita sem consulta.
Dependendo de seu rendimento, o aluno devera´ fazer um
exame teo´rico ao final do semestre.
Crite´rio de avaliac¸a˜o.
A me´dia final do semestre 𝑀𝐹 sera´ calculada a partir das
notas das provas teo´ricas e atividades de laborato´rio da
seguinte forma:
𝑁1 → Nota da prova teo´rica
𝑁2 → Me´dia aritme´tica das tre^s fases do projeto
𝑇 → Me´dia das atividades de laborato´rio
𝐸 → Nota do exame final
𝑀 → Me´dia parcial
𝑀 = 0, 4𝑁1 + 0, 4𝑁2 + 0, 2𝑇
𝑀 ≥ 6, 0→ Aprovac¸a˜o direta→𝑀𝐹 =𝑀.
𝑀 < 2, 5→ Reprovac¸a˜o direta→𝑀𝐹 =𝑀.
2, 5 ≤𝑀 < 6, 0→ Exame→𝑀𝐹 = 0, 6𝑀 + 0, 4𝐸 ≥ 5, 0→ Aprovac¸a˜o
Observac¸o˜es importantes.
1 Atividades entregues fora do prazo sera˜o desconsideradas.
2 Todas as atividades de laborato´rio sera˜o individuais.
3 Todas as atividades de laborato´rio devera˜o ser compat´ıveis com
padra˜o ANSI C e compilador GCC do sistema operacional
GNU/Linux.
4 Os monitores na˜o fara˜o atividades de laborato´rio.
5 Sera´ usado sistema de detecc¸a˜o de fraudes. Ele e´ programado para
detectar pla´gios entre todas as respostas de todos os alunos ao
longo do semestre. Em caso de fraude, todos os envolvidos ficara˜o
com me´dia 0, 0 (zero) na disciplina.
6 So´ podera˜o fazer o Exame alunos com 𝑀 ≥ 2, 5 (vide Cap´ıtulo V,
Sec¸a˜o I, Artigo 57 Inciso II do Regimento Geral de Graduac¸a˜o).
7 Em caso de ause^ncia a uma das provas teo´ricas, quando justificada
por razo˜es legais (vide Regimento Geral de Graduac¸a˜o Cap´ıtulo V,
Sec¸a˜o X, Artigo 72), o exame sera´ usado como substitutiva.
Cronograma inicial.
Semana Data To´pico
1 2014-09-05 Apresentac¸a˜o da disciplina e revisa˜o de conceitos de C
2 2014-09-12 Modularizac¸a˜o de co´digo
3 2014-09-19 Laborato´rio de projeto parte 1 – Especificac¸a˜o de sistema
4 2014-09-26 Apresentac¸a˜o do projeto parte 1 – Especificac¸a˜o de sis-
tema
5 2014-10-03 Ponteiros em C
– 2014-10-08 Semana de Tecnologia em Foco
6 2014-10-17 Alocac¸a˜o dina^mica de memo´ria
7 2014-10-22 Laborato´rio de Programac¸a˜o em C – Exerc´ıcios sobre
alocac¸a˜o de memo´ria.
8 2014-10-31 Laborato´rio de projeto parte 2 – Alocac¸a˜o dina^mica de
memo´ria
9 2014-11-07 Apresentac¸a˜o do projeto parte 2 – Alocac¸a˜o dina^mica
de memo´ria
10 2014-11-14 Manipulac¸a˜o de arquivos
11 2014-11-21 Laborato´rio de Programac¸a˜o em C – Manipulac¸a˜o de ar-
quivos
12 2014-11-28 Laborato´rio de projeto parte 3 – Manipulac¸a˜o de arquivos
13 2014-12-05 Apresentac¸a˜o do projeto parte 3 – Final
14 2014-12-12 Avaliac¸a˜o final
15 2014-12-19 Revisa˜o e Laborato´rio de Programac¸a˜o em C
– – Semana de estudos
– – Exame final
Bibliografia recomendada.
FORBELLONE, A. L. V., EBERSPA¨CHER, H. F., Lo´gica de Programac¸a˜o – A
construc¸a˜o de algoritmos e estruturas de dados, 3a. Edic¸a˜o, Sa˜o Paulo,
Pearson Prentice Hall, 2005.
ASCENCIO, A. F. G., CAMPOS, E. A. V., Fundamentos da Programac¸a˜o de
Computadores – Algoritmos, Pascal e C/C++, Pearson Prentice Hall, 2003.
MIZRAHI, V. V., Treinamento em Linguagem C – Curso Completo, 2a.
Edic¸a˜o, Pearson Makron Books, 2005.
PUGA, S., RISSETTI, G., Lo´gica de Programac¸a˜o e Estrutura de Dados, 2a.
Edic¸a˜o, Prentice Hall, 2008.
DEITEL, H. M., DEITEL, P. J., Como Programar em C. Rio de Janeiro: LTC,
1999.
SCHILDT, H., C Completo e Total, 3a. Edic¸a˜o, Makron Books, 1997.
WIRTH, N. Algoritmos e Estruturas de Dados, Prentice Hall, 1996.
TENENBAUM, A. M., LANGSAM, Y. AUGESTEIN, M. J. Estruturas de
Dados Usando C, Makron Books, 1995.
U¨bersicht
Estrutura Condicional Unidirecional em C
if{condic¸~ao}
{
comando1;
...
comandoN;
}
#include <stdio.h>
main()
{
float N1, N2, M;
printf("Digite␣duas␣notas");
scanf("%f", &N1);
scanf("%f", &N2);
M = (N1 + N2)/2;
if (M >= 5)
printf("Aprovado");
}
Estrutura Condicional Bidirecional em C
if{condic¸~ao}
{
comando1;
...
}
else
{
comandoN;
...
}
#include <stdio.h>
main()
{
printf("Digite␣duas␣notas");
scanf("%f", &N1);
scanf("%f", &N2);
M = (N1 + N2)/2;
if (M >= 5)
printf("Aprovado");
else
printf("Reprovado");
}
#include <stdio.h>
main()
{
float A, B, C;
printf("Digite␣tre^s␣nu´meros");
scanf("%f", &A);
scanf("%f", &B);
scanf("%f", &C);
if (A > B)
if (A > C)
printf("O␣maior␣nu´mero␣e´␣%f", A);
else
printf("O␣maior␣nu´mero␣e´␣%f", C);
else
if (B > C)
printf("O␣maior␣nu´mero␣e´␣%f", B);
else
printf("O␣maior␣nu´mero␣e´␣%f", C);
}
Podem ser aninhadas.
Cada else fecha o if
mais pro´ximo.
Indentac¸a˜o e
delimitadores {}.
Comando CASE
switch (varia´vel)
{
case valor1:
comando1 ou lista de comandos1;
break;
case valor2:
comando2 ou lista de comandos2;
break;
...
case valorN:
comandoN ou lista de comandosN;
break;
default:
comando ou lista de comandos;
}
#include <stdio.h>
main(){
int op, X, Y;
printf("Entre␣com␣a␣opc¸~ao:␣");
scanf("%d", &op);
switch (op)
{
case 1:
X = 10;
Y = 20;
break;
case 2:
X = 100;
Y = 0;
break;
default:
X = 0;
Y = 0;
}
printf("O␣valor␣de␣X␣e´:␣%d",X);
printf("O␣valor␣de␣Y␣e´:␣%d", Y);
}
Exerc´ıcio
A nota final de um estudante e´ calculada a partir de tre^s
notas: laborato´rio, avaliac¸a˜o semestral e exame final, com os
pesos 2, 3 e 5, respectivamente. Fac¸a um programa C que leia
tre^s notas de um estudante, calcule e mostre a me´dia
ponderada e o conceito correspondente, de acordo com:
Me´dia Conceito
𝑀 ≥ 8.0 A
7.0 ≤𝑀 < 8.0 B
6.0 ≤𝑀 < 7.0 C
5.0 ≤𝑀 < 6.0 D
< 5.0 E
Estrutura de Repetic¸a˜o com Nu´mero
Definido
for (inicializac¸~ao; condic¸~ao; incremento/decremento)
comando;
#include <stdio.h>
main()
{
float N1, N2, M, Mgeral, soma;
int cont;
soma = 0; /* valor inicial da varia´vel de totalizac¸~ao */
for (cont=0; cont < 50; cont++)
{
printf("Digite␣as␣duas␣notas");
scanf("%f", &N1);
scanf("%f", &N2);
M = (N1 + N2)/2; /* ca´lculo da me´dia de um aluno */
soma = soma + M; /* acumula as me´dias dos alunos */
printf("Media␣do␣aluno␣%d␣=␣%f", cont, M);
}
Mgeral = soma/50; /* ca´lculo da me´dia geral dos 50 alunos */
printf("Media␣geral␣da␣turma␣de␣alunos␣=␣%f", Mgeral);
}
#include <stdio.h>
main()
{
int N, cont;
printf("Digite␣um␣nu´mero␣inteiro␣positivo:␣");
scanf("%d", &N);
printf("Sequ¨e^ncia␣de␣nu´meros␣pares␣ate´␣%d", N);
/* Os termos do contador podem ter va´rias formas*/
for (cont = 2; cont <= N; cont = cont + 2)
printf("%d␣",cont);
}
#include <stdio.h>
main()
{
int x, y;
/* Mu´ltiplas varia´veis na contagem */
for (x = 0, y = 0; x + y < 100; x++, y++)
printf("%d␣", x + y)
}
#include <stdio.h>
#include <conio.h>
main()
{
int i, j, resposta;
char feito = ’␣’;
/* Condic¸~ao de parada n~ao precisa depender da contagem*/
for (i = 1; i < 100 && feito != ’N’; i++)
{
for (j = 1; j < 10; j++)
{
printf("Quanto␣e´␣%d␣+␣%d␣?", i, j);
scanf("%d", &resposta);
if (resposta != i + j)
printf("errado\n");
else
printf("certo\n");
}
printf("Deseja␣continuar?␣(S/N)");
feito = getche();
}
}
/* Nem todos os termos precisam estar definidos */
for (x = 0; x != 100;)
/* Loop infinito */
for (;;)
printf("Este␣lac¸o␣rodara´␣para␣sempre");
/* Contagem sem bloco de comandos associado */
for (t = 0; t < algum_valor; t++);
Estrutura de Repetic¸a˜o com Nu´mero
Indefinido
while (condic¸~ao)
{
comando1;
...
comandoN;
}
#include <stdio.h>
main()
{
int N, r;
printf("Entre␣com␣um␣numero␣inteiro");
scanf("%d", &N);
while (N != 0)
{
r = N % 2;
if (r == 0)
printf("O␣numero␣e´␣par");
else
printf("O␣numero␣e´␣ı´mpar");
printf("Entre␣com␣outro␣numero␣inteiro");
scanf("%d", &N);
}
}
Estrutura de Repetic¸a˜o com Nu´mero
Indefinido Po´s Teste
do {
comando ou bloco de comandos;
} while (condic¸~ao)
#include <stdio.h>
main()
{
int N, r;
do {
printf("Entre␣com␣um␣numero␣inteiro");
scanf("%d", &N);
if (N != 0)
{
r = N % 2;
if (r == 0)
printf("O␣numero␣e´␣par");
else
printf("O␣numero␣e´␣ı´mpar");
}
} while (N != 0);
}
Exerc´ıcio
Fac¸a um programa C que calcule o fatorial de um nu´mero
inteiro qualquer. Sabe-se que:
0! = 1
𝑛! = 1× 2××3× . . .× (𝑛− 1)× 𝑛, 𝑛 > 0
Vetores em C
tipo-de-dado nome[tamanho]; /* Declarac¸~ao */
nome[n]; /* refere^ncia */
float nota[10]; /* Declarac¸~ao */
nota[5] = 9.5; /* refere^ncia */
#include <stdio.h>
main()
{
float soma, media, desvio, nota[100] /* vetor de notas */;
int i /* ı´ndices do vetor */;
soma = 0; /* variavel para acumular as notas */
for (i = 0; i < 100; i++)
{
printf("Digite␣uma␣nota:␣");
scanf("%f", &nota[i]);
soma = soma + nota[i];
}
media = soma/100;
printf("Media␣=␣%f", media);
/* Ca´lculo dos devios */
for (i = 0; i < 100; i++)
{
desvio = nota[i] - media;
printf("Desvio␣da␣nota␣%f␣=␣%f", nota[i], desvio);
}
}
Exerc´ıcio
Fac¸a um programa C que:
leia dois vetores, contendo 5 nu´meros inteiros cada um;
intercale os elementos dos dois vetores, formando um
novo vetor de 10 elementos;
escreva o vetor resultante da intercalac¸a˜o.
Matrizes em C
tipo-de-dado nome[linhas][colunas; /* Declarac¸~ao */
nome[m][n]; /* refere^ncia */
float mat[2][10]; /* Declarac¸~ao */
mat[1][5] = 9.5; /* refere^ncia */
#include <stdio.h>
main()
{
float soma, media, desvio, nota[5][50] /* matriz de notas */;
int i, j /* ı´ndices da matriz */;
/* Obtendo as notas para cada curso */
for(i = 0; i <= 4; i++) /* para cada curso */
{
printf("Notas␣do␣curso␣%d:\n", i);
for(j = 0; j <= 49; j++) /* le^ as notas */
{
printf("Digite␣uma␣nota:␣");
scanf("%f", &nota[i][j]);
}
}
/* Ca´lculo das me´dias e desvios para cada curso */
for(i = 0; i <= 4; i++) /* para cada curso */
{
/* Ca´lculo da me´dia */
soma = 0; /* para a sumarizac¸~ao das notas do curso i */
for(j = 0; j <= 49; j++)
soma = soma + nota[i][j];
media = soma/50; /* me´dia das notas do curso i */
printf("\nMedia␣=␣%f", media);
/* Ca´lculo do desvio */
for(j = 0; j <= 49; j++)
{
desvio = nota[i][j] - media;
printf("\nDesvio␣da␣nota␣%f␣=␣%f", nota[i][j], desvio);
}
}
}
Strings em C
char str[tamanho+1];
#include <stdio.h>
main()
{
char nome[31];
gets(nome); /* le^ uma string do teclado */
}
#include <stdio.h>
main()
{
char nome[41];
scanf("%s", nome); /* le^ uma string do teclado */
}
#include <stdio.h>
main()
{
char nome[31];
gets(nome); /* le^ uma string do teclado */
puts(nome); /* escreve uma string na tela */
puts("teste"); /* escreve teste na tela */
}
#include <stdio.h>
main()
{
char nome[41];
scanf("%s", nome); /* le^ uma string do teclado */
printf("%s", nome); /* escreve uma string na tela */
}
#include <stdio.h>
#include <string.h>
int main()
{
char prim[20], seg[10];
/* strcpy(dest,orig) copia orig em dest */
strcpy(prim,"Boa");
strcpy(seg,"␣Noite");
/* strcat(prim,seg) concatena seg ao final de prim */
/* prim deve ter tamanho suficiente para prim+seg */
strcat(prim, seg);
puts(prim);
return(0);
}
#include <stdio.h>
#include <string.h>
int main()
{
char senha[80];
printf("Digite␣a␣senha:␣");
gets(senha);
/* Compara strings */
if (strcmp(senha, "32SIA") != 0)
printf("Senha␣Invalida\n");
return(0);
}
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
char str[80];
int i, tam;
printf("Digite␣uma␣string:␣");
gets(str);
/* Retorna o comprimento da string */
tam = strlen(str);
for (i = 0; i < tam; i++)
str[i] = toupper(str[i]); /* converte para maiu´scula */
puts(str);
return(0);
}

Continue navegando