Programar em C/Exercícios

Origem: Wikilivros, livros abertos por um mundo aberto.
Saltar para a navegação Saltar para a pesquisa
Exercícios

Questões[editar | editar código-fonte]

O que faz o seguinte programa?
#include <stdio.h>

 int main(void)
 {
    int x;
    scanf( "%d", &x );
    printf("%d\n", 2*x );

return 0;
 }


Resolução
Exibirá o dobro do valor lido.

Escrevendo programas[editar | editar código-fonte]

Exercício 1[editar | editar código-fonte]

Escreva uma função que peça dois números inteiros ao usuário e exibe o valor soma seguido pelo maior deles.


Resolução
//By: Regis Rodman
#include <stdio.h>

// Protótipo da função soma
int soma( int x, int y );

int main()
{
    int x, y;

    printf( "Entre com dois números inteiros: " ); scanf( "%d %d", &x, &y );
    printf( "Soma = %d\n", soma( x, y ) );
    printf( "O maior valor digitado foi: %d\n", x>y ? x:y );

return 0;
}

// Corpo da função soma
int soma( int x, int y )
{
    return x+y;
}

Exercício 2[editar | editar código-fonte]

Faça um programa que converta Celsius para Fahrenheit.


Resolução
A resolução deste exercício é deixada a cargo do leitor. Sinta-se livre para melhorar a qualidade deste texto, incluindo-a neste módulo.

Exercício 3[editar | editar código-fonte]

Faça um programa que vai lendo cada caractere que o usuário digitar. Quando o usuário digitar o caractere 'x', o programa deve exibir todos os caracteres que foram digitados antes do 'x'.

// By: Regis Rodman
#include <stdio.h>

void show( char *s );       // Protótipo da função show( char *s )
int Dec( char ch );         // Protótipo da função Dec( char ch ); Obs: Dec = Decimal

int main()
{
    char str[200];
    char * pv = &str[0];     // Ponteiro para o primeiro elemento de str[200]

    printf( "Entre com letras, x para encerrar\n" );
    while( 1 )
    {
        *pv = getchar();
        if( *pv == 'x' ) {
            show( str );
            break;
        } else {
            pv++;
        }
    }

return 0;
}

// Corpo da função show( char *s )
void show( char *s )
{
    for( int u=0; s[u]!='\0'; u++ )
    {
        // Só "letras" maiúsculas ou minúsculas
        if( ( Dec(s[u]) >= 65 && Dec(s[u]) <= 90) || (Dec(s[u]) >= 97 && Dec(s[u]) <= 122) )
            printf( "%c ", s[u] == 'x' ? ' ' : s[u] );
    }
putchar( '\n' );
}

// Corpo da função Dec( char ch )
int Dec( char ch )
{
    // Retorna o valor decimal do caracter. Tabela ASCII.
    return "%d", ch;
}

Exercício 4[editar | editar código-fonte]

Escreva um programa que começa pedindo um número N ao usuário e depois pede N números. O programa deverá mostrar na tela todos esses números ordenados do menor para o maior. Escreva sua própria função de ordenação.

#include <stdio.h>
#include <stdlib.h>

/*
    By :  forshaw & Marcos Antônio Nunes de Moura
*/

int main()
{
    int n, *numeros;
    int x, y, temp;
    printf("Digite um numero: \n");
    scanf("%d", &n);
    numeros = (int *) malloc(n * sizeof(int)); /* Isso simplesmente cria um array de tamanho n ( int numeros[n] ) */
    printf("Agora digite %d numeros: \n", n);
    for (x=0; x<n; x++)
        scanf("%d", &numeros[x]);
        if (x==n) /* Isso e, quando acabar o for de cima */
            for (x=0; x<n; x++)
                for (y=0; y<n; y++)                /* Varre todo o array[y] comparando-o com um array[x] constante (por vez) */
                    if (numeros[x] < numeros[y])
                        {
                            temp = numeros[x];
                            numeros[x] = numeros[y];  /* Aqui e a velha troca de dados :) */
                            numeros[y] = temp;
                        }
                    if (x==n) /* Isso e, quando acabar o for de cima */
                        printf("Agora em ordem crescente: \n");
                        for (x=0; x<n; x++)
                            printf("%d\n", numeros[x]);

    free(numeros);
    return 0;
}

Código mais simples de entender:

#include <stdio.h>

/*
	By: Thiago Laitz & Marcos Antônio Nunes de Moura.
*/

int main(){

	int n=51,aux,value;
	int array[50];
    
    while(n > 50){
	printf("Digite o numero n, de 1 até 50: "); // Aqui eu pego o valor "n".
	scanf("%d",&n);
    }

	for (int i=0; i<n; i++){
		printf("Escreva os numeros (%d/%d): ",(i+1),n); //Salva os numeros num array.
		scanf("%d", &aux);
		array[i]=aux;
	}
	for (int d=0; d< n; d++){
		aux = array[d];
		for(int k=(d+1); k<n; k++){
			if(aux > array[k]){ //Ao trocar o sinal ">" para "<", você transforma o programa numa sequencia decrescente.
				value = aux;
				aux = array[k]; //Troca de valores.Começando de um valor fixo.
				array[k]= value;
		array[d] = aux;
			}
		}
	}
	printf("números ordenados: ");
	for(int f=0; f<n-1;f++ ){
		printf("%d, ", array[f]); //Imprime o resultado final ordenado.
	}
	printf("%d\n",array[n-1]);
	return 0;
}

