PRG-2012-1-ERALDO

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

Índice

Dados Gerais

Nome do Professor: Eraldo Silveira e Silva

email: eraldo@ifsc.edu.br

Material de Referência

Horário de Atendimento Paralelo

Quarta das 16 às 17h.

Aulas

Dia 27/02/2012

Objetivos

  1. Plano de Aula.
  2. Introdução ao funcionamento do computador.
  3. Tarefa: ler até a página 10 da apostila.

Dia 29/02/2012

Objetivos

  1. Conceitos em lógica de programação: sequência lógica, instruções, algoritmo e programa;
  2. Conceito de variáveis e constantes;
  3. Relação entre variáveis e a memória de um computador;
  4. Fluxogramas: símbolos para representação de instruções simples e decisão;
  5. Desenvolver os primeiros fluxogramas para resolver problemas simples.

Exercícios

  1. Apresentar um fluxograma para ler 3 números e fazer a média;
  2. Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;
  3. Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;
  4. Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;
  5. Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;
  6. Refazer o exercício 4 para calcular a média do maior e do menor número entre os 3 lidos.

Tarefa para casa

Ler capítulos 2, 3 e 4 da apostila.

Dia 05/03/2012

Objetivos

  • Fixar o conceito de fluxograma usando caixas de instruções e de decisão;
  • Fixar o conceito de teste de mesa;
  • Conceituar variáveis inteiras e reais (tipos de variáveis em geral);
  • Fixar o conceito de constantes.
  • Trabalhar expressões com operadores básicos (*,/,+,-).

Solução de exercícios passados para casa

  1. Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;
  2. Construir um fluxograma para ler 3 números e calcular a média do maior e do menor número entre os 3 lidos.

Exercícios em sala

  1. Refazer o exercício para ler 3 números e calcular a média dos dois maiores números lido usando variáveis auxiliares MAIOR e MENOR;
  2. Refazer o exercício 4 para calcular a média do maior e do menor número entre os 3 lidos usando variáveis auxiliareas MAIOR e MENOR;
  3. Construir um fluxograma para ler 6 números e calcular a média dos dois maiores números lidos. Faça um teste de mesa;
  4. Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;

OBS: sempre anote no lado do fluxograma os tipos das variáveis.

Exercícios para casa

  1. Faça um algoritmo para fazer a divisão de dois números reais. Antes de dividí-los deve ser feito um teste de validade. Caso não seja possível dividi-los, deve ser mostrada uma mensagem de erro. Se for possível, deve-se mostrar o resultado da divisão;
  2. Fazer um algoritmo para computar a área e perímetro de um retângulo. Entrar com os dois lados;
  3. Fazer um programa para computar as áreas de um retângulo e de um círculo. O programa deve mostrar uma mensagem indicando qual figura possui maior área;
  4. Considere que a função de uma reta é dada por: . Elabore um fluxograma para calcular o valor de y dado o valor de x.

Dia 6/03/2012

Apresentação dos TCCs

Dia 12/03/2012

Objetivos

  1. Resolver exercícios de casa.
  2. Avaliar a capacidade do aluno elaborar pequenos fluxogramas para resolver problemas com sequências simples e caixas de decisão.
  3. Variáveis do tipo cadeia de caracteres.

Avaliação

Elaborar um fluxograma e um teste de mesa para resolver o seguinte problema. Ler o valor de 3 resistores. Calcular o valor da resistência equivalente aos três resistores em série. Na sequência, calcular a corrente que passaria nestas resistências para uma tensão de 5V aplicada a esta resistência. As entradas inválidas (resistência negativa devem ser rejeitadas).

Variáveis tipo cadeia (string)

  1. Elaborar um fluxograma para um sistema de segurança que lê uma senha. Se a senha conferir com uma senha pré-armazenada então a porta deve se abrir.
  2. Estender o programa anterior para ler usuário e senha.
  3. Estender o programa anterior considerando que existem dois usuários (cada um com a sua senha) no sistema.


Dia 14/03/2012

Objetivos

  1. Variáveis do tipo cadeia de caracteres.
  2. Estruturas de repetição (loop simples)
  3. Conceito de subrotina;
  4. Conceito de veriáveis globais ao sistema.

Exercícios

  1. Estender o programa para bloquear um usuário se ele tentar até 3 vezes consecutivas no sistema com a senha incorreta.
  2. Estender o programa para incluir um usuário admin que permite modificar o userid e a senha de um determinado usuário. Considere que a senha do admin é uma constante. Assuma que existem duas posições de memória associadas ao USR1 e USR2, e duas posições associadas a senha (PWD1 e PWD2). Inicialmente estas variaveis são strings vazias.
  3. Considere a existência de um sensor que indica se a porta está aberta ou fechada. Se a porta estiver aberta o sistema simplesmente apresenta uma mensagem de porta aberta. Se a porta estiver fechada ele funciona normalmente.
  4. Estender o programa para que um usuário possa ele mesmo modificar a sua senha.
  5. Estender o programa para que o admin desbloqueie um usuário bloqueado.

Dia 21/03/2012

Objetivos

  1. Variáveis do tipo cadeia de caracteres - visão de vetor de caracteres terminadas em NULL
  2. Mostrar o aspecto de ukma cadeia de caracteres na memória do computador
  3. Estruturas de repetição estilo WHILE com fluxograma para detectar final de cadeia
  4. Reforçar o uso de subrotinas com exercícios para calcular o tamanho da cadeia e para detectar a ocorrência de caracteres na cadeia.

Desenvolvimento da Aula

Um caracter pode ser armazenado em uma "caixa" de memória correspondente a um byte. Basta usar uma codificação adequada, Por exemplo, o uso de código ASCII permite representar a letra A como o byte 41H.

Uma cadeia de caracteres (string) pode ser implementada como uma sequência de caracteres, ou seja, um vetor de caracteres. Para marcar o final da cadeia, muitas linguagens (o C, por exemplo) se utilizada do 0 (NULL) no final da cadeia.

Exercícios

  1. Elaborar um fluxograma para computar o tamanho de uma cadeia de caracteres que foi lida para uma varíavel.
  2. Elaborar um fluxograma para computar o número de ocorrências do caracter "a" em uma cadeia lida pelo teclado.
  3. Implementar um fluxograma para tornar maiúsculas todas as vogais de uma cadeia de caracteres.

Dia 26/03/2012

Objetivos

  • Reforçar o conceito de subprogrmas, parâmetros passados e retornados
  • Exercícios sobre cadeia de caracteres

Exercícios

  1. Elaborar um fluxograma para encapsular em subrotina o algoritmo de computação do tamanho de uma cadeia de caracteres

passada como parâmetro. A subrotina deve retornar o tamanho da cadeia.

ComputarTamnhoString.jpg

  1. Elaborar um fluxograma para comparar o tamanho de duas cadeias que foram fornecidas pelo teclado. Uma mensagem deve ser mostrada caso a primeira cadeia seja maior, menor ou igual a segunda cadeia;

ComparaTamanhoDuasCadeias.jpg

  1. Elaborar um fluxograma para encapsular em uma subrotina, o algoritmo de comparação de tamanho de duas cadeias. Estas cadeias são fornecidas como parâmetro. O procedimento deve retornar 0 se as cadeias são iguais, 1 se a primeira é maior que a segunda e -1 se a primeira é menor que a segunda;
  2. Elaborar um fluxograma para receber uma cadeia de caracteres pelo teclado. O procedimento deve mostrar uma mensagem indicando se a cadeia contém a cadeia "casa".

Dia 26/03/2012

Objetivos

  1. tipo caracter
  2. Exercícios preparatórios para a avaliação.

