Resolução dos desafios

Iniciação à programação em C

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

#include <stdio.h>
int main()
{
  int num;
  // printf() output
 printf("Digite um número inteiro: ");
  // scanf() input
  scanf("%d", &num);
  // printf() output de mensagem e valor da variável
  printf("O utilizador digitou: %d", num);
  return 0;
}

C#Desafio2
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 ) 

#include <stdio.h>
int main()
{
  int num1, num2, soma;
  printf("Digite 2 numeros inteiros: ");
  // input dos números
  scanf("%d %d", &num1, &num2);
  // processo de soma dos números digitados
  soma = num1 + num2;
  // output da soma
  printf("%d + %d = %d", num1, num2, soma);
  return 0;
}

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. 

#include  <stdio.h>
int main()
{
int num;
float PI=3.14;
printf("Digite um número inteiro: ");
scanf("%d", &num);
printf("Pi x %d = %f", num,num*PI);
return 0;
}

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).

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

C#Desafio3
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)

#include <stdio.h>
int main()
{
 int num1, num2, soma, mult, divi, subt, resto;
 printf("Digite um número inteiro: ");
 scanf("%d", &num1);
 printf("Digite um número inteiro: ");
 scanf("%d", &num2);
 soma=num1+num2;
 mult=num1*num2;
 divi=num1/num2;
 subt=num1-num2;
 resto=num1%num2;
 printf("Resultado da soma: %d\n", soma);
 printf("Resultado da mult: %d\n", mult);
 printf("Resultado da divisao: %d\n", divi);
 printf("Resultado da subt: %d\n", subt);
 printf("Resultado da resto: %d\n", resto);
 return 0;
}

C#Desafio4
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.

#include <stdio.h>
int main(){
  int dividendo, divisor, quoci, resto;
  printf("Digite o dividendo: ");
  scanf("%d", &dividendo);
  printf("Digite divisor: ");
  scanf("%d", &divisor);
  quoci = dividendo / divisor;
  resto = dividendo % divisor;
  printf("Quociente = %d\n", quoci);
  printf("Resto = %d", resto);
  return 0;
}

pub

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.  

#include <stdio.h>
int main()
{
  int inteiro;
  float real;
  printf("Digite um numero inteiro\n");
  scanf("%d",&inteiro);
  printf("Digite um numero real\n");
  scanf("%f",&real);
  printf("Tamanho do inteiro: %ld bytes\n",sizeof(inteiro));
  printf("Valor do inteiro antes do incremento de 1: %d\n",inteiro);
  printf("Valor do inteiro com incremento de 1: %d \n",++inteiro);
  printf("Tamanho do real: %ld bytes\n",sizeof(real));
  printf("Valor do real antes do decermento de 1: %f\n",real);
  printf("Valor do real com decermento de 1: %f \n",--real);
  return 0;
}

pub

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  

#include <stdio.h>
int main()
{
   double _1num, _2num, temporario;
    //double é outra forma de representar números reais
   printf("Digita o primeiro numero: ");
   scanf("%lf", &_1num);
   printf("Digita o segundo numero: ");
   scanf("%lf",&_2num);

   temporario = _1num;
   _1num = _2num;
   _2num = temporario;
   printf("\nDepois da troca, _1num = %.2lf\n", _1num);
   //%.2f o 2 indica a quantidade de casas decimais
   printf("Depois da troca, _2num = %.2f", _2num);
  return 0;
}

pub

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

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  double n1, n2, n3;
  printf("Digite 3 números diferentes: ");
  scanf("%lf %lf %lf", &n1, &n2, &n3);
  if( n1>=n2 && n1>=n3 )
    printf("%.2f é o número maior.", n1);
  if( n2>=n1 && n2>=n3 )
    printf("%.2f é o número maior.", n2);
  if( n3>=n1 && n3>=n2 )
    printf("%.2f é o número maior.", n3);
  return 0;
}

pub

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

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int n1, n2, n3;
  printf("Digite 3 números diferentes: ");
  scanf("%d %d %d", &n1, &n2, &n3);
  if( n1>=n2 && n1>=n3)
    printf("%d é o maior número.", n1);
  else if (n2>=n1 && n2>=n3)
    printf("%d é o maior número.", n2);
  else
    printf("%d é o maior número..", n3);
  return 0;
}

pub

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

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int n1, n2, n3;
  printf("Digite 3 números diferentes: ");
  scanf("%d %d %d", &n1, &n2, &n3);
  if (n1>=n2)
  {
    if(n1>=n3)
      printf("%d é o maior número.", n1);
    else
      printf("%d é o maior número.", n3);
  }
  else
  {
    if(n2>=n3)
      printf("%d é o maior número.", n2);
    else
      printf("%d é o maior número.",n3);
  }
  return 0;
}