Exercício 5[editar | editar código-fonte]

Faça um programa que encontra a raiz quadrada aproximada de um número. Para isso, use um dos métodos existentes.

#include <stdio.h>
/*
    By :  forshaw
*/

int main()
{
   int num, i, result, j;
   printf("Digite o numero que queres a raiz => ");
   scanf("%d", &num);
   j = num;
   result = 0;
   i = 1;
   while (num >= i){
      num -= i;
      i += 2;
      result++;
   }
   if (num == 0)
        printf("\nA raiz exata de %d eh >%d<\n\n", j, result);
   else
        printf("\nA raiz aproximada de %d eh >%d<\n\n", j, result);
}

Exercício 6[editar | editar código-fonte]

O código abaixo gera números primos.

#include <stdio.h>

/*
    By :  forshaw
*/

int main()
{
   int limite;
   int x, y;
   printf("Digite o limite do gerador : ");
   scanf("%d", &limite);
   if (limite >= 2)  /* Para sempre incluir o 2, ja que e o unico par primo */
        printf("2\n");
   for (x=1; x<=limite; x++)
        for (y=2; y<x; y++)
            if (x%y == 0)  /* Testa se e divisivel por algum anterior, e caso ser verdadeiro,
                                sair da condição ( continue; ) */
                y = x+1;
            else if (y == x-1) /* No final da condição (ja que um numero n > 2 não é divisivel por n-1) */
            {
                printf("%d\n", x);
                y = x+1; /* Termina para garantir um unico printf() */
            }
   return 0;
}

Código simples e fácil de entender:

// Por Warley V. Barbosa

#include <stdio.h>

int main()
{
    int num, primo, i, res;
    
    do 
    {
        printf("Digite um número (0 para encerrar): \n");
        scanf("%d", &num);
    
        primo = 1;
        
        for (i = 2; i < num; i++) /* repete a partir do número dois e vai até o número anterior de 'num', 
incrementando à variável i a cada repetição */
        {
            if (num % i == 0) { // se o resto do 'num' por 'i' for zero o número não é primo
                primo = 0;
                break; // pula para a instrução seguinte
            }            
        }
        
        if ((primo) && (num > 1)) // 1 não é primo! nem zero...
            printf("O número %d é primo! \n", num);
        else
            printf("O número %d não é primo... \n", num);
        
    }
    while (num != 0); // encerra quando usuário digitar 0 
}


Partindo deste código, tente criar um que some o último primo resultante com o anterior.

Exercício 7[editar | editar código-fonte]

Faça uma calculadora:

#include <stdio.h>
#include <stdlib.h>

int expr(void);
int mul_exp(void);
int unary_exp(void);
int primary(void);

int main()
{
    int val;
    for(;;)
    {
        printf("expression: ");
        val = expr();
        if(getchar() != '\n')
        {
            printf("error\n");
            while(getchar() != '\n'); /* nada */
        }
        else
        {
            printf("result is %d\n", val);
        }
    }
    return 0;
}

int expr(void)
{
    int val, ch_in;
    val = mul_exp();
    for(;;)
    {
        switch(ch_in = getchar())
        {
            default:
                ungetc(ch_in,stdin);
                return(val);
            case '+':
                val = val + mul_exp();
                break;
            case '-':
                val = val - mul_exp();
                break;
       }
    }
}

int mul_exp(void)
{
    int val, ch_in;
    val = unary_exp();
    for(;;)
    {
        switch(ch_in = getchar())
        {
            default:
                ungetc(ch_in, stdin);
                 return(val);
            case '*':
                val = val * unary_exp();
                break;
            case '/':
                val = val / unary_exp();
                break;
            case '%':
                val = val % unary_exp();
                break;
        }
    }
}

int unary_exp(void)
{
    int val, ch_in;
    switch(ch_in = getchar())
    {
        default:
            ungetc(ch_in, stdin);
            val = primary();
            break;
        case '+':
            val = unary_exp();
            break;
        case '-':
            val = -unary_exp();
            break;
    }
    return(val);
}
    
int primary(void)
{
    int val, ch_in;
    ch_in = getchar();
    if(ch_in >= '0' && ch_in <= '9')
    {
          val = ch_in - '0';
          goto out;
    }
    if(ch_in == '(')
    {
             val = expr();
             getchar();      /* skip closing ')' */
             goto out;
    }
    printf("error: primary read %d\n", ch_in);
    exit(EXIT_FAILURE);
    out:  return(val);
}

Exercício 8[editar | editar código-fonte]

Esse programa converte um inteiro em bytes e depois realiza a operação inversa.
Faça um programa que converte um short em bytes.

#include <stdio.h>

int main (void)
{
unsigned char bytes[4]; /* Aqui o índice indica o número de elementos */
unsigned long n = 123000;

bytes[0] = (n >> 24) & 0xFF;
bytes[1] = (n >> 16) & 0xFF;
bytes[2] = (n >> 8)  & 0xFF;
bytes[3] =  n & 0xFF;

            int i;  
             
            char b[500];
            
            sprintf(b,"0 = %d, 1 = %d, 2 = %d, 3 = %d",bytes[0],bytes[1],bytes[2],bytes[3]);
        
            int inteiro = (bytes[0]<<24)+(bytes[1] << 16)+(bytes[2] << 8)+bytes[3];
                      printf("bytes %s\n",b);
                      printf("int = %i\n",inteiro);
                    
         getchar();                
}