Exercícios

  1. Elaborar uma subrotina na forma de fluxograma, para computar o número de ocorrências do caracter 'a' em uma cadeia de caracteres passada como parâmetro. A subrotina deve retornar o número de caracteres;
  2. Modificar o exercício anterior para receber o caracter como parâmetro, generalizando a solução;
  3. Elaborar uma subrotina para receber uma cadeia de caracter repassada como parâmetro (por referência). A subrotina deve inverter a cadeia;
  4. Elaborar uma subrotina para recer uma cadeia de caracteres (por referência) e um caracter como parâmetro. A subrotina deve acrescentar este caracter no final da cadeia;
  5. Refazer o exercício para acrescentar o caracter no início da cadeia.

Dia 02/04/2012

Objetivos

  1. Exercícios de prepaparação para avaliação

Exercícios

  1. Elaborar uma subrotina para receber uma cadeia de caracter repassada como parâmetro (por referência). A subrotina deve inverter a cadeia;
  2. Elaborar uma subrotina para recer uma cadeia de caracteres (por referência) e um caracter como parâmetro. A subrotina deve acrescentar este caracter no final da cadeia;
  3. Refazer o exercício para acrescentar o caracter no início da cadeia.
  4. Refazer o exercício para inserir o caracter após a primeira ocorrência de uma caracter 'a";
  5. Refazer o exercício anterior para repassar o caracter como parâmetro.

Dia 04/04/2012

Objetivos

  1. Avaliação (primeiras duas aulas)

Exercícios de referência

  1. Elaborar um fluxograma de um programa principal que lê três números reais. O procedimento deve mostrar (imprimir) todos os números acima da média calculada entre os três números. Mostrar um teste de mesa mostrando a evolução das variáveis do problema (incluindo a média);
  2. Elaborar um fluxograma de uma subrotina que recebe uma cadeia de caracteres como parâmetro e um caracter. A subrotina deve retornar o número de ocorrências deste caracter. Fazer um exemplo, na forma de fluxograma, de como esta subrotina pode ser chamada;
  3. Elaborar um fluxograma de uma subrotina que recebe uma cadeia de caracteres como parâmetro (passada como referência). A subrotina deve excluir todas as vogais da cadeia. Por exemplo: se a cadeia for "casa", deve ficar "cs"

Dia 08/04/2012

Objetivos

  1. Explorar vetores de inteiros e reais

Exercícios

  1. Elaborar um fluxograma para ler 10 números reais para um vetor X.
  2. Modificar o exercício anterior para ler N números reais para um vetor.
  3. Modificar o exercício anterior para fazer também a média dos N números.
  4. Colocar o procedimento anterior na forma de uma subrotina que recebe o vetor X como parâmetro e retorna a média.
  5. Elaborar um fluxograma para ler os N números para um vetor X e mostrar o número de ocorrências dos números que estão acima da média. Usar a subrotina de cálculo da média já implementada anteriormente.
  6. Elaborar um fluxograma de uma subrotina que que recebe dois vetores X1 e X2 e seus respectivos tamanhos N1 e N2. A subrotina deve retornar 0 se a média dos elementos de X1 for maior que X2, deve retornar 1 se a média de X1 for menor que a de X2 e retornar 2 se a média for igual a X2.

Dia 11/04/2012

Objetivos

  1. Entrega da avaliação
  2. Introdução a linguagem C
  3. Conceito de programa fonte, objeto e executável
  4. O processo de compilação com gcc
  5. A função main()
  6. Declaração de variáveis inteiras e reais
  7. Função de entrada de dados scanf() e de saída de dados


Introdução a linguagem C

Conceito de programa fonte, objeto e executável

O processo de compilação com gcc

O processo de desenvolvimento do programa envolve:

  • Editar o programa com um editor de texto tal como o vi ou gedit;
  • Salvar o programa com a terminação ".c" (ou ".h") se for um cabeçalho;

Exemplo: salve o pŕograma abaixo como teste.c

 

#include <stdio.h>

main()
{
  printf("Alo Mundo\n");
}
  • Compilar o programa com o gcc:
 gcc teste.c -o teste
  • Testar o programa:
./teste

Declarando variáveis inteiras e reais locais

No "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; 
}

Funções de entrada e saída de dados

No "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.


 
#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); 
}

Exercícios

  1. Ler 2 números reais e imprimir a média deles.
     
    #include <stdio.h>
    main()
    {
       float num1, num2, media;
    
       printf("Entre com o primeiro numero ");
       scanf ("%f", &num1);
    
       printf("Entre com o segundo numero ");
       scanf ("%f", &num2);
    
       media = (num1 + num2) / 2;
    
       printf ("\nMedia = %f \n", media);
    }
    
  2. Ler 3 números reais e imprimir o produto dos três.
  3. Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.
  4. Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).

Dia 16/04/2012

Objetivos

  • instrução de decisão if() e if() else;
  • instruções de atribuição e expressões;
  • tipos de dados: int, float, double
  • mapeando um fluxograma (principal) em um programa C

LINK PARA O EDITOR YED

Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:

Se baixar o zip com o java, descompactar, entrar no diretório e executar com:

java -jar yed.jar


Instrução 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);
  }
 
}

Exercícios

  1. Fazer um fluxograma para calcular a média de três números reais que são fornecidos pelo teclado e então imprimir uma mensagem mostrando os números que são maiores que a média.
  2. Implementar o fluxograma anterior em C.
  3. Implementar um programa para calcular a hipotenusa de um triângulo retângulo cujos catetos são fornecidos pelo teclado.OBS: Usar a função sqrt([1]) cujos parâmetros e retorno são do tipo double. Usar o include math.h e o comando: gcc -lm exemplo4.c -o exemplo4
  4. Incrementar o programa anterior para que seja calculada a área do triângulo.

Dia 16/04/2012

Objetivos

  • fixar conceitos da aula anterior através de exercícios e explorando:
    • instrução de decisão if() e if() else;
    • instruções de atribuição e expressões;
    • tipos de dados: int, float, double
    • mapeamento de um fluxograma (principal) em um programa C
  • uso de define
  • aninhamento de ifs

Revisão do processo de compilação

ProcessoCompilacao.jpg

USO de DEFINE

O define é um comando do pré-processador do C. Observe abaixo como ele pode ser usado

 
#include <stdio.h>
#define PI 3.1416

main()
{
 
  float x; /* declaração de uma variável real */
  float y;  /* declaração de uma variável real */

  printf ("Entre com o valor de x ");
  scanf("%f",&x);

  y = 2*PI*x;
}

Usando funções da biblioteca matemática

Para usar as funções da biblioteca matemática padrão, fazer o seguinte:

  • No arquivo-fonte incluir o header math.h da biblioteca matemática:
 
#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);
}
  • Compilar e linkar o arquivo da forma:
 gcc -lm ex1.c -o ex1

Exercícios

  1. Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.
  2. Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[2] e atan [3] da biblioteca matemática. Como converter:
    ou
  3. Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente a,b e c.
  4. Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:
  5. Implementar um programa para converter radianos em graus;
  6. Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.

DIA 23/04/2012

OBJETIVOS

  • Comando de repetição while()
  • Relação de instruções C com blocos do fluxograma;
  • Exercícios

Comando while ()

O comando while permite implementar loops com controle no início do loop.

#include <stdio.h>
main() 
{
  int contador;
  
  contador=0;
  while (contador<5) {  
     printf("valor do contador =  %d\n", contador);
     contador=contador+1;
  }
}


Relação de comandos do fluxograma com Programa C

Fluxograma C Comentário
Fluxo1.jpg
main()
{
   printf("Alo Mundo\n");
}

O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função main() e a última instrução é a última do main()

Fluxo2.jpg
if (y>5)
  x=x+1;