pub

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 ex.(15...10), o programa deve ordenar os números em ordem crescente e verificar se o numero digitado está dentro do intervalo.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int a=0,b=0,c=0,temp=0;
  printf("digite um intervalo de valores\n");
  scanf("%d%d",&b,&c);
  if (b>c)
  {// início do if b>c
    printf("Os números necessitam de ser ordenados\n ");
    printf("primeiro numero %d e o segundo número %d\n",b,c);
    temp=b;
    b=c;
    c=temp;
    printf("Processo de ordenação concluído\n");
    printf("primeiro numero %d e o segundo número %d\n\n",b,c);
  }// Fim do if b>c

   if (b<c) {// início do if b<c  
printf("digite um numero para verificar se está dentro do intervalo\t");
  scanf("%d",&a);
  if (a>=b && a<=c)
  {
     printf("Está dentro do intervalo");
  }
  else
  {
     printf("O número não está no intervalo");
  }
  }// Fim do if b<c  
return 0;
}

pub

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 .

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h> //Para correr a cor no windows

void SetColor(int ForgC);

int main()
{
  setlocale(LC_ALL, "Portuguese");
  int ft,fc,fsc,t,mp;
  printf("Critérios de elegibilidade :\n");
  printf("Média na formação técnica >=15\n");
  printf("Média na formação científica >=13\n");
  printf("Média na formação sociocultural>=12\n");
  printf("Total das 3 componentes >=41\n");
  printf("Total da formação técnica e científica >=30\n");
  printf("-------------------------------------\n");
  printf("Input - Média na formação técnica :");
  scanf("%d",&ft);
  printf("Input - Média na formação científica :");
  scanf("%d",&fc);
  printf("Input - Média na formação sociocultural :");
  scanf("%d",&fsc);
  SetColor(2);
  printf("Total das 3 componentes : %d\n",ft+fc+fsc);
  printf("Total da formação técnica e científica : %d\n",ft+fc);
  SetColor(15);
  if (ft>=15)
     if(fc>=13)
       if(fsc>=12)
     if((ft+fc+fsc)>=41||(ft+fc)>=30)
      {
        SetColor(4);
        printf("É candidato a bolsa de mérito.\n");
        SetColor(15);
      }
     else
      printf("NÃO é candidato a bolsa de mérito.\n");
       else
   printf("NÃO é candidato a bolsa de mérito.\n");
     else
  printf("NÃO é candidato a bolsa de mérito..\n");
  else
   printf("NÃO é candidato a bolsa de mérito.\n");
}
//Apenas para mudar a cor da letra
void SetColor(int ForgC)
{
  WORD wColor;
//This handle is needed to get the current background attribute
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //csbi is used for wAttributes word
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
//To mask out all but the background attribute, and to add the color
     wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
     SetConsoleTextAttribute(hStdOut, wColor);
   }
   return;
}

pub

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 .

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 .

#include <stdio.h>
int main()
{
  int dia;
  SALTO:
  printf("Insere o nº do dia da semana: ");
  scanf("%d",&dia);
  if (dia>0 && dia<8)
  { // se verdade
  switch(dia)
  {
  case 1:
    printf("Segunda-feira \n");
    break;
  case 2:
    printf("Terça~feira \n");
    break;
  case 3:
    printf("Quarta-feira \n");
    break;
  case 4:
    printf("Quinta-feira \n");
    break;
  case 5:
    printf("Sexta-feira \n");
    break;
  case 6:
    printf("Sabado \n");
    break;
  case 7:
    printf("Domingo \n");
    break;
  default:
    printf("Número inválido. \nTente novamente ....\n");
    break;
   }
     }//se verdade
     else
     {
       printf("Númeroz inválido. \nTente novamente ....\n");
      goto SALTO;
     }
return 0;
}

pub

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++;  ... 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int n1=1, n2;
  printf("Digite um número para calcular a tabuada\n: ");
  scanf("%d", &n2);
 while (n1 <=10)
 {
 printf("%d X %d = %d \n ",n2,n1,n1*n2);
 n1++;
 }
  return 0;
}

pub

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

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
   int n1=10, n2;
  printf("Digite um número para calcular a tabuada\n: ");
  scanf("%d", &n2);
 do
 {
 printf("%d X %d = %d \n ",n2,n1,n1*n2);
 n1--;
 }
  while (n1 >=0);
  return 0;
}

pub

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. 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int soma=0,a=0, liminf=0, limsup=0;
  float media, qtdn;
  printf("Digite um intervalo de números\n: ");
  printf("Primeiro número do intervalo: ");
  scanf("%d", &liminf);
  printf("Ultimo número do intervalo: ");
  scanf("%d", &limsup);
  a=liminf;//estabelece o valor de a
 for(a>=liminf;a<=limsup;a++)
 {
   soma=soma+a;
   printf(" números %d \n ",a);
 }
printf("soma = %d \n ",soma);
qtdn=((limsup-liminf)+1);//calcula a quantidade de números gerados
media=soma/qtdn;// Calcula da média entre um real e um inteiro
printf("média = %0.2f \n ",media);// imprime a média com 2 casas decimais
printf("Total de números gerados = %0.0f \n ",qtdn);
  return 0;
}

