Baixe o app para aproveitar ainda mais
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", ¬a[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", ¬a[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); }
Compartilhar