Fluxo3.jpg
if (y>5) {
  x=x+1;
  z=z+1;
}
Observar que quando existe mais de uma instrução simples sob o controle do if, deve-se usar as chaves (conceito de bloco).
Fluxo4.jpg
if (y>5) {
  x=x+1;
  z=z+1;
} else {
  x=x-1;
  z=z-1;
}
comando if com a parte else (SENÃO)
Fluxo5.jpg
while(contador<5) {
   printf("Entre com x\n");
   scanf("%f",&x);
   soma=soma+x;
   contador = contador + 1;
}
comando while() aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.
Fluxo6.jpg
if (z>5) {
   while(contador<5) {
        printf("Entre com x\n");
        scanf("%d",&x);
        soma=soma+x;
        if (soma>150) 
           y=z+x;
   }
   if (z == 10)
      y=y+1;
}
Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.

Exercícios

  1. Fazer um fluxograma e um programa em C que lê 5 números e mostra a quantidade de números lidos que é maior que a média destes números.
    #include <stdio.h>
    
    main()
    {
    	float x,y,z,v,w,media;
            int contador;
    
            contador = 0;
            /* entradad de 5 números */
    	printf("Entre com numero\n");
            scanf("%f",&x);
    	printf("Entre com numero\n");
            scanf("%f",&y);
    	printf("Entre com numero\n");
            scanf("%f",&z);
    	printf("Entre com numero\n");
            scanf("%f",&v);
    	printf("Entre com numero\n");
            scanf("%f",&w);
    
            media = (x+y+z+v+w)/5;
    
            if(x>media)
                contador = contador + 1;
            if(y>media)
                contador = contador + 1;
            if(z>media)
                contador = contador + 1;
            if(v>media)
                contador = contador + 1;
            if(w>media)
                contador = contador + 1;
             
            printf("media = %f\n", media);
            printf ("Numero de numeros acima da media = %d\n", contador);
    }
    
  2. Fazer um fluxograma e um programa em C para calcular a média de números reais positivos que serão fornecidos pelo teclado. O final da entrada de dados se dá quando um número negativo for fornecido. Usar o comando while()

Ex2Aula23-04-2012.jpg

  1. Implementar um programa C que lê um número inteiro positivo e produz na saída: 0 1 2 3 <número>. Usar o comando while(). Assuma que o usuário sempre fornece números positivos, para facilitar.
  2. Modificar o programa anterior para o caso do número fornecido ser negativo. Neste caso o programa dar uma mensagem e se encerrar.
  3. Modificar o programa anterior para o programa perguntar novamente caso o número seja negativo ou zero.

DIA 2/05/2012

OBJETIVOS

  • Definir a data da avaliação/recuperação (MARCAMO 14/05/2012);
  • Expressões com operadores relacionais e lógicos;
  • Exercícios

Expressões relacionais

Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:

Operador Significado
> maior que
>= maior ou igual que
< menor que
<= menor ou igual que
== igual a (se o operando a esquerda é maior que o da direita)
!= diferente de (se o operando a esquerda é diferente do da direita)
Note que o valor resultante de uma expressão relacional é 0 (se falso) ou 1 (se verdadeiro) 

Exemplo:

#include <stdio.h>

main()
{
  int x,y;
  x = 10;
  y = (x>10);
  printf ("valor de y = %d\n", y);
  x = 12;
  y = (x>10);
  printf ("valor de y = %d\n", y);
}
NOTA IMPORTANTE: no C qualquer expressão que resulte em 0 é considerada FALSA e 
                 qualquer expressão que resulte em diferente de 0 é VERDADEIRA

Expressões Lógicas

Os operadores lógicos permitem a construção de expressões lógicas através dos seguintes operadores:

Operador Significado
&& AND
|| OR
!= NOT
NOTA: Uma expressão lógica também resulta em 0 ou 1

Exemplo:

#include <stdio.h>


main()
{
  int x,y;
  x=5;
  y=(x==5);
  printf ("valor de y = %d\n", y);
  y=(x==12); 
  printf ("valor de y = %d\n", y); 
}

Construindo expressões com os operadores lógicos e relacionais

Agora podemos construir expressões mais complexas, conforme o exemplo:

#include <stdio.h>

main()
{
  int x,y;
  printf("Entre com x\n");
  scanf("%d",&x);
  printf("Entre com y\n");
  scanf("%d",&y);
  if (x>6 && y <=5)
      printf("X é menor que 6 E y é menor ou igual 5\n");
  printf ("O valor da expressão x>6 && y <=5 é %d\n", x>6 && y <=5 );
}
SEMPRE É BOM REPETIR: no C qualquer expressão que resulte em 0 é considerada FALSA e 
                 qualquer expressão que resulte em diferente de 0 é VERDADEIRA

Exercícios

  1. Elaborar um fluxograma e implementar um programa em C para ler 10 números reais e calcular a média dos números que estiverem na faixa de 10.5 e 50.5 (incluindo os limites). Ex1Aula-02-05-2012.jpg
    #include <stdio.h>
    main()
    {
      int cont=0,cont_aux=0;
      float x,media, soma_acum=0;
    
      while (cont<10) {
        printf("Entre com x\n");
        scanf("%f",&x);
        if (x>=10.5 && x<=50.5) {
           cont_aux = cont_aux + 1;
           soma_acum = soma_acum + x;
        }
        cont = cont + 1;
      }
      if (cont_aux>0) {
          media = soma_acum / cont_aux;
          printf("media de %d numeros = %f\n", cont_aux, media);
      }else 
          printf("Não existem números lidos na faixa\n");
    }
    
  2. Incremente o exercício anterior para calcular também a média dos números que não estiverem na faixa indicada.
  3. Em uma disciplina de introdução a programação, a avaliação é realizada da seguinte forma: se o aluno obter média de 3 avaliações igual ou superior a 7.0 e a nota de um trabalho final igual ou superior a 6.0, o aluno passa. Se a média das avaliações for igual ou superior a 9.0 o aluno passa independentemente do trabalho. Se o aluno obtiver 10 no trabalho, ele passa independente das avaliações. Faça um programa em C cuja entrada são as notas das avaliações e do trabalho. Em qualquer outra situação o aluno reprova.O programa deve imprimir se o aluno passa ou reprova.

DIA 7/05/2012

OBJETIVOS

  • Operadores aritméticos;
  • Vetores
  • Exercícios.

Operadores aritméticos

Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:

Operador Significado
% resto de uma divisão
++ incrementa o operando em uma unidade
-- decrementa o operando em uma unidade

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;

Vetores

Um vetor pode ser facilmente definido no C:

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]);
  /* usando uma expressão como índice */
  i=2;
  x[i*2]=i*1.5;
  /*usando loop para acessar o vetor */
  while (i<8) {
     x[i]=0.0;
     i++;
  }
}
NOTA: vetores sempre começam na posição 0

