Mudanças entre as edições de "PRG1-2013-2-Engenharia Programação 1 - Engenharia"
Linha 3 964: | Linha 3 964: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | === | + | ===Exercícios com structs=== |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | 1.Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrt''[http://www.elook.org/programming/c/sqrt.html] e ''atan'' [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]: | |
− | |||
:<math> mod = \sqrt{x^2+y^2} </math> | :<math> mod = \sqrt{x^2+y^2} </math> | ||
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math> | :<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math> | ||
+ | Solução: | ||
+ | {{collapse top}} | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
#include <math.h> | #include <math.h> | ||
Linha 4 006: | Linha 4 001: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | ===EXERCÍCIOS (nível difícil)=== | ||
+ | |||
+ | #Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''. | ||
+ | #Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40. | ||
+ | #A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s. | ||
+ | #Flexibilize o programa anterior para que o passo possa ser fornecido. | ||
+ | #Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'. | ||
+ | |||
+ | |||
+ | |||
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c> | #Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c> | ||
#include <stdio.h> | #include <stdio.h> |
Edição das 14h52min de 2 de outubro de 2013
PRG1 - PROGRAMAÇÃO I
DADOS DA DISCIPLINA
CARGA HORÁRIA
TOTAL: 72 HORAS (4 HORAS/SEMANA)
TEÓRICA: 36 HORAS
LABORATÓRIO: 36 HORAS
DIAS COM AULA: 36 (18 semanas)
PRÉ REQUISITOS: LÓGICA
EMENTA
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários.
Bibliografia Básica
- SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953
Referências Complementares
- Apostila adotada: Curso de Linguagem C - Engenharia Elétrica - UFMG
AULAS
AULA 1 DIA 15/08/2013 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
AULA 1 DIA 15/08/2013Como fazer um churrascoVamos observar atentamente este vídeo para iniciarmos o nosso curso de programação: EmbedVideo received the bad id "U0xSYIXE9vo#!" for the service "youtube". O que tem o churrasco com a nossa aula?? Trata-se de uma sequência de passos para execução de um objetivo. EXERCÍCIO: Na forma textual, descrever as etapas para fazer um bom churrasco. O que é um algoritmoUm algoritmo pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema. A receita de um bom churrasco corresponde a um algoritmo. Como representar um algoritmo ?Uma forma é representar na forma textual ordenada: 1.Comprar a carne 2.Colocar carvão na churrasqueira 3.Acender o carvão 4.Cortar a carne (picanha) 5.Espetar a carne 6.Salgar a carne 7.Colocar a carne na churrasqueira 8.Aguardar a carne ficar no ponto desejado 9.Bater a carne 10.Servir a carne Outras formas são mais apropriadas para o uso no meio computacional:
A PENSAR: É possível mudar a ordem das instruções? É possível paralelizar algumas instruções? O problema da raposa, do milho e da galinhaEmbedVideo received the bad id "yifW9XueSaI#!" for the service "youtube".
EXERCÍCIO 1: Descrever na forma de etapas um solução para o problema da raposa, do milho e da galinha. Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema. EXERCÍCIO 2: Descrever na forma de etapas uma solução para o problema dos canibais/padres. Torres de HanoiVeja este jogo: EmbedVideo received the bad id "hLnuMXO95f8#!" for the service "youtube". EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema das torres de Hanói usando 3 discos. EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema das torres de Hanói usando 4 discos. E para quem são os algoritmos?Uma receita de bolo é apropriada para ser executada por um ser humano. Um procedimento de como trocar um pneu também. Mas muitas vezes queremos que o algoritmo seja executado por uma máquina! O computador é perfeito para isto! Neste curso vamos nos concentrar no desenvolvimento de algoritmos simples, desde a sua concepção até a sua implementação através de uma LINGUAGEM DE PROGRAMAÇÃO - a linguagem C , por exemplo. Um PROGRAMA implementa um algoritmo. É o algoritmo materializado na forma de uma sequência de instruções. Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula) A Descrição de Algoritmos usando FluxogramasUm fluxograma é uma linguagem semi-gráfica que pode ser utilizada para descrição de algoritmos. Exemplo: O algoritmo de cálculo da média de dois números: Pontos fortes:
Ponto fraco:
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA. Símbolos de um FluxogramaTeste de MesaConstantes, VariáveisAlgoritmos operam sobre dados. O que podem ser estes dados? Variáveis e Constantes No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA Também podemos identificar uma CONSTANTE. O número 2.
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */
Ex: RES = TRUE /* RES é uma variável booleana */
Ex: LETRA = 'A'
Ex: FRASE = "ALO MUNDO" E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar uma primeira noção do C ExpressõesExpressões sentenças que relacionam variáveis e constantes através de operadores matemáticos e que RESULTAM em um valor. A instrução do algoritmo: MEDIA = (NUM1 + NUM2) / 2 será considerada como uma expressão, que usa os operadores '+', '/' e '=' O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito do '=' será atribuída a variável do lado esquerdo. Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão como um todo resulta no valor que é atribuído a variável. Operadores AritméticosOs operadores aritméticos que usaremos neste curso serão os disponíveis no C:
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão: A = B%2 será 1. Representando o algoritmo com pseudo-código
|
AULA 2 DIA 19/08/2013 | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AULA 2 DIA 19/08/2013ObjetivosO aluno deverá saber utilizar expressões com:
Operadores relacionaisOs operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo: Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se
|
AULA 3 DIA 23/08/2013 | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AULA 3 DIA 23/08/2013ObjetivosO aluno devera ser capaz de:
Possíveis linguagens de programaçãoNa prática, é inviável desenvolver programas complexos em LINGUAGEM DE MÁQUINA. Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de alguma forma, serem traduzidas (compiladas) para a linguagem de baixo nível ou interpretadas em tempo de execução. Exemplo:
Neste curso utilizaremos a linguagem C. Por que? É uma linguagem muito usada na implementação de produtos eletrônicos, incluindo àqueles voltados as Telecomunicações. Introdução a linguagem C
EmbedVideo received the bad id "rGCbvqz6Kt4#!" for the service "youtube".
Visão geral do processo de compilação com gcc
Compilando um programa CNeste curso usaremos o compilador da coleção gcc do projeto GNU. O manual completo do gcc pode ser encontrado aqui. O processo de desenvolvimento do programa envolve:
mkdir ExerciciosC cd Exercicios Exemplo: salve o programa abaixo como teste.c
#include <stdio.h>
main()
{
printf("Alo Mundo\n");
}
gcc teste.c -o teste
./teste Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out É possível somente compilar (gerar código objeto): gcc -c teste.c Observe os subprodutos listando com detalhes: ls -l Estrutura do Programa em CUm programa em C pode ser visto como um conjunto de uma ou mais funções:
#include <stdio.h>
main()
{
printf("Alo Mundo\n");
}
No programa acima temos uma única função: a função main() Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função main. A primeira instrução desta função é o ponto de entrada do código do usuário. A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o printf(). Esta função permite mostrar dados no terminal. Não é possível colocar instruções fora de funções! Declarando variáveis inteiras e reais locaisNo "c" temos que declarar as variáveis que serão utilizadas no programa. Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente (escopo local). Este conceito será estendido para blocos de códigos posteriormente.
#include <stdio.h>
main()
{
/* aqui começam as declarações de variáveis */
int x; /* declaração de uma variável inteira */
float y; /* declaração de uma variável real */
/* aqui começam as instruções do programa principal */
x=5; /* atribuindo o valor 5 (constante) a variável x */
y=6.5;
}
No exemplo anterior criamos duas variáveis : x e y. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA: +-----+ | 5 | x +-----+ A variável x é do tipo int e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais. +-----+ | 6.5 | y +-----+ Observe que as instruções de atribuição acima envolvem constantes também. Funções de entrada e saída de dadosNo "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca. Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o printf() - já apresentado - e o scanf(). Esta última função permite entrada de dados.
#include <stdio.h>
main()
{
int x; /* declaração de uma variável inteira */
float y; /* declaração de uma variável real */
printf ("Entre com o valor de x ");
scanf("%d",&x);
printf ("Entre com o valor de y ");
scanf("%f",&y);
printf ("O valor de x é %d\n",x);
printf ("O valor de y é %f\n",y);
}
Construindo expressões no COperador de AtribuiçãoO operador de atribuição = é amplamente usado para atribuir valores para variáveis. Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis x e y e a média é calculada e colocada na variável média. #include <stdio.h>
main()
{
float x,y;
float media;
printf("Entre com x\n");
scanf("%f", &x);
printf("Entre com y\n");
scanf("%f", &y);
media = (x+y)/2;
printf("Valor de media = %f\n",media);
}
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo: #include <stdio.h>
main()
{
int x,y,w;
x=1;
w=y=x+1;
printf("x=%d y=%d w=%d\n", x,y,w);
w=2*(y=x+1);
printf("x=%d y=%d w=%d\n", x,y,w);
}
NOTE que o código: w=2*y=x+1; produz um erro de compilação: erro: lvalue required as left operand of assignment Ver conceito de lvalue e rvalue aqui. O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda. Operadores aritméticosJá temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:
Exemplo 1 #include <stdio.h>
main()
{
int x,y;
printf("Entre com x\n");
scanf("%d", &x);
y=x%2;
printf("resto x divido por 2 =%d\n",y);
}
Exemplo 2
#include <stdio.h>
main()
{
int x,y;
printf("Entre com x\n");
scanf("%d", &x);
y=x++;
printf("Valor de y =%d e o valor de x = %d\n",y, x);
x=1;
y=++x;
printf("Valor de y =%d\n",y);
}
Exemplo 3 #include <stdio.h>
main()
{
int x,y;
printf("Entre com x\n");
scanf("%d", &x);
y=x--;
printf("Valor de y =%d\n",y);
}
Note que existe uma diferença entre y = x--; e y = --x; Exemplo 4 #include <stdio.h>
main()
{
int x,y;
x=1;
y = x+++x++;
printf("x=%d y=%d\n", x,y);
x=1;
y = ++x+x++;
printf("x=%d y=%d\n", x,y);
}
Operadores Relacionais e LógicosOs operadores relacionais e lógicos são os mesmos vistos na aula anterior.
Ver Operadores Relacionais e Lógicos Comandos de decisão if() e if() else
#include <stdio.h>
main()
{
int x; /* declaração de uma variável inteira */
int y; /* declaração de uma variável inteira */
printf ("Entre com o valor de x ");
scanf("%d",&x);
printf ("Entre com o valor de y ");
scanf("%d",&y);
if (y>x)
printf("MSG1:y é maior que x\n");
if (y>x)
printf("MSG2:y é maior que x\n");
else
printf("MSG3:y é igual ou menor que x\n");
}
Outro exemplo, usando blocos:
#include <stdio.h>
main()
{
int x,y,z; /* declaração de uma variável inteira */
printf ("Entre com o valor de x ");
scanf("%d",&x);
printf ("Entre com o valor de y ");
scanf("%d",&y);
if (y>x) {
printf("MSG1: y é maior que x\n");
z = y-x;
printf("MSG2: Neste caso z = %d\n", z);
} else {
printf("MSG3: y é igual ou menor que x\n");
z = x-y;
printf("MSG4: Neste caso z = %d\n", z);
}
}
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA. Exemplo: if (2)
printf("expressão sempre VERDADEIRA");
if ('2')
printf("expressão sempre VERDADEIRA");
if (1-1)
printf("expressão sempre FALSA");
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */
printf("expressão sempre VERDADEIRA");
Tipo CharUma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo char, que na prática é um número inteiro de byte. Exemplo #include <stdio.h>
main ()
{
char x='A',y=65,w=0x41,z;
scanf("%c",&z);
printf("Caracter lido = %c\n",z);
printf("Caracter lido = %d\n",z);
printf("Caracter lido = %x\n",z);
if (z==x)
printf("Iguais 1\n");
if (z==y)
printf("Iguais 2\n");
if (z==w)
printf("Iguais 3\n");
}
IndentaçãoExercícios
Exercícios adicionaisExercício 1 Considere dois vetores A e B dados pelas coordenadas em (x,y) em um espaço n dimensional [1]: O produto escalar entre A e B é escrito como sendo: Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões). Exercício 2 Considere um móvel cuja velocidade no tempo é dada pela equação abaixo. Implemente um programa Scratch para calcular a a aceleração em um dado tempo fornecido. Sugestão: o programa deve calcular e onde é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto é a derivada de no ponto, podendo ser aproximada por . Exercício 3 Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:
Note que para um dado número complexo tem-se: e onde
|
AULA 4 DIA 24/08/2013 |
---|
AULA 4 DIA 24/08/2013Aula de sábado - Exercícios propostos na aula anterior |
AULA 5 DIA 26/08/2013 |
---|
AULA 5 DIA 26/08/2013Objetivos
Repetições com teste de condição no inícioEstruturas de repetiçãoNo exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um loop infinito). Vamos elaborar um pouco mais estas estruturas de repetição. Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções possivelmente sobre dados diferentes, a uma velocidade muito grande. PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado. DADOS DE ENTRADA:
DADOS DE SAÌDA = S /* somatório */ NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão. EXERCÍCIO Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF. Estruturas de repetição com teste no inícioNo exemplo anterior mostramos uma estruta de repetição com teste no início do loop. O teste no início permite permite que se execute o LOOP 0 ou mais vezes. Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para que se possa avaliar a CONDIÇÂO de teste. Exemlo: Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.
|
AULA 6 DIA 29/08/2013 |
---|
AULA 6 DIA 29/08/2013ObjetivosO aluno deverá ser capaz de colocar estruturas de repetição especificadas em fluxogramas ou pseudo-código na forma de estruturas em linguagem C. Estruturas de RepetiçãoExistem 4 estruturas/comandos que permitem implementar loops ou repetições de blocos de código:
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica. O comando while():teste da repetição no começoO comando while permite implementar loops com controle no início: #include <stdio.h>
main()
{
int contador;
contador=0;
while (contador<5) {
printf("valor do contador = %d\n", contador);
contador=contador+1;
}
}
A estrutura do comando, informalmente, é: while (expressão) instrução_simples; ou while (expressão) { lista_de_instruções } Vamos ver a correspondência do comando while com um fluxograma: NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido. Comando do while: controle do loop no finalO comando do while() permite a repetição de uma ou mais instruções, com controle do loop no final. Isto permite que o bloco seja executado pelo menos uma vez. #include <stdio.h>
main()
{
int contador;
contador=0;
do {
printf("valor do contador = %d\n", contador);
contador=contador+1;
} while (contador<5);
}
A estrutura do comando, informalmente, é: do instrução_simples; while (expressão); ou do { lista_de_instruções } while (expressão); Comando for()O comando for() permite uma forma mais elaborada de loop, com controle no início do bloco de repetição. #include <stdio.h>
main()
{
int i;
for (i=0;i<10;i++)
printf("i =%d\n",i);
}
A estrutura do comando é: for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) { instrução_simples; ou for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) { lista_de_instruções } Aninhamento de loops#include <stdio.h>
main()
{
int i,j;
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
}
printf("valor de j = %d\n", j);
}
printf("valor de i = %d\n", i);
}
}
Comando gotoO comando goto é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL. Exemplo: main()
{
int i;
i=0;
PONTO1:
printf("Laço de número %d\n", i);
i++;
if (i<10)
goto PONTO1;
}
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando. Em alguns casos de tratamento de erro pode ser interessante o uso do goto. Leia um pouco mais sobre o goto aqui. Loop InfinitoÉ possível implementar loops infinitos com qualquer uma das instruções acima. Exemplo com comando for: main()
{
for(;;) {
/* Este bloco se executará infinitamente */
}
}
ou com o comando while: main()
{
while(1) {
/* Este bloco se executará infinitamente */
}
}
Uso de break para sair de loopsEm exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break: #include <stdio.h>
main()
{
int i,j;
for (i=0;i<10;i++) {
if (i==5)
break;
}
printf("valor de i=%d\n", i);
}
Note que o break sempre sai do loop mais próximo a ele. #include <stdio.h>
main()
{
int i,j;
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
if (j==1) {
break;
}
printf("valor de j = %d\n", j);
}
if (i==2)
break;
("valor de i = %d\n", i);
}
}
Uso do continue para prosseguir no início do loop#include <stdio.h>
main()
{
int i,j;
for (i=0;i<3;i++) {
if (i==1) {
continue;
}
printf("valor de j = %d\n", j);
for (j=0;j<4;j++) {
if (j==1) {
continue;
}
printf("valor de j = %d\n", j);
}
}
}
Usando o gdb para depurar programasÈ possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o debugger gdb que é hoje amplamente utilizado por desenvolvedores. Seja o programa armazenado no arquivo teste.c:#include <stdio.h>
main()
{
int x,y;
x = 2;
y = 0;
while (y<5)
x++;
printf ("Valor de x = %d\n",x);
}
Para que um programa possa ser depurado, devemos compilá-lo da forma: gcc -g teste.c -o teste
O gdb pode então ser chamado da forma: gdb teste Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar um breakpoint na entrada da função pode-se fazer: b main Para executar o programa basta fazer o comando run: r A execução para no breakpoint. A instrução mostrada ainda vai ser executada. Para acompanhar o valor de variáveis pode-se colocá-las em display: display x display y Para execução passo a passo pode-se utilizar o comando next: n Para ver o Para ver o conteúdo de uma variável pode-se ainda fazer o comando print: print x Usando funções da biblioteca matemáticaPara usar as funções matemáticas da biblioteca padrão, fazer os seguintes passos:
#include <stdio.h>
#include <math.h>
main()
{
double x,y; /* declaração de duas variáveis reais */
printf ("Entre com o valor de x ");
scanf("%lf",&x);
y = sqrt(x);
printf ("Raiz de x = %lf", y);
}
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (double).
gcc ex1.c -o ex1 -lm EXERCÍCIOS
/* rand example: guess the number */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main ()
{
int iSecret, iGuess;
/* initialize random seed: */
srand ( time(NULL) );
/* generate secret number: */
iSecret = rand() % 10 + 1;
do {
printf ("Guess the number (1 to 10): ");
scanf ("%d",&iGuess);
if (iSecret<iGuess)
printf ("The secret number is lower\n");
else {
if (iSecret>iGuess)
printf ("The secret number is higher\n");
}
} while (iSecret!=iGuess);
printf ("Congratulations!\n");
return 0;
}
srand ( time(NULL) ); iSecret = rand() % 10 + 1;
aaaaaaaaaa a a aaaaaaaaaa
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras. b) Antes de executar o programa tente inferir todos os valores finais das variáveis. |
AULA 7 DIA 2/09/2013 |
---|
AULA 7 DIA 2/09/2013ObjetivosO aluno deverá ser capaz de:
Quebrando um problema em subproblemas: SUBPROGRAMASPROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.
Note que a variável CONT_ACESSO é iniciada com zero e incrementada a cada erro no fornecimento da senha. A atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser interpretada da forma: acesse o valor de CONT_ACESSO e some 1 a este valor. Coloque o resultado novamente em CONT_ACESSO (o conteúdo anterior é sobrescrito!) Neste procedimento pode ser observado que:
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo? Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema. Inicialmente, vamos construir três subprogramas:
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados por vírgula. PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMASPara tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma. Estes valores são passados através de variáveis especiais que chamamos de parâmetros. Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação do subprograma são copiados para uma variável do subprograma. Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável repassada na invocação do subprograma. Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro. EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado. A função fatorial é definida por: Neste fluxograma, o subprograma denominado CalcFatorial recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial. O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3. Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos qualquer subrprograma de função (independente de retornar valor).
Exemplo de Função usando pseudo-códigoSeja uma função que retorna a média de 5 números reais passados como parâmetros:
|
AULA 8 DIA 5/09/2013 |
---|
AULA 8 DIA 5/09/2013ObjetivosFixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor. Exercícios de fixação de chamada de funções com parâmetros
void plotar_fig(int margem, int lado, char car1, char car2, char c3) Exemplo de uso: plotar_fig(6,5,'A','B','X') A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:
|
AULA 9 DIA 9/09/2013 |
---|
AULA 9 DIA 9/09/2013ObjetivosO aluno deverá:
ARRAYS UNIDIMENSIONAIS (VETORES)Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento. PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5. DADO DE ENTRADA: Os 10 números armazenados em VET1 DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para verificar se é maior que a média. Definindo e usando vetores no CUm vetor pode ser facilmente definido no C da forma: TipoVetor NomeDoVetor[dimensao]; O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C: #include <stdio.h>
main()
{
int vet1[5],vet2[5];
int i;
for(i=0;i<5;i++) {
printf("Entre com vet[%d] => ",i);
scanf("%d",&vet1[i]);
vet2[i]=vet1[i]*5;
}
/* para conferir- vamos imprimir o conteúdo de vet2 */
for(i=0;i<5;i++)
printf("vet2[%d] => %d\n",i,vet2[i]);
}
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor: main()
{
float x[10]; /* vetor com 10 floats */
int i;
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */
x[9] = x[0] + 2.5;
printf("Entrar com o número na posição 5\n");
scanf("%f",&x[5]);
i=2;
x[i*2]=i*1.5; /* usando uma expressão como índice */
while (i<8) { /* usando loop para acessar o vetor */
x[i]=0.0;
i++;
}
}
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0 Iniciando vetores em CPode-se iniciar um vetor da forma: #include <stdio.h>
void main()
{
int x[10] = {2,4,7,-5,3,2,3,4,9,10}
printf("%d\n", x[2]);
}
Passando vetores como parâmetrosVetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir: #include <stdio.h>
void ler_vet(int aux[5])
{
int i;
for (i=0;i<5;i++) {
printf("aux[%d] <== ",i);
scanf("%dd",&aux[i]);
}
}
main()
{
int vet[5], i;
ler_vet(vet);
for (i=0;i<5;i++)
printf("vet[%d]=%d\n",i,vet[i]);
}
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso. Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. Exercícios
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).
|
AULA 10 DIA 12/09/2013 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AULA 10 DIA 12/09/2013Objetivos
Tipo CharEm aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone. Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo char, que na prática é um número inteiro de byte. Exemplo #include <stdio.h>
main ()
{
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */
scanf("%c",&z);
printf("Caracter lido = %c\n",z);
printf("Caracter lido = %d\n",z);
printf("Caracter lido = %x\n",z);
if (z==x)
printf("Iguais 1\n");
if (z==y)
printf("Iguais 2\n");
if (z==w)
printf("Iguais 3\n");
}
Armazenamento de cadeias de caracteres em vetoresUma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated". Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação: Estamos assumindo que cada caracter é armazenado em um byte. Uma string terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a string está armazenada em um vetor CADEIA cujo tamanho excede ao da string. Os bytes que se seguem ao zero podem ser considerados lixo. Processando cadeias de caracteresSabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA. EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia. EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências. EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma. Vetor de CharÉ possível definir vetores do tipo char. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL), Exemplo: Fazer um programa para computar o número de caracteres de uma cadeia (string) lida pelo teclado.Use o comando while.#include <stdio.h>
void main ()
{
char alfa[50];
int i=0;
printf ("Entre com a cadeia: ");
scanf("%s",alfa);
while(alfa[i]!=0)
i++;
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);
}
Exercício
|