Programação em C

Iniciação à programação em C

..:::..  Editor

Introdução à linguagem de programação C. Instalação e funcinamento do compilador. 

CodeBloks     F9 - Compilar e correr o programa
Em caso de erro após ou durante a instalação consultar a página

ou

DevC       F11 - Compilar e correr o programa

ou

https://www.codechef.com/ide  - Compilar online   ou  https://www.onlinegdb.com/ 

..:::..  Notas importantes

Notas importantes

  C é case sensitive  (FLOAT <> float)

  \n muda de linha

  ; indica o fim da instrução


..:::.. Estrutura de um programa em C    "Olá Mundo"

"Um IDE é um bloco de notas evoluído" O compilador (IDE) que vamos usar é o CodeBlocks

Main () // método principal
{
O compilador irá processar todas as instruções que estão dentro do método main ou método principal.
}

Exemplo

#include <stdio.h> 
int main ()
{
printf ("Olá Mundo");
return 0;
}

#include <stdio.h> // include  inclui a biblioteca stdio.h (standard Input Output). Neste caso a biblioteca é necessária para que seja possível utilizar o printf.

int main ()// método principal
{
printf ("Olá Mundo"); // imprimir formatado
return 0;
}

..:::.. Ambiente de trabalho do CodeBlocks 

..:::.. Instruções frequentes

Os 3 principais tipos de instruções:
Entrada :  scanf("%d",&a); 
Atribuição : area= base * altura / 2
Saída : printf("%d",sum);      printf ("%TipoDeSaída", ValorParaOutput);

C#Desafio1
Desenvolve um programa que solicite um número inteiro ao utilizador e em seguida mostre o número introduzido. Solução .

..:::.. Variáveis em C - Variáveis C 

Variáveis em C. Resolução de exercícios práticos

Na linguagem C as variáveis podem ser declaradas em qualquer momento, no entanto, por uma questão de boas práticas devemos declarar as variáveis no inicio do programa, logo a seguir ao meto main.


Tipos de dados: Inteiros e Reais

Números reais - Float  -%f  (16 bits) 
Números inteiros - Int  - %i ou %d  (16 bits dependendo da máquina) 

Caracteres - Char - %c   (8 bits)
Cadeia de caracteres - String - %s  

Exemplo 1 com tipos de dados - TiposDeDados 

As variáveis devem ser sempre inicializadas com um valor, de outro modo o compilador vai atribuir um valor aleatório à variável, o que pode resultar num erro.
int a; deve ser int a=0;

O nome de uma variável não pode começar com um número.

#include <stdio.h> 
#include <stdib.h> 
int main ()
{
int num1, num2, valor;
printf ("BASE:\n");
printf ("Introduza um número não negativo: ");
scanf ("\n%d", &num1);
printf ("EXPONENTE:\n");
printf ("Introduza um número não negativo: ");
scanf ("\n%d", &num2);
valor =pow(num1,num2); /*função POW da biblioteca math.h*/
printf("%d elevado a %d é %d\n", num1, num2, valor);
return valor;
}

Elevar a uma potência pow
Sintaxe: variável=pow(base, expoente);

C#Desafio2 (Tipos de dados Inteiros e operadores aritméticos simples)
Desenvolve um programa que solicite ao utilizador 2 números inteiros. O programa deve somar os números digitados mostrando o resultado.
O output do resultado deve ser de fácil leitura para o utilizador e.g. (Soma de 3 + 2 = 5 ) Solução .

C#Desafio2.1 (Tipos de dados inteiros e reais e operadores aritméticos simples)
Desenvolve um programa que multiplique o número de PI (3.14) por um número digitado pelo utilizador. . Solução .

Tipos de dados: Caracter e Cadeia de Caracteres

Números reais - Float  -%f  (16 bits) 
Números inteiros - Int  - %i ou %d  (16 bits dependendo da máquina) 

Caracteres - Char - %c   (8 bits)
Cadeia de caracteres - String - %s  

Exemplo 1.1 com tipos de dados - TiposDeDados 

#include <stdio.h> 
int main(){
  char nome[100];
  int ano;
  char turma;
  printf("Nome\t: ");
  gets(nome);// uma alternativa ao scanf
  printf("Turma\t");
  scanf("%c", &turma);
  printf("ano\t: ");
  scanf("%d", &ano);
  printf("O teu nome: %s e frequentas a turma %c no %d ano ",nome,turma,ano);
  return 0;
}