Exercícios

  1. Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando while.
    #include <stdio.h>
    
    main()
    {
    	float x[10];
    	int i;
    
     	i=0;
     	while (i<10) {
    		printf("Entre com x[%d] -> ", i);
    		scanf("%f",&x[i]);
     		i++;
    	}	
    }
    
  2. Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.
    #include <stdio.h>
    #define TAM_VETOR 10
    
    main()
    {
    	float x[TAM_VETOR], soma_acum=0, media;
    	int i;
    
     	i=0;
     	while (i<TAM_VETOR) {
    		printf("Entre com x[%d] -> ", i);
    		scanf("%f",&x[i]);
    		soma_acum = soma_acum + x[i];
     		i++;
    	}	
    	media = soma_acum/TAM_VETOR;
    	printf("\nMedia vetor = %f\n", media);
    }
    
  3. Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.
    #include <stdio.h>
    #define TAM_VETOR 10
    
    main()
    {
    	float x[TAM_VETOR], soma_acum=0, media;
    	int i,cont;
    
    	/* Leitura dos números e
    		cálculo da soma acumulada */
     	i=0;
     	while (i<TAM_VETOR) {
    		printf("Entre com x[%d] -> ", i);
    		scanf("%f",&x[i]);
    		soma_acum = soma_acum + x[i];
     		i++;
    	}	
    	
    	/* Cálculo da média */
    	media = soma_acum/TAM_VETOR;
    	printf("\nMedia vetor = %f\n", media);
    	
    	/* Cáculo da quantidade de 
    		números acima da média */
     	i=0;
    	cont=0;
     	while (i<TAM_VETOR) {
    		if (x[i] > media) 
    			cont++;
     		i++;
    	}	
    	printf("Quantidade acima da média = %d\n",cont);
    }
    
  4. Implementar um programa em C para ler dois vetores de inteiros, cada um com 5 elementos e então computar um terceiro vetor que é a soma destes vetores (elemento 0 com elemento 0, elemento 1 em com elemento 1 etc);
    #include <stdio.h>
    #define TAM_VETOR 10
    
    main()
    {
    	float x[TAM_VETOR], y[TAM_VETOR], vetor_soma[TAM_VETOR];
    	int i=0;
    	while (i<TAM_VETOR) {
    		printf("Entre com x[%d] -> ", i);
    		scanf("%f",&x[i]);
    		printf("Entre com y[%d] -> ", i);
    		scanf("%f",&y[i]);			
    		vetor_soma[i] = x[i] + y[i];
    		printf("vetor_soma[%d] -> %f\n", i,vetor_soma[i]);
                    i++;
    	}
    }
    

DIA 9/05/2012

OBJETIVOS

  • Reforçar a necessidade de indentação do código
  • Exercícios de preparação para avaliação

Indentação

Indentação Estilos

Exercícios

  1. Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.
    main()
    {
      int x,y;
      float media;
    
      printf("Entre com x\n");
      scanf("%d",&x);
      printf("Entre com y\n");
      scanf("%d",&y);
      if (x==y)
         printf("números iguais\n");
      else {
         printf("números diferentes\n");
         media = (x+y)/2.0;
      }
    }
    
  2. Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.
    main()
    {
       int num1,num2,num3,num4;
       int soma1,soma2;
    
       printf("Entre com num1\n");
       scanf("%d", &num1);
       printf("Entre com num2\n");
       scanf("%d", &num2);
       printf("Entre com num3\n");
       scanf("%d", &num3);
       printf("Entre com num4\n");
       scanf("%d", &num4);
    
       soma1 = num1+num2;
       soma2 = num3+num4;
       
       if(soma1<=soma2)
          printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");
    }
    
  3. Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.
    main()
    {
       float num1,num2;
       int operacao;
    
       printf("Entre com num1\n");
       scanf("%f", &num1);
       printf("Entre com num2\n");
       scanf("%f", &num2);
    
       printf("Entre com a operacao\n");
       scanf("%d", &operacao);   
    
       /* Esta solução pode ser otimizada - veremos
          mais tarde */
       if (operacao>=1 && operacao <=4) {
          if (operacao==1) 
             resultado = num1 + num2;
          if (operacao==3) 
             resultado = num1 - num2;
          if (operacao==3) 
             resultado = num1 * num2;
          if (operacao==4) {
             if (num2!=0)
                 resultado = num1 / num2; 
             else 
                 printf("Divisao por zero\n");
          }
          printf("O resultado da operacao %d é %f\n",operacao,resultado);
       } else {
           printf("Operacao inválida");
       }
    }
    
  4. Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.
  5. Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.Tabela de Cores
  6. Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.
  7. Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.
  8. Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada.
  9. Elaborar um fluxograma e um programa para ler N números reais para um vetor e, em seguida, computar a média de todos os números maiores ou iguais a 5.5. A média deve ser impressa.
  10. Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;

DIA 14/05/2012

AVALIAÇÃO 1

DIA 16/05/2012

OBJETIVOS

  • Exercícios da prova
  • Comando de repetição do while

Exercícios da Avaliação

1.Considere o fluxograma abaixo. a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras. b) Coloque todos os valores finais das variáveis do programa.

Ex1prova-11-05-2012.jpg

main()
{
  int i,k,x;

  i=0;
  k=2;
  x=0;
  
  while (i<5) {
     if (i==3) {
        x = x+2;
        k = x*2;
     } else {
        x = x+1;
     }
     i = i+1;
  }

  k = i;
}

Valores de variáveis: x -> 6 i -> 5 k -> 5

2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.

#include <stdio.h>

main()
{
  int n1,n2,n3,n4,n5,soma;
  float media;

  printf("Entre com n1\n");
  scanf("%d",&n1);
  printf("Entre com n2\n");
  scanf("%d",&n2);
  printf("Entre com n3\n");
  scanf("%d",&n3);
  printf("Entre com n4\n");
  scanf("%d",&n4);
  printf("Entre com n5\n");
  scanf("%d",&n5);

  media = (n1 + n2)/2;
  soma = n3 + n4 + n5;
  
  if (media<=soma)
     printf("media menor ou igual a soma\n"); 

}

3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. A média deve ser impressa.

#include <stdio.h>

main()
{
   float x[10],soma_acum,media;
   int i,cont_aux;

   i=0;
   soma_acum = 0.0;
   cont_aux = 0;

   while (i<10) {
      scanf("%f", &x[i]);
      if (x[i]>5.5 && x[i]<=11.5) {
          cont_aux++;
          soma_acum=soma_acum+x[i];
      } 
      i=i+1;
   }
   
   if (cont_aux == 0)
      printf("Impossivel dividir por zero\n");
   else {
       media = soma_acum / cont_aux;
       printf ("Media = %f\n", media);
   }

}

4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências forem negativas, mostrar uma mensagem e encerrar o programa.

main()
{
   float r1,r2,re_serie,re_paralelo;
   
   printf("Entre com r1\n");
   scanf("%f",&r1);
   printf("Entre com r2\n");
   scanf("%f",&r2);

   if (r1>0 && r2>0) {
      re_serie = r1 + r2;
      re_paralelo = (r1*r2)/(r1+r2);
   } else 
      printf("As resistencias devem ser maior que zero\n");
}

Comando do while

Fluxograma C Comentário
FluxoDoWhile-Eraldo.jpg
contador = 0;
do {
        scanf("%d",&x);
        soma=soma+x;
        if (soma>150) 
           y=z+x;
        contador++;
} while(contador<5);
Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.


  1. Implementar um programa em C para ler 10 números inteiros para um vetor usando o comando do while.

Aula Dia 21/05/2012

Objetivos

  1. tipo char
  2. strings
  3. scanf e printf para strings

Tipo Char

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;
 
  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");
}

Exercício

  1. Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.
#include <stdio.h>

main()
{
  float num1,num2,resultado;
  char oper;

  printf("\nEntre com num1 -> ");
  scanf ("%f",&num1);
  printf("\nEntre com num2 -> ");
  scanf ("%f",&num2);
  printf("\nEntre com operador ");
  scanf (" %c",&oper);

  if (oper=='+') 
      resultado = num1 + num2;
  if (oper=='-') 
      resultado = num1 - num2;
  if (oper=='x') 
      resultado = num1 * num2;
  if (oper=='/') 
      resultado = num1 / num2;

  printf("\nResultado = %f", resultado);
}

Limpando sujeira do teclado

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);
}

Iniciando uma cadeia na declaração

#include <stdio.h>
void main ()
{
   char alfa[50]="IFSC-SJ";

   printf ("\nNumero de caracteres em %s\n", alfa);
}

Exercícios

  1. Implementar um programa para contar o número de caracteres 'a' de uma string fornecida pelo teclado.
    #include <stdio.h>
    main ()
    {
       char alfa[50];
     
       int cont=0, i=0;
     
       printf ("Entre com a cadeia: ");
       scanf("%s",alfa);
       while(alfa[i]!=0) {
    	if (alfa[i] == 'a')
    		cont++;
            i++;
       }
       printf ("\nNumero de caracteres 'a' em %s = %d \n", alfa, cont);
    }
    
  2. Modificar o exercício anterior para detectar o número de ocorrências da sequência "ab" em uma string fornecida pelo teclado.
#include <stdio.h>
main ()
{
   char alfa[50];
 
   int cont=0, i=0;
 
   printf ("Entre com a cadeia: ");
   scanf("%s",alfa);
   while(alfa[i]!=0) {
	if (alfa[i] == 'a' && alfa[i+1] == 'b')
		cont++;
        i++;
   }
   printf ("\nNumero de sequencias ab em %s = %d \n", alfa, cont);
}
  1. Considere um sistema de controle de acesso por senha. A senha é armazenada em um vetor de caracteres fixada no programa. Implemente o programa que abre uma porta se a senha estiver correta. Simule a abertura com uma mensagem.
#include <stdio.h>
main ()
{
   char senha_arm[10]="beta";
   char senha_lida[10];
 
   int i=0;
 
   printf ("Entre com a senha: ");
   scanf("%s",senha_lida);
   while((senha_lida[i]==senha_arm[i]) && senha_arm[i]!=0) {
        i++;
   }
   if(senha_lida[i]==senha_arm[i])
       printf("Abrir porta\n");
   else 
       printf("Senha incorreta\n");
}
  1. Implementar um programa em que o usuário fornece o código de um resistor e o programa fornece o valor em Kohms.

Aula Dia 23/05/2012

Objetivos

  • Funções
  • Exercícios com strings

Funções

Um programa C complexo pode ser dividido em várias funções além da função main. Uma função é um pedaço de código que executa uma atividade específica e que pode ser chamada (invocada) a partir de outras funções. Ela pode conter as suas próprias variáveis que não serão vistas por outras funções. Uma função pode ser parametrizada, ou seja, receber parâmetros (dados de entrada) e retornar um valor (dado de saída).

Exemplo

#include <stdio.h>

/*
  Função que soma dois números inteiros e retorna o resultado da soma.
  Parâmetros: ''a'' e ''b'' => São os dois números a serem somados
  Retorno: retorno do tipo inteiro que é a soma dos números
*/
int somar_nums (int a, int b)
{
  int resultado;
  resultado = a + b;
  return resultado;
}

void msg_inicial()
{
  printf("Alo Mundo\n");
  printf("Tem alguem ai???\n");
}

main()
{
  int resultado;
  int x,y

  msg_inicial();
  resultado = somar_nums(4,5);  /* chamada de função */
  printf("Resultado = %d\n", resultado);
  x = 4;
  y = 6;
  resultado = somar_nums(x,3); /* chamada de função */
  printf("Resultado = %d\n", resultado);  
  resultado = somar_nums(x,y*2); /* chamada de função */
  printf("Resultado = %d\n", resultado); 
  printf("Resultado = %d\n", somar_nums(x,y*x)); 
}

Observe que se uma função retorna um valor então na declaração da função deve ser especificado o TIPO de retorno. Uma (ou mais do que uma) instrução return deve retornar o valor. Se uma função não retorna valor nenhum ela pode ser declarada com tipo de retorno void

Os parâmetros declarados na função (chamados de parâmetros formais) são variáveis que recebem uma cópia do valor passado na CHAMADA da função.

Exercícios

  1. Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.
    #include <stdio.h>
    
    void comp_num(int a, int b)
    {
       if (a == b)
    	printf("parametros iguais\n");
    }
    
    main()
    {
       int x = 2;
       comp_num(2,4);
       comp_num(2,2);
       comp_num(2,x);
    }
    
  2. Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.
    #include <stdio.h>
    
    int comp_num(int a, int b)
    {
       int aux;
    
       /* o codigo abaixo pode ser otimizado com if elseif */
       if (a == b)
    	aux = 0;
       if(a > b)
           aux = 1;
       if (a < b)
           aux = -1;
    
       return aux;
    }
    
    main()
    {
       int x;
       x = comp_num(2,4);
       printf ("Retorno igual a %d\n", x);
       x = comp_num(2,2);
       printf ("Retorno igual a %d\n", x);
       x = 2;
       x = comp_num(2,x);
       printf ("Retorno igual a %d\n", x);
    }
    
    outra solução seria
    #include <stdio.h>
    
    int comp_num(int a, int b)
    {
       int aux;
    
       /* o codigo abaixo pode ser otimizado com if elseif */
       if (a == b)
    	aux = 0;
       else {
            if(a > b)
                aux = 1;
            else
                aux = -1;
       }
    
       return aux;
    }
    
    main()
    {
       int x;
       x = comp_num(2,4);
       printf ("Retorno igual a %d\n", x);
       x = comp_num(2,2);
       printf ("Retorno igual a %d\n", x);
       x = 2;
       x = comp_num(2,x);
       printf ("Retorno igual a %d\n", x);
    }
    
  3. Implementar uma função chamada imprime_faixa que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). Exemplo: Seja a chamada
     imprime_faixa(4,6);
    
    A saída deve ser: 4 5 6
#include <stdio.h>

void imprime_faixa(int a, int b)
{
   if (b>a) {
        while (a <=b)
		printf("%d ",a++);
        printf("\n");
   }   
}

main()
{
   imprime_faixa(1,3);
   imprime_faixa(2,7);
}

28/05/2012

Objetivos

  • Passando vetores, strings e caracteres como parâmetros
  • Exercícios

Como passar um vetor de caracteres como parâmetro

int str_len(char x[])
{
  int i=0;
  while (char x[i]!=0)
    i++;
  return i;
}

main()
{
  int tam;
  tam - str_len("teste");
}

Exercícios

  1. Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.
    #include <stdio.h>
    
    int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)
    {
       int cont=0;
       if (a1=='a')
    	cont++;
       if (a2=='a')
    	cont++;
       if (a3=='a')
    	cont++;
       if (a4=='a')
    	cont++;
       if (a5=='a')
    	cont++;
       return cont;
    }
    
    main()
    {
      int result_ocor;
    
      result_ocor = num_ocorr_a ('a','a','b','c','a');
      printf("Numero de ocorrencias de a -> %d\n", result_ocor);
    }
    
  2. Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.
    #include <stdio.h>
    
    int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)
    {
       int cont=0;
       if (a1==car_ref)
    	cont++;
       if (a2==car_ref)
    	cont++;
       if (a3==car_ref)
    	cont++;
       if (a4==car_ref)
    	cont++;
       if (a5==car_ref)
    	cont++;
       return cont;
    }
    
    main()
    {
      int result_ocor;
    
      result_ocor = num_ocorr_a ('a','a','b','c','a','x');
      printf("Numero de ocorrencias de a -> %d\n", result_ocor);
    }
    
  1. Implementar uma função converte temperaturas de graus Fahrenheit para Celsius.
    #include <stdio.h>
    
    float converter_fahreiheit_para_celsius (float temp_fahr)
    {
      /* melhorar - retornar -1000 se o valor do parâmetro for inválido */
      return ((temp_fahr-32)/1.8);
    }
    
    main()
    {
      float temperatura_fahre, resultado_celsius;
      printf("Entre com graus Fahrenheit -> ");
      scanf ("%f", &temperatura_fahre);
      resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);
      printf("Conversao = %f\n", resultado_celsius);
    }
    

30/05/2012

Fórum Internacional da Educação

4/06/2012

Objetivos

  • Passando strings como parâmetro de funções;
  • Exercícios

Passando strings como parâmetro de funções - recebendo como vetor

Exempĺo: Uma função que retorna o número de caracteres de uma string (ver fluxograma da aula do dia 26/03/2012):

#include <stdio.h>

int str_len(char vet[])
{
  int index;

  index = 0;
  while (vet[index]!=0)
      index++;

  return(index);
}