pub

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

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int digitou, soma=0, a=1, liminf=0, limsup=0;
  float media=0, qtdn;
  printf("Digite um intervalo de números\n ");
  printf("Primeiro número do intervalo: ");
  scanf("%d", &liminf);
  printf("Ultimo número do intervalo: ");
  scanf("%d", &limsup);
  // a=liminf;
 for(a>=liminf;a<=limsup;a++)
 {
   printf("digite o %dº número: ",a);
   scanf("%d", &digitou);
   soma+=digitou;
 }
printf("soma = %d \n ",soma);
qtdn=((limsup-liminf)+1);
media=soma/qtdn;
printf("média = %0.2f \n ",media);
printf("Total de números introduzidos = %0.0f \n ",qtdn);
  return 0;
}

pub

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.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
   int i=1;
   float nota, soma = 0, contanega=0, contapositiva=0;
  printf("digite 10 notas apenas as positivas serão consideradas\n ");
  do
  {
    printf("Digite uma nota %d: ",i);
    scanf("%f",¬a);
    ++i;
    if(nota <10 || nota >20)//PAR
    {
      contanega+=1;//contanega=contanega+1;
       continue;
    }
    soma += nota; // soma = soma + num;
  }
  while(i<=5);
  printf("Soma das notas positivas = %0.0f",soma);
  printf("\nTotal de notas negativas = %0.0f",contanega);
  contapositiva= --i-contanega;
  printf("\nTotal de notas positivas = %0.0f",contapositiva);
  printf("\nMédia de notas positivas = %0.2f",soma/contapositiva);
  return 0;
}

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 .

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int i, n, t1 = 0, t2 = 1, proximo;
printf("Digite o número de elementos a calcular: ");
scanf("%d", &n);
printf("Fibonacci : ");
for (i = 1; i <= n; ++i)
 {
  printf("%d, ", t1);
  proximo = t1 + t2;
  t1 = t2;
  t2 = proximo;
 }
return 0;
}

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; 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int vetor[5], i,ct=0, ct100=0,soma=0,soma100=0;
  int n=4;
for (i=1 ; i<=n; i++)
{
  printf("\ndigite o %dº número do vetor: ",i);
  scanf("%d", &vetor[i]);
  printf("%dº introduzido foi o %d\n",i,vetor[i]);
  ct++;
  soma=soma+vetor[i];
  if (vetor[i]>100)
    {
    soma100=soma100+vetor[i];
    ct100++;
    }
}
//15.1- A quantidade total de números introduzidos no vetor; - A soma de todos os números do vetor;
  printf("\nTOTAL de numeros do vetor : %d",ct);
  printf("\nA soma do TOTAL de números do vetor foi : %d",soma);
//15.2- A quantidade de números superiores a 100; - A soma dos números superiores a 100;
  printf("\n\nQuantidade de numeros do vetor >100 : %d",ct100);
   printf("\nA soma dos numeros do vetor   >100 : %d",soma100);
//15.3- A lista de todos os números introduzidos;
  printf("\n\nOs números introduzidos no vetor: ");
for (i=1 ; i<=n; i++)
    {
     printf(" %d ",vetor[i]);
    }
    //15.4- A lista de todos os números superiores a 100;
    printf("\n\nOs números introduzidos no vetor >100 : ");
for (i=1 ; i<=n; i++)
{
  if (vetor[i]>100)
      printf(" %d ",vetor[i]);
}
  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. 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
  int numeros[3][3], i,j,soma=0;
  for(i=0;i<3;++i) // 3 linhas da matriz NOTA pré incremento
    {
      for(j=0;j<3;++j) // 3 colunas da matriz NOTA pré incremento
      {
     printf("Digite um inteiro para colocar na matriz na \n");
      printf("Linha %d --- coluna %d : ",i+1,j+1);
      scanf("%d",&numeros[i][j]);
      }
    }
  for(i=0;i<3;++i) // 3 linhas da matriz NOTA pré incremento
    {
      for(j=0;j<3;++j) // 3 colunas da matriz NOTA pré incremento
      {
      printf("O número digitado na linha %d --- coluna %d foi : %d\n",i+1,j+1, numeros[i][j]);
      soma=soma+numeros[i][j];
      }
    }
  printf("A soma é : %d\n",soma);
return 0;
}

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.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
  setlocale(LC_ALL, "Portuguese");
   int numeros[3][3], i,j,soma=0, verificar;
  for(i=0;i<3;++i) // 3 linhas da matriz NOTA pré incremento
    {
      for(j=0;j<3;++j) // 3 colunas da matriz NOTA pré incremento
      {
      printf("Digite um inteiro para colocar na matriz na \n");
      printf("Linha %d --- coluna %d : ",i+1,j+1);
      scanf("%d",&numeros[i][j]);
      }
    }
  saltoVerifica:
  printf("Digite um número para verificar se existe na matriz");
  scanf("%d",&verificar);
  for(i=0;i<3;++i) // 3 linhas da matriz NOTA pré incremento
    {
      for(j=0;j<3;++j) // 3 colunas da matriz NOTA pré incremento
      {
      if (verificar==numeros[i][j])
        {
         printf("O número digitado já existe na linha %d --- coluna %d: \n",i+1,j+1);
         goto saltoVerifica;
        }
      }
    }
return 0;
}

pub

pub

pub