gets desempenha a função de scanf, apenas nas variáveis char.
Sintaxe: gets(variável);

\t cria um espaço de tabulação da mesma forma que \n muda de linha

C#Desafio3s (Tipos de dados Caracter e String)
Desenvolve um programa que solicite ao utilizador o nome o ano e a turma. O programa deve apresentar uma linha indicando e.g. (És o Rui do 10 ano da turma A).  Solução .

..:::.. Tipos de dados mais comuns em c

Exemplo 2 com tipos de dados - TiposDeDados 

%ld permite representar valores inteiros longos
%u Número decimal natural (unsigned int), ou seja, sem sinal.

..:::.. Outros códigos Printf

..:::.. Palavras Reservadas em #C

Algumas Palavras Reservadas em C:
auto     else      long      switch  break    enum    register  typedef  case extern return  union  char float short  unsigned  const for  signed  void continue    goto     sizeof   volatile  default if static while  do int struct _Packed  double     

..:::.. Operadores Aritméticos

C#Desafio3 (Operadores Aritméticos)
Desenvolve um programa que solicite ao utilizador 2 números inteiros. O programa deve realizar todas as operações (+, -, /, * e o resto da divisão). Solução.

..:::.. Operadores de Atribuição

Exemplo 4.1 Operadores - Operadores de Atribuição   

Os operadores de atribuição aumentam a performance dos programas porque facilitam a interpretação das instruções por parte do processador.

C#Desafio4 (Operadores aritméticos)
Desenvolve um programa que solicite ao utilizador 2 números inteiros. O programa deve mostrar o quociente e o resto da divisão. Utilize os operadores de atribuição.   Solução .

..:::.. Operadores de Incremento e Decremento

Exemplo 4.2 Operadores - Operadores de Incremento e Decremento   

Pós incremento vs pré incremento




Pós incremento (Atribuição e incremento)

posIncre=a++; é o mesmo que ter atribuição posIncre=a; incremento a++;





Pré incremento (Incremento e atribuição)

preIncre=++b; é o mesmo que ter incremento b++; atribuição preIncre=b;

..:::.. O operador sizeof 

Exemplo 4.3 Operadores - Operadores de Incremento e Decremento   

O sizeof é um operador unário que retorna o tamanho de uma, constante, variável, array, estrutura etc.

C#Desafio5 (Operadores de incremento e decremento e SizeOf)
Desenvolve um programa que solicite ao utilizador 2 números, um inteiro e um real. O programa deve incrementar mais 1 no número real e decrementar 1 no número inteiro, mostrando o valor da variável antes e após o incremento ou decremento. O programa deve, também, indicar o espaço que ocupam as variáveis utilizadas no programa. Utilize os operadores de incremento e decremento e SizeOf.   Solução .

C#Desafio6 
Desenvolve um programa que faça a troca de dois números introduzidos pelo utilizador. E.g. (1º numero é 3 e o 2º é 4 - o Output será  1º número é 4 e o 2º número é 3  Solução .

..:::.. Mais Bibliotecas

#include <stdlib.h> é uma biblioteca padrão do C# que deve estar presente em todos os programas, tal como a #include <stdio.h>

Lista de bibliotecas C#  http://www.cplusplus.com/reference/clibrary/ 

..:::.. Exercício prático


Calculadora V1.0
Tendo em conta os conteúdos abordados, nete momento já é possível desenvolver uma calculadora que permita:
- Solicitar ao utilizador que insira 2 números, seguidamente o programa deve fazer todas as operações matemáticas com os números digitados.

Exemplo 5 - Calculadora V1.0

..:::.. Caracteres de fuga 

Escape sequences - Sequências de escape ou caracteres de fuga.
As sequências de escape ou caracteres de fuga. Uma sequência de escape é uma sequência de caracteres que não se representa a si mesma. Esta sequência é traduzida num outro caracter ou sequência de caracteres que podem ser difíceis ou impossíveis de representar diretamente no compilador.

Caracteres de fuga exemplos:
\n (muda de linha)
\t (tabulação)
\\ imprime a barra
\” imprime a aspa
\’ aspa simples
\0 finaliza o texto

..:::.. Caracteres especiais em C

Como resolver o problema dos caracteres especiais em C?
A linguagem C deparamo-nos com um problema de formatação sempre que inserimos um caracter especial, uma vez que, quando compilamos o programa os caracteres ficam desformados. Para resolver este problema basta carregar a biblioteca #include <locale.h> e introduzir o código setlocale(LC_ALL, "Portuguese"); depois do metodo principal int main () {

..:::.. Operadores relacionais

..:::.. Operadores Lógicos

Estrutura Condicional em ESCADA

 Estruturas de decisão - Estrutura Condicional - Ciclo IF  



..:::.. Ciclo IF Estrutura Condicional Simples

IF...
SE...

Estrutura Condicional simples

SE = IF
INÍCIO = {
FIM = }

Exemplo 7 - Ciclo IF - Estrutura Condicional simples

C#Desafio7A (Estrutura Condicional simples)
7A - Utilizando a estrutura condicional simples. Elabora um algoritmo compare 3 números e verifique qual deles é maior. Solução .

..:::.. Ciclo IF  Estrutura Condicional composta

IF...
SE...

Estrutura Condicional Composta

SE = IF
       Condição verdadeira
ELSE = Senão
       Condição falsa

Exemplo 8 - Ciclo IF - Estrutura Condicional composta

..:::.. Ciclo IF Estrutura Condicional em escada

IF...
SE...

Estrutura Condicional em ESCADA

SE = IF
       Condição verdadeira (Condição 1)
    ELSE IF= Senão SE
               Outra condição verdadeira (Condição 2)
           ELSE = Senão
                        Nenhuma das condições anteriores é verdadeira (Condição 1 e Condição 2)

Exemplo 9 - Ciclo IF - Estrutura Condicional em escada Ladder if

C#Desafio7B (Estrutura Condicional ESCADA)
7B - Utilizando a estrutura condicional ESCADA. Elabora um algoritmo compare 3 números e verifique qual deles é maior. Solução .

..:::.. Ciclo IF Estrutura Condicional aninhada

IF...
SE...

Estrutura Condicional ANINHADA

SE = IF   Condição verdadeira (Condição 1)
            {
                 IF= SE    Outra condição verdadeira (Condição 2)
                 ELSE = Senão   Condição 2 falsa
            }
ELSE = Senão   Condição 1 falsa

Exemplo 10- Ciclo IF - Estrutura Condicional em aninhada - Nested if 

C#Desafio7C (Estrutura Condicional ANINHADA)
7C - Utilizando a estrutura condicional ANINHADA. Elabora um algoritmo compare 3 números e verifique qual deles é maior. Solução .

C#Desafio8 Estrutura Condicional ANINHADA)
8- Elabora um algoritmo que verifique se um determinado número está dentro de um determinado intervalo de valores (10 a 15)
8.1- Restrutura o algoritmo para que o intervalo de valores seja introduzido pelo utilizador.
8.2 - Caso o utilizador digite um intervalo e.g.(15...10), o programa deve ordenar os números em ordem crescente e verificar se o numero digitado está dentro do intervalo.  Solução .

C#Desafio9 
9- Elabora um algoritmo que verifique se um determinado aluno é elegível para a bolsa de mérito, tendo em conta os critérios:
Média na formação técnica >=15
Média na formação científica >=13
Média na formação sociocultural>=12
Total das 3 componentes >=41
ou
Total da formação técnica e científica >=30

9.1. (Facultativo) - Faz com que o programa mostre a mensagem a vermelho, caso o aluno cumpra os critérios estabelecidos. "Podes pesquisar na Internet!!" 

Nota: Ainda podemos melhorar mais o programa, e.g1 - Não permitir que o utilizador digite números superiores a 20 nem menores que 0; e.g2 - Permitir que seja o utilizador a escolher os critérios de elegibilidade dos alunos de mérito    Solução .

 Estruturas de decisão - CASE

..:::.. CASE

CASE...
CASO...

Estrutura Condicional ANINHADA

switch (n)
​{
case 1:
// Código a ser executado no caso da escolha 1;
break;
case 2:
// Código a ser executado no caso da escolha 2;
break;
.  .  .
default:
// 
 Código a ser executado no caso da escolha não coincidir com nenhuma das opções;
}

Exemplo 11- Calculadora V2.0

C#Desafio10 (Estrutura de decisão CASE)
10- Utilizando SWITCH CASE - Elabora um algoritmo que associe os números de 1 a 7 aos dias da semana de Segunda a Domingo, ou seja, se o utilizador digitar 1 o programa deve fazer o output "segunda-feira"... 

10.1 - Altera o programa criado para que, no caso de o utilizador digitar um número fora do intervalo de 1 a 7, o programa deve indicar que o número está fora do intervalo permitido. Solução .

..:::.. Instrução goto

rótulo:
..
.
goto:rótulo;

Instrução goto

#include <stdio.h>
int main()
{
  int num1=0;
  SALTOteste: // rótulo
    printf("digite um número\n");
    printf("Se digitar < 10 tem a oportunidade de voltar a digitar\n");
    scanf("%d\n2",&num1);
  if (num1>10)
    printf("O num é maior que 10\n");
    else
    goto SALTOteste; // goto:rótulo;
return 0;
}

C#Desafio10A (Estrutura de decisão CASE)
10A- Utilizando SWITCH CASE - Altera o programa solicitado no desafio 10 para que, caso o número digitado esteja fora do intervalo (1 a 7) o programa deve permitir que o utilizador volte a tentar. Solução .

C#Quiz1
Para resolver o quiz podes consultar a informação que entenderes e podes fazer testes no CodeBlocks para ajudar na resolução. Com este quiz vais poder comprovar que a linguagem C é mais complexa que o pascal e também mais potente.  Aceder ao Quiz 1 .

 Laços de repetição LOOP - For - While

While LOOP

Do While LOOP

For LOOP

..:::.. While Loop

While // condição verdadeira...
Faz // as instruções definidas pelo programador...

Estrutura de repetição while

Sintaxe

while loop (Enquanto condição verdadeira)
{
//Código  (Enquanto condição verdadeira, executa o código entre as {} )
}

Exemplo 12- While LOOP

C#Desafio11 (Estrutura de repetição while)
11- Utilizando While LOOP -  Elabora um algoritmo que calcule a tabuada de um número digitado pelo utilizador. Nota que um contador em C, aquando do incremento, pode ter a sintaxe contador++;  ...  Solução .

..:::.. Do While Loop

While // condição verdadeira...
Faz // as instruções definidas pelo programador...

Estrutura de repetição Do while

Sintaxe

Do (Faz)
{
//Código  (Enquanto condição verdadeira, executa o código entre as {} )
}
while loop (Enquanto condição verdadeira)

Exemplo 13- Do While LOOP

C#Desafio11A (Estrutura de repetição Do while)
11A- Utilizando Do While LOOP -  Elabora um algoritmo que calcule a tabuada de um número digitado pelo utilizador (a tabuada deve ser mostrada na ordem inversa, ouseja, começa no 10xnúmero e acaba em 1xnúmero). Nota que um contador em C, aquando do decremento, pode ter a sintaxe contador--;  ...  Solução .

..:::.. For Loop

For...To...Do

Estrutura de repetição For

for (Condição inicial ; Condição; Atualização do contador)
​{
código:
}

Exemplo 14- For LOOP

C#Desafio12 (Estrutura de repetição For)
12- Utilizando o For LOOP -  Elabora um algoritmo que mostre no ecrã os 10 primeiros números inteiros.

12.1. Altera o programa criado anteriormente para que, além de mostrar os 10 números também mostre a soma e a média.

12.2. Altera o programa para que o intervalo de números seja introduzido pelo utilizador. O programa deve mostrar os números que estão dentro do intervalo definido pelo utilizador, a soma dos números e a média.

Nota que, para um intervalo de 3 a 6 o resultado da soma deve ser 18 e a média 4,5. ...  Solução .

C#Desafio12A (Estrutura de repetição For)
12A- Utilizando o For LOOP -  Elabora um algoritmo que solicite ao utilizador:
- Um intervalo de números e.g. (o utilizador digita 1 e 5).
- De sguida o programa deve permitir que o utilizador digite os números indicados no intervalo e.g. (5 números).
- No final o programa deve mostrar o total de números digitados; A soma e a média dos números digitados. . ...   Solução .

..:::..  break and continue nos ciclos de repetição (While e For LOOP) Voltar

..:::..  break  nos ciclos de repetição (While e For LOOP)

Para testar o BREAK - utilizamos um programa que permite inserir até 5 números pares, caso seja inserido um número impar o programa para break. 

Ver programas em *.TXT

..:::..  continue nos ciclos de repetição (While e For LOOP)

Para testar o CONTINUE - utilizamos um programa que permite inserir até 5 números. O programa irá somar todos os números impares. No caso de o utilizador digitar um número par o programa ignora-o continue.

C#Desafio13 (Continue)
13- Utilizando o Continue  -  Elabora um algoritmo que solicite 10 notas de 0 a 20 ao utilizador. O programa deve calcular a soma e a média das notas positivas (apenas das notas positivas) digitadas. O programa deve ainda indicar a quantidade de notas positivas e a quantidade de notas negativas.

Este desafio deve dar origem a 3 programas: Utilizando o ciclo For, While e Do While.   ...  Solução .


Sabendo que a Sequência de Fibonacci é 0,1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584


https://www.youtube.com/watch?v=eVbOxWVC_GY
https://www.youtube.com/watch?v=idlgzX5QKM4

C#Desafio14 (Fibonacci)
Sabendo que a Sequência de Fibonacci é - 0,1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584
Elabora um programa que produza esta sequência de números. .   ...  Solução .

 Vetores e Matrizes

Um Vetor ou Matriz é uma coleção de variáveis de mesmo tipo, acessíveis com um único nome e armazenados contiguamente (um após o outro) na memória.

..:::..  Vetores ou matrizes unidimensionais

Características dos vetores
- Um só tipo de dados (conjunto ordenado de informações de mesma natureza);
- Um só nome;
- Múltiplas posições de memória identificadas por índices;
- Acesso randómico (aleatório)

Sintaxe



tipodevariavel NomeDoVetor [tamanho] 
 
Exemplo: float notas[5]
// Vetor com o nome notas que suporta números do tipo real (float), com 5 posições [5]. 


C#Desafio15 (Vetores)
Elabora um programa que leia 5 números inteiros e os armazene num vetor.
O programa deve ainda apresentar:
15.1- A quantidade total de números introduzidos no vetor; - A soma de todos os números do vetor;
15.2- A quantidade de números superiores a 100; - A soma dos números superiores a 100;
15.3- A lista de todos os números introduzidos; 
15.4- A lista de todos os números superiores a 100;    ...  Solução .

..:::..  Matrizes ou matrizes multidimensionais, no caso bidimensionais.

As matrizes são estruturas de dados que possuem mais do que uma dimensão. Vimos que, os vetores (matrizes unidimensionais) necessitam apenas de um índice para acesso aos elementos. As matrizes necessitam utilizar um índice para cada dimensão, ou seja, um para as linhas e outro para as colunas. 

Características das Matrizes
- Um só tipo de dados (conjunto ordenado de informações de mesma natureza); 
- Um só nome;
- Múltiplas posições de memória identificadas por índices;
- Acesso randómico (aleatório)

Sintaxe
tipodevariavel NomeDaMatriz [nºDeLinhas] [nºDeColunas]
Exemplo: float notas[2][5] 
// Matriz com o nome notas que suporta números do tipo real (float), com 2 linhas e 5 colunas [2][5]. 


O programa que serviu de exemplo para esta explicação pode ser visto integralmente na imagem abaixo.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int notas[2][5], i,j;
  for(i=0;i<2;++i) // 2 linhas da matriz NOTA pré incremento
    {
      for(j=0;j<5;++j) // 5 colunas da matriz NOTA pré incremento
      {
      notas[i][j]=10*(i+1);// Multiplica o número da linha por 10
      printf("Linha %d --- coluna %d  com o valor: %d \n",i+1,j+1,notas[i][j]);
      }
    }
return 0;
}

C#Desafio16 (Matrizes bidimensionais)
Elabora um programa que permita inserir 9 números numa matriz 3x3. Após a inserção dos números o programa deve mostrar todos os números digitados, bem como a respetiva linha e coluna. 
16.1. O programa deve apresentar o resultado da soma dos números inseridos. ...  Solução .

C#Desafio16A (Matrizes bidimensionais)
Elabora um programa que solicite ao utilizador 9 números inteiros para preencher uma matriz 3x3(considere que não serão digitados valores duplicados). 
16A.1 - Depois da matriz preenchida o programa deve solicitar ao utilizador um número inteiro e escrever uma mensagem indicando se o valor digitado existe ou não na matriz.
16A.1.1 -O  programa deve indicar a linha e coluna onde se encontra o  número  encontrado em 16A.1. 
16A.2 -Altere o algoritmo para que caso o numero digitado já exista solicite ao utilizador que digite outro.  ...  Solução .

xxxxxxxxxxxxxxxx

xxxxxxxxxxxxxxxx

xxxxxxxxxxxxxxxx