void main()
{
  char string1[100];
  int tamanho;

  printf("Entre com uma string => ");
  scanf("%s",string1);
  
  tamanho = str_len(string1);
  printf("\nO tamanho da string  é %d\n", str_len(string1));

  /* Note que o parâmetro passado pode qualquer expressão resultante em string */

  printf("\nO tamanho de uma string constante => %d\n", str_len("IFSC-SJ"));

  /* o parâmetro pode ser inclusive um pedaço da string */

  printf("\nO tamanho de um pedaço de uma string => %d\n", str_len(&string1[2]));    
}

Exercícios

  1. Elaborar uma função que conta o número de ocorrências da letra 'a' em uma string passada como parâmetro.
    #include <stdio.h>
    
    int num_ocorr_a (char x[])
    {
       int  i,cont;
    
       i = 0;
       cont = 0;
       while (x[i]!=0) {
    	if (x[i]=='a')
    		cont++;
            i++;
       }
       return cont;
    }
    
    void main()
    {
       char string[100]="ababababab";
       int num_oc;
    
       num_oc  = num_ocorr_a(string);
    }
    
  2. Melhorar o exercício anterior passando o caracter a ser verificada as ocorrências também como parâmetro.
    #include <stdio.h>
    int num_ocorr (char x[], char letra)
    {
       int  i,cont;
    
       i = 0;
       cont = 0;
       while (x[i]!=0) {
    	if (x[i]==letra)
    		cont++;
            i++;
       }
       return cont;
    }
    
    void main()
    {
       char string[100]="teste";
       int num_oc;
    
       num_oc  = num_ocorr(string,'a');
       num_oc  = num_ocorr(string,'b');
    }
    
  3. Elaborar uma função que compara duas strings e retorna 0 se elas forem iguais e 1 se forem diferentes.

6/06/2012

Objetivos

  • comando for
  • Funções de manipulação de strings da biblioteca;
  • Exercícios

Comando for

Até agora apresentamos dois comandos que permitem realizar loops controlados. Um outro comando muuito usado é o for.

#include <stdio.h>

main()
{
  int i;

  for(i=0;i<10;i++) {
        printf ("Valor de i = %d\n",i);
  }
}

O comando sempre apresenta entre parênteses três expressões separadas por ";"

for(exp1;exp2;exp3) {
  inst1;
  inst2;
  :
}

Inicialmente e SOMENTE uma vez é executada a expressão exp1. Na sequência é avaliada a exp2. Se verdadeira, a instrução ou bloco de instruções é executado. Ao final, a exp3 é executada e exp2 novamente avaliada.

Funções de manipulação de strings da biblioteca

Ver aula 5 da UFMG.

Exercícios

  1. Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.
    #include <stdio.h>
    
    void str_cpy(char auxs1[], char auxs2[])
    {
       int i;
       
       for(i=0;auxs2[i]!=0;i++) 
            auxs1[i]=auxs2[i];
       auxs1[i]=0;
    }
    
    main()
    {
       char str1[100], str2[100];
    
       printf("Entre com a string => ");
       scanf ("%s", str2);
       str_cpy(str1, str2);
       printf("\nString copiada = %s\n", str1);
    }
    

ou

#include <stdio.h>

void str_cpy(char auxs1[], char auxs2[])
{
   int i=0;
   
   do { 
        auxs1[i]=auxs2[i];
   }while(auxs2[i++]!=0);
}

main()
{
   char str1[100], str2[100];

   printf("Entre com a string => ");
   scanf ("%s", str2);
   str_cpy(str1, str2);
   printf("\nString copiada = %s\n", str1);
}
  1. De forma similar ao exercício anterior, implementar uma função similar a função strcat.
    #include <stdio.h>
    
    void str_cat(char auxs1[], char auxs2[])
    {
       int i=0;
       
       /*localizar o final da string de destino*/
      while(auxs1[i]!=0)
                i++;
    
      /* usando a função de cópia já implementada temos */
      str_cpy(&auxs1[i], auxs2);
    }
    
    main()
    {
       char str1[100]="IFSC em ", str2[100]="Sao Jose",  x[]="teste";
    
       str_cat(str1, str2);
       printf("\nString copiada = %s\n", str1);
    }
    
  2. Usando as funções já desenvolvidas ou a biblioteca de funções de manipulação de strings, implementar um programa que lê um usuário e uma senha e, se estas informações forem iguais a um usuário e senha pré-armazenado então uma porta deve se abrir. Uma mensagem deve simular a porta aberta.

11/06/2012

Objetivos

  • Matrizes

Como definir e operar com matrizes no C

Exemplo:

#include <stdio.h>

void main()
{
  int mA[2][3]={ 11,12,13,
                 21,22,23},
      mB[2][3]={1,2,3,
                1,2,3},
      mC[2][3];
  int i,j;

  for(i=0;i<2;i++){
     for(j=0;j<3;j++) {
        mC[i][j] = mA[i][j] + mB[i][j];
     }
  }
  
}

Exercício

  1. implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.
    #include <stdio.h>
    
    void main()
    {
      int mA[2][3]={ 11,12,13,
                     21,22,23},
          mB[2][3]={1,2,3,
                    1,2,3},
          mC[2][3];
      int i,j, soma_ac=0;
      float media;
    
      for(i=0;i<2;i++){
         for(j=0;j<3;j++) {
            mC[i][j] = mA[i][j] + mB[i][j];
            soma_ac = soma_ac + mC[i][j];
         }
      }
      media = soma_ac/6.0;
    }
    

Passando matrizes como parâmetro

#include <stdio.h>


void somar_mat(int aA[][3],int aB[][3], int cC[][3])
{
  int i,j;

  for(i=0;i<2;i++){
     for(j=0;j<3;j++) {
        cC[i][j] = aA[i][j] + aB[i][j];
     }
  }
}

void main()
{
  int mA[2][3]={ 11,12,13,
                 21,22,23},
      mB[2][3]={1,2,3,
                1,2,3},
      mC[2][3];

 somar_mat(mA,mB,mC);
  
}
OBSERVE que matrizes são sempre passadas como referência.

Exercício

  1. Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média da soma destas matrizes.
    #include <stdio.h>
    
    
    float media_soma_mat(int aA[][3],int aB[][3])
    {
      int i,j;
      int soma_ac=0;
      /*int cC[2][3];*/
    
      for(i=0;i<2;i++){
         for(j=0;j<3;j++) {
            /*cC[i][j] = aA[i][j] + aB[i][j];*/
            soma_ac = soma_ac +aA[i][j] + aB[i][j];
         }
      }
      return (soma_ac/6.0);
    }
    
    void main()
    {
      int mA[2][3]={ 
                     11,12,13,
                     21,22,23},
          mB[2][3]={
                    1,2,3,
                    1,2,3};
      float media;
    
      media =  media_soma_mat(mA,mB);
      
    }
    
  2. Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.

Matrizes de caracteres e vetores de cadeias de caracteres

Exemplo

#include <stdio.h>

main()
{
  char TabelaUsuarios[4][50] = {
         "joao",
         "maria",
         "jose",
         "lara",
                                };
  int i;

  for (i=0;i<4;i++)
       printf("%s\n",&TabelaUsuarios[i][0]);
}

Exercício

  1. Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.
    #include <stdio.h>
    #include <string.h>
    
    main()
    {
      char TabelaUsuarios[4][50] = {
             "joao",
             "maria",
             "jose",
             "lara",
                                    };
      int i;
      char userId[50];
      int userEncontrado=1;
    
      scanf("%s",userId);
    
      for (i=0;i<4 && userEncontrado; i++) {
           if( strcmp(userId, &TabelaUsuarios[i][0])==0)
                 userEncontrado=0;
      }
      if (userEncontrado==0)
           printf("Abrir porta!!!\n");
    }
    

13/06/2012

Objetivos

  1. Variáveis globais
  2. Etapa 1 do projeto: controle de acesso
  3. Exercícios

Variáveis Globais

Considere o exercício da aula anterior. Podemos declarar as tabelas de usuários de forma global.

 
#include <stdio.h>
#include <string.h>

char TabelaUsuarios[4][50] = {
         "joao",
         "maria",
         "jose",
         "lara",
};

char userId[50];

main()
{
  int i;

  int userEncontrado=1;

  scanf("%s",userId);
  for (i=0;i<4 && UserEncontrado; i++) {
       if( strcmp(userID, &TabelaUsuarios[i][0])==0)
             userEncontrado=0;
  }
  if (userEncontrado==0)
       printf("Abrir porta!!!\n");
}
Declarando a tabela de usuários de forma global pode-se acessá-la de qualquer função do programa. Uma boa prática é manter o mínimo possível de variáveis globais.

Exercícios

  1. Implementar no programa acima uma função para listar os usuários da tabela de usuários.
    #include <stdio.h>
    #include <string.h>
     
    char TabelaUsuarios[4][50] = {
             "joao",
             "maria",
             "jose",
             "lara",
    };
     
    char userId[50];
     
    void imprimir_tabela_usuarios()
    {
       int i;
      
       for(i=0;i<4;i++)
           printf("%s\n", &TabelaUsuarios[i][0]);
    }
    
    main()
    {
       imprimir_tabela_usuarios();
    }
    
  2. Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha.
    #include <stdio.h>
    #include <string.h>
     
    char TabelaUsuarios[4][50] = {
             "joao",
             "maria",
             "jose",
             "lara",
    };
    
    char TabelaSenhas[4][50] = {
             "aaaa",
             "bbbb",
             "cccc",
             "ddddd",
    };
    
     
     char userId[50];
     char senha[50];
    
    main()
    {
    
      int i;
    
      int userEncontrado=1;
     
      printf("Entre com o usuario\n");
      scanf("%s",userId);
     
      for (i=0;i<4 && userEncontrado; i++) {
           if( strcmp(userId, &TabelaUsuarios[i][0])==0)
                 userEncontrado=0;
      }
      if (userEncontrado==0) {
           printf("Entre com a senha\n");
           scanf("%s", senha);
           i--;
           if(strcmp(senha, &TabelaSenhas[i][0])==0)
                 printf("Abrir porta!!!\n");
           else 
                 printf("Senha inválida\n");
      }
    }
    

Especificação Inicial do problema

TrabalhoFinalFluxogramaPrincipal.jpg

18/06/2012

Objetivos

  1. Comando switch
  2. Desenvolvimento do projeto

Comando switch

O comando switch permite controlar o fluxo de um programa da seguinte forma:

main () {
{
  int opcao;
  printf("Entre com uma opção (número inteiro)\n");
  scanf ("%d",&opcao);
  switch(opcao) {
  case 1:
          printf("opcao 1\n");
          break; /* o break força o encerramento da instrução*/
  case 2:
          printf("opcao 2\n");
          x++;  /* instrução demonstrativa apenas */
          printf("Note que pode existir ums lista de instruções");
          break;
  case 3:
          printf("opcao 3\n"); /* note o efeito de não ter o break */
  case 4:
          printf("opcao 4\n");
          break;
  case 5:
          printf("opcao 5\n");
          break;
  default:
          printf("opcao default\n");
          break;    /* a opção default é opcional */
  }

Desenvolvimento do projeto

  1. Implementar a estrutura do programa principal correspondente ao fluxograma da aula anterior.
    #include <stdio.h>
    #include <string.h>
    
    /**********************************************/
    /*** PROGRAMA DE CONTROLE DE ACESSO  **/
    /** Autor: Turmas A e B da Fase 1 CST - 2012.1 */
    /**********************************************/
    
    /** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/
    
    char userID[20];
    
    
    /** FUNÇÔES DESTE MÓDULO ****/
    
    void mostrar_menu_entrada_usuario()
    {
      printf("*******************************\n");
      printf("Entre com o seu USERID para ter acesso\n"); 
      printf("*******************************\n");
    }
    
    /** Função que implementa as tarefas do administrador **/
    
    void  administrar()
    {
    }
    
    /** Função que valida um usuário e abre a porta **/
    
    void tratar_usuario()
    {
    }
    
    void main()
    {
     for(;;) {
         mostrar_menu_entrada_usuario();
         scanf("%s",userID);
         if (strcmp(userID, "admin")==0) {
              administrar();
         } else {
             tratar_usuario();
         }
     }   
    }
    
  2. Implementar o esqueleto da função administrar conforme o fluxograma abaixo. Use o comando switch.

Administrar.jpg

int validar_senha_admin()
{

}

void mostrar_menu_administrador()
{
}

void modificar_senha()
{
}

 void limpar_tabela()
{
}

void administrar()
{
   int opcao,loop=1;
   if (validar_senha_admin()==1) {
   	while(loop) {
       	    mostrar_menu_administrador();
            scanf("%d",&opcao);
            switch(opcao)
           {
            case 1:
                      modificar_senha();
                      break;
            case 2:
                      limpar_tabela();
                      break;
            case 3:
                      loop=0;
                      break;
           }
       }
   }
}

20/06/2012

Objetivos

Desenvolvimento do projeto

  1. Criar uma variável global para armazenar a senha do administrador.
  2. Implementar a função para mostrar o menu da função administrar.
  3. Implementar a função para mudar a senha do administrador.
/* funções e variáveis solicitadas nos exercícios */
char senha_admin[20]="alfa";

int validar_senha_admin()
{
  char aux1[20];
  printf("Entre coma senha do administrador\n");
  scanf("%s",aux1);
  if(strcmp(aux1,senha_admin)==0) 
      return 1;
  else
      return 0;
}
 
void modificar_senha()
{
   char aux1[20];
   char aux2[20];

   printf("Entre com a nova senha\n");
   scanf("%s",aux1);
   printf("Confirme a nova senha\n");
   scanf("%s",aux2);
  if (strcmp(aux1,aux2)==0) {
       strcpy (senha_admin, aux1);
  } else {
       printf("Senha não confere\n");
  }
}

25/06/2012

Objetivos

  1. Desenvolvimento do projeto
  2. Uso avançado das funções scanf e printf.


Funções printf e scanf

Como ler strings com espaço em branco usando scanf

scanf e espaço em branco

Estruturas

No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo

#include <stdio.h>

struct TUsuario
{
  char userID[20];
  char senha[20];
} Usuario;

struct TUsuario TabelaUsuario[20];

main()
{
  scanf("%s", Usuario.userId);
  scanf("%s", Usuario.senha);
  scanf("%s", TabelaUsuario[10].userId);
  scanf("%s", TabelaUsuario[10].senha);
}

Desenvolvimento do Projeto

  1. Implementar a função tratar_usuário usando duas tabelas (de usuário e de senhas).
    #include <stdio.h>
    #include <string.h>
     
    /**********************************************/
    /*** PROGRAMA DE CONTROLE DE ACESSO  **/
    /** Autor: Turmas A e B da Fase 1 CST - 2012.1 */
    /**********************************************/
     
    /** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/
     
    char userID[20];
    
    char senha_admin[20]="alfa";
    
    char TabelaUsuarios[4][50] = {
             "joao",
             "maria",
             "jose",
             "lara",
    };
     
    char TabelaSenhas[4][50] = {
             "aaaa",
             "bbbb",
             "cccc",
             "ddddd",
    };
     
    /** FUNÇÔES DESTE MÓDULO ****/
     
    void mostrar_menu_entrada_usuario()
    {
      printf("*******************************\n");
      printf("Entre com o seu USERID para ter acesso\n"); 
      printf("*******************************\n");
    }
     
    
     
    /** Função que valida um usuário e abre a porta **/
     
    void tratar_usuario()
    {
      int i;
      int userEncontrado=1;
      char senha[20];
     
      for (i=0;i<4 && userEncontrado; i++) {
           if( strcmp(userID, &TabelaUsuarios[i][0])==0)
                 userEncontrado=0;
      }
      if (userEncontrado==0) {
           printf("Entre com a senha\n");
           scanf("%s", senha);
           i--;
           if(strcmp(senha, &TabelaSenhas[i][0])==0)
                 printf("Abrir porta!!!\n");
           else 
                 printf("Senha inválida\n");
      }
    }
     
    void mostrar_menu_administrador()
    {
    }
     
     void limpar_tabela()
    {
    }
     
    
    /* funções e variáveis solicitadas nos exercícios */
    
     
    int validar_senha_admin()
    {
      char aux1[20];
      printf("Entre coma senha do administrador\n");
      scanf("%s",aux1);
      if(strcmp(aux1,senha_admin)==0) 
          return 1;
      else
          return 0;
    }
     
    void modificar_senha()
    {
       char aux1[20];
       char aux2[20];
     
       printf("Entre com a nova senha\n");
       scanf("%s",aux1);
       printf("Confirme a nova senha\n");
       scanf("%s",aux2);
      if (strcmp(aux1,aux2)==0) {
           strcpy (senha_admin, aux1);
      } else {
           printf("Senha não confere\n");
      }
    }
    
    /** Função que implementa as tarefas do administrador **/
    
    void administrar()
    {
       int opcao,loop=1;
       if (validar_senha_admin()==1) {
       	while(loop) {
           	    mostrar_menu_administrador();
                scanf("%d",&opcao);
                switch(opcao)
               {
                case 1:
                          modificar_senha();
                          break;
                case 2:
                          limpar_tabela();
                          break;
                case 3:
                          loop=0;
                          break;
               }
           }
       }
    }
    
    void main()
    {
     for(;;) {
         mostrar_menu_entrada_usuario();
         scanf("%s",userID);
         if (strcmp(userID, "admin")==0) {
              administrar();
         } else {
             tratar_usuario();
         }
     }   
    }
    
  2. Reimplementar a função tratar_usuário usando uma única tabela com structs.
    #include <stdio.h>
    #include <string.h>
     
    /**********************************************/
    /*** PROGRAMA DE CONTROLE DE ACESSO  **/
    /** Autor: Turmas A e B da Fase 1 CST - 2012.1 */
    /**********************************************/
    
    /* Definições deste módulo */
    
    #define TAM_TABELA_USUARIOS 4
     
    /** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/
     
    char userID[20];
    
    char senha_admin[20]="alfa";
    
    struct TUsuario {
       char userID[20];
       char senha[20];
       int  EstadoRegistro;
    };
     
    struct TUsuario TabelaUsuarios[TAM_TABELA_USUARIOS] = {
                                                             {
                                                                "joao",
                                                                "aaaa",
                                                                 1
                                                              },
                                         
                                                              { 
                                                                  "maria",
                                                                  "bbbbb",
     							       1
                                                               },
                                                              { 
                                                                  "jose",
                                                                  "ccccc",
                                                                  1
                                                               },
                                                              { 
                                                                  "lara",
                                                                  "dddddd",
                                                                  1
                                                               }
                                                          }; 
    
    /** FUNÇÔES DESTE MÓDULO ****/
     
    void mostrar_menu_entrada_usuario()
    {
      printf("*******************************\n");
      printf("Entre com o seu USERID para ter acesso\n"); 
      printf("*******************************\n");
    }
     
    
     
    /** Função que valida um usuário e abre a porta **/
     
    void tratar_usuario()
    {
      int i;
      int userEncontrado=1;
      char senha[20];
     
      for (i=0;i<TAM_TABELA_USUARIOS && userEncontrado; i++) {
           if( strcmp(userID, TabelaUsuarios[i].userID)==0)
                 userEncontrado=0;
      }
      if (userEncontrado==0) {
           printf("Entre com a senha\n");
           scanf("%s", senha);
           i--;
           if(strcmp(senha, TabelaUsuarios[i].senha)==0)
                 printf("Abrir porta!!!\n");
           else 
                 printf("Senha inválida\n");
      }
    }
     
    void mostrar_menu_administrador()
    {
    }
     
     void limpar_tabela()
    {
    }
     
    
    /* funções e variáveis solicitadas nos exercícios */
    
     
    int validar_senha_admin()
    {
      char aux1[20];
      printf("Entre coma senha do administrador\n");
      scanf("%s",aux1);
      if(strcmp(aux1,senha_admin)==0) 
          return 1;
      else
          return 0;
    }
     
    void modificar_senha()
    {
       char aux1[20];
       char aux2[20];
     
       printf("Entre com a nova senha\n");
       scanf("%s",aux1);
       printf("Confirme a nova senha\n");
       scanf("%s",aux2);
      if (strcmp(aux1,aux2)==0) {
           strcpy (senha_admin, aux1);
      } else {
           printf("Senha não confere\n");
      }
    }
    
    /** Função que implementa as tarefas do administrador **/
    
    void administrar()
    {
       int opcao,loop=1;
       if (validar_senha_admin()==1) {
       	while(loop) {
           	    mostrar_menu_administrador();
                scanf("%d",&opcao);
                switch(opcao)
               {
                case 1:
                          modificar_senha();
                          break;
                case 2:
                          limpar_tabela();
                          break;
                case 3:
                          loop=0;
                          break;
               }
           }
       }
    }
    
    void main()
    {
     for(;;) {
         mostrar_menu_entrada_usuario();
         scanf("%s",userID);
         if (strcmp(userID, "admin")==0) {
              administrar();
         } else {
             tratar_usuario();
         }
     }   
    }
    
  3. Criar um campo para representar registro livre (0) ou ocupado(1). Iniciar todos registros como ocupados.
  4. Implementar uma função para remover usuário nas opções do administrador.

27/06/2012

Objetivo

  • Desenvolvimento do projeto
  • Recuperação prova 1 e 2

Desenvolvimento do Projeto

  1. Implementar uma função para inserir um novo userID e senha na Tabela de Usuários. Se o usuário já existir, deve ser perguntado se é desejado trocar a senha.
  2. Reimplementar a função para listar a tabela de usuários.
  3. Projetar e implementar uma modificação da função tratar_usuario() para bloquear o acesso após três tentativas seguidas de senha incorreta. SUGESTÃO: colocar u contador na struct TUsuario.
  4. Implementar uma função do administrador para desbloquear o usuário no caso de ele ter sido bloqueado.

02/07/2012

Objetivos

  • IDEs: Eclipse, Netbeans
  • Depuração em código fonte usando ddd
  • Depuração passo a passo
  • Visualização de valores de variáveis
  • Marcação de breakpoints
  • Divisão do projeto em arquivos
  • Ponteiros

IDEs

Depuração em código fonte usando ddd

Compilar o seu programa com -g

 gcc -g teste.c -o teste

Executar o ddd (que deve estar instalado na máquina)

 ddd teste

Ver tutorial em

ddd

outro

Encaminhamentos

Os alunos já passados estão dispensados das próximas aulas mas devem entregar o trabalho até quinta dia 12 com um exemplo de uso de ponteiros no programa de controle de acesso.

Exercício para o projeto final

  1. Implementar uma funcionalidade no sistema de controle de acesso para que o administrador possa colocar mensagens personalizadas para os usuários. O usuário, ao solicitar a abertura da porta, deverá visualizar a mensagem, se ela existir. DICA: acrescentar um campo no registro de usuário para comportar a mensagem. Na criação do usuário esta mensagem pode ser vazia (string vazia).

04/07/2012

Apresentação do projeto final

09/07/2012

Aula de exercícios para recuperação

11/07/2012

Recuperação final - transferida para 16

16/07/2012

Recuperação final