Você está aqui: C ::: Dicas & Truques ::: Ordenação e Pesquisa (Busca) |
Como usar a ordenação Selection Sort em C - Ordenação por Seleção em CQuantidade de visualizações: 860 vezes |
Nesta dica mostrarei os detalhes da ordenação Selection Sort e como implementá-la em C. Também chamada de Ordenação por Seleção, esta ordenação classifica o array (ou vetor) de forma repetitiva procurando sempre o menor elemento na parte não ordenada do vetor e movendo-o para a parte já ordenada. Mencionei menor elemento para o caso da classificação em ordem crescente. Se for ordem decrescente então deveremos buscar sempre o maior elemento. Considerando o vetor [1, 6, 9, 3, 7, 8, 5, 2] nós teremos as iterações do laço externo e do laço interno, resultando nas seguintes trocas de elementos: Troca 1: 2 trocou de lugar com 6 Resultado: [1, 2, 9, 3, 7, 8, 5, 6] Troca 2: 3 trocou de lugar com 9 Resultado: [1, 2, 3, 9, 7, 8, 5, 6] Troca 3: 5 trocou de lugar com 9 Resultado: [1, 2, 3, 5, 7, 8, 9, 6] Troca 4: 6 trocou de lugar com 7 Resultado: [1, 2, 3, 5, 6, 8, 9, 7] Troca 5: 7 trocou de lugar com 8 Resultado: [1, 2, 3, 5, 6, 7, 9, 8] Troca 6: 8 trocou de lugar com 9 Resultado: [1, 2, 3, 5, 6, 7, 8, 9] Veja agora o código C completo para a ordenação Selection Sort. Coloquei comentários detalhados para facilitar o seu entendimento do algorítmo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <locale.h> // protótipo da função que usa a ordenação Selection Sort para // ordenar um array de inteiros void ordenar_selection_sort(int vetor[], int tam); // função principal do programa int main(int argc, char *argv[]){ // vamos criar um vetor de inteiros int valores[] = {1, 6, 9, 3, 7, 8, 5, 2}; int tam = 8; int i; setlocale(LC_ALL,""); // para acentos do português // vamos mostrar o vetor na ordem original printf("Vetor na ordem original: "); for(i = 0; i < tam; i++){ printf("%d ", valores[i]); } // agora vamos usar a ordenação Selection Sort // para ordenar o vetor em ordem crescente ordenar_selection_sort(valores, tam); // e agora vamos mostrar o vetor ordenado printf("\nVetor ordenado: "); for(i = 0; i < tam; i++){ printf("%d ", valores[i]); } printf("\n\n"); system("PAUSE"); return 0; } // função que usa a ordenação Selection Sort para // ordenar um array de inteiros void ordenar_selection_sort(int vetor[], int tam){ // vamos obter o tamanho do vetor int n = tam; int i, j, indice_menor_elemento; // o laço externo percorre os elementos do vetor a partir // do primeiro elemento e vai até o penúltimo elemento for (i = 0; i < n - 1; i++){ // encontramos o menor elemento do sub-vetor que ainda // não foi ordenado indice_menor_elemento = i; // o laço interno começa no índice (i + 1) e vai // até a quantidade de elementos no vetor - 1 for (j = i + 1; j < n; j++){ // o elemento atual (j) é menor que o elemento no // índice do menor elemento? if (vetor[j] < vetor[indice_menor_elemento]){ // atualizamos o índice do menor elemento indice_menor_elemento = j; } } // troca o menor elemento com o elemento no índice // i, no sub-vetor já ordenado if(vetor[indice_menor_elemento] != vetor[i]){ int temp = vetor[indice_menor_elemento]; vetor[indice_menor_elemento] = vetor[i]; vetor[i] = temp; } } } Por apresentar laços aninhados (um laço externo e um interno), a ordenação Selection Sort não é recomendada para grandes conjuntos de dados, visto que sua complexidade de tempo é de O(n2). |
![]() |
C ::: Dicas & Truques ::: Matemática e Estatística |
Como elevar uma base a um determinado expoente usando a função pow() da linguagem CQuantidade de visualizações: 2997 vezes |
Em algumas situações nós precisamos efetuar cálculos de potenciação em C, ou seja, elevar um número (uma base) a um determinado expoente e obter sua potência. Veja a figura a seguir:![]() Veja que aqui o valor 5 foi elevado ao cubo, ou seja, ao expoente 3 e obtemos como resultado sua potência: 125. A linguagem C nos fornece a função pow(), presente no header math.h que recebe como argumentos a base e o expoente e nos retorna a potência (como um valor double). Veja um exemplo de seu uso no código abaixo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ int base = 4; int expoente = 5; double potencia = pow(4, 5); printf("A base %d elevada ao expoente %d é igual à potência %f\n\n", base, expoente, potencia); system("PAUSE"); return 0; } Ao executarmos este código C nós teremos o seguinte resultado: A base 4 elevada ao expoente 5 é igual à potência 1024.000000 Note que a função pow() da linguagem C retorna um valor double. |
C ::: C para Engenharia ::: Física - Mecânica |
Como calcular a velocidade da queda livre de um corpo dado o intervalo de tempo (e a aceleração da gravidade) em CQuantidade de visualizações: 2496 vezes |
A Queda Livre é um Movimento Uniformemente Variado, na qual um objeto em queda livre tem a sua velocidade aumentada a taxas constantes. Abandonado em alturas próximas da terra, a velocidade com que um corpo cai aumenta a uma taxa de aproximadamente 9,8m/s. Isso é o mesmo que dizer que a aceleração da gravidade terrestre é de 9,8m/s2, o que aumenta a velocidade do objeto em 35,28km/h a cada segundo. Assim, a fórmula da velocidade de um objeto em queda livre é: \[ \text{v} = \text{g} \cdot \text{t} \] Onde: v ? velocidade de queda (m/s) g ? aceleração da gravidade (m/s2) t ? intervalo de tempo (s) Vamos ver um exemplo? Veja o seguinte enunciado: 1) Um corpo é abandonado a uma altura qualquer no tempo 0s e está em queda livre. Calcule a sua velocidade no tempo 15s. Como sabemos que o intervalo de tempo é 15s, só precisamos jogar na fórmula. Veja o código C completo para o cálculo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ // gravidade terrestre em m/s2 float gravidade = 9.80665; // intervalo de tempo da queda livre (em segundos) float tempo = 15.00; // em segundos // velocidade da queda nesse intervalo float velocidade = gravidade * tempo; // mostramos o resultado printf("A velocidade da queda livre é: %fm/s", velocidade); printf("\n\n"); system("PAUSE"); return 0; } Ao executar este código C nós teremos o seguinte resultado: A velocidade da queda livre é: 147.099747m/s Se quisermos saber a velocidade em km/h, basta multiplicar o resultado por 3.6, o que dará 529.56km/h. Vamos tornar o experimento mais interessante? Veja uma modificação no código C que mostra a velocidade da queda nos 10 primeiros segundos, de forma individual: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ int i; // variável de controle do laço // gravidade terrestre em m/s2 float gravidade = 9.80665; // intervalo de tempo da queda livre (em segundos) int tempo; // velocidade da queda nesse intervalo float velocidade; // um laço for que repete 10 vezes for(i = 1; i <= 10; i++){ tempo = i; // inicialmente será um segundo velocidade = gravidade * tempo; printf("A velocidade no tempo %d: %fm/s\n", tempo, velocidade); } printf("\n\n"); system("PAUSE"); return 0; } Ao executar este código C nós teremos o seguinte resultado: A velocidade no tempo 1: 9.806650m/s A velocidade no tempo 2: 19.613300m/s A velocidade no tempo 3: 29.419950m/s A velocidade no tempo 4: 39.226601m/s A velocidade no tempo 5: 49.033249m/s A velocidade no tempo 6: 58.839901m/s A velocidade no tempo 7: 68.646553m/s A velocidade no tempo 8: 78.453201m/s A velocidade no tempo 9: 88.259850m/s A velocidade no tempo 10: 98.066498m/s |
C ::: Dicas & Truques ::: Strings e Caracteres |
Como concatenar apenas parte de uma string à outra string usando a função strncat() da linguagem CQuantidade de visualizações: 9864 vezes |
Muitas vezes precisamos adicionar à uma string apenas alguns caracteres de outra, ou seja, não queremos concatenar as duas strings completamente; apenas parte da segunda. Para isso podemos usar a função strncat(). Veja o protótipo e explicação desta função:char *strncat(char *str1, const char *str2, size_t n); Aqui a quantidade n de caracteres da string str2 será anexada ao final da string str1. O caractere de fim de string (null character) da str1 é sobrescrito durante a operação e anexado novamente assim que os caracteres desejados da str2 sejam copiados. Veja um exemplo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char texto[] = "Gosto muito de "; char palavra[] = "C++"; /* Na segunda sequencia de caracteres nós temos "C++", mas queremos anexar à primeira sequencia apenas "C". Veja como isso é feito */ strncat(texto, palavra, 1); // exibe o resultado puts(texto); system("pause"); return 0; } Ao executar este códigos nós teremos o seguinte resultado: Gosto muito de C |
C ::: Desafios e Lista de Exercícios Resolvidos ::: Arrays e Matrix (Vetores e Matrizes) |
Exercícios Resolvidos de C - Escreva um programa C para mover todos os zeros para o final do vetor, sem alterar a ordem dos elementos já presentes no arrayQuantidade de visualizações: 816 vezes |
Pergunta/Tarefa: Dado o seguinte vetor de inteiros: // vamos declarar e construir um vetor de 8 inteiros int valores[] = {0, 3, 0, 5, 7, 4, 0, 9}; Sua saída deverá ser parecida com: Vetor na ordem original: 0 3 0 5 7 4 0 9 Vetor com os zeros deslocados para o final: 3 5 7 4 9 0 0 0 Veja a resolução comentada deste exercício usando C: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <locale.h> int main(int argc, char *argv[]){ // vamos declarar e construir um vetor de 8 inteiros int valores[] = {0, 3, 0, 5, 7, 4, 0, 9}; int i; // para o controle do laço int j; // variável auxiliar int temp; // variável temporária setlocale(LC_ALL,""); // para acentos do português // vamos mostrar o vetor na ordem original printf("Vetor na ordem original:\n"); for(i = 0; i < 8; i++){ printf("%d ", valores[i]); } // vamos inicializar j como 0 para que ele aponte para // o primeiro elemento do vetor j = 0; // agora o laço for percorre todos os elementos do vetor, // incrementanto a variável i e deixando o j em 0 for(i = 0; i < 8; i++){ // encontramos um valor que não é 0 if(valores[i] != 0){ // fazemos a troca entre os elementos nos índices // i e j temp = valores[i]; valores[i] = valores[j]; valores[j] = temp; // e avançamos o j para o elemento seguinte j++; } } // agora mostramos o resultado printf("\n\nVetor com os zeros deslocados para o final:\n"); for(i = 0; i < 8; i++){ printf("%d ", valores[i]); } printf("\n\n"); system("pause"); return 0; } Não se esqueça: A resolução do exercício deve ser feita sem a criação de um vetor, array ou lista adicional, e os elementos diferentes de zero devem permanecer na mesma ordem que eles estavam antes. |
C ::: Dicas & Truques ::: Rotinas de Conversão |
Como converter uma string em um valor de ponto-flutuante usando a função atof() da linguagem CQuantidade de visualizações: 9055 vezes |
Em algumas situações, pode ser necessário converter uma string em um valor numérico de ponto-flutuante. Para isso podemos usar a função atof(). Esta função recebe uma matriz de caracteres e tenta transformá-la em um valor de ponto-flutuante. Se a conversão não for possível, o valor 0 é retornado. Os sinais "+" e "-", o ponto decimal e uma parte exponencial, representada por "e" ou "E" são válidos na string a ser convertida. Veja um exemplo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { // valor de ponto-flutuante em forma de string char valor_str[] = "34.5"; // A linha abaixo causa um comportamento estranho //float res = 10 + valor_str; // temos que converter a string em um valor de ponto-flutuante válido float res = 10 + atof(valor_str); printf("O resultado e: %f", res); puts("\n"); system("pause"); return 0; } |
C ::: Desafios e Lista de Exercícios Resolvidos ::: Métodos, Procedimentos e Funções |
Exercício Resolvido de C - Escreva um programa que solicite dois números do tipo inteiro distintos ao usuário e que apresente na tela o maior delesQuantidade de visualizações: 606 vezes |
Pergunta/Tarefa: Escreva um programa que solicite dois números do tipo inteiro distintos ao usuário e que apresente na tela o maior deles. Esse programa deve possuir uma função para verificar qual é o maior número. Atenção: seu código deverá assegurar que os dois números informados pelo usuário sejam diferentes. Exiba uma mensagem na tela caso isso acontecer. Sua saída deverá ser parecida com: Informe o primeiro número inteiro: 6 Informe o segundo número inteiro: 3 O maior número é: 6 Veja a resolução comentada deste exercício em C: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <locale.h> // protótipo da função que receberá dois números inteiros // e retornará o maior deles int maior_numero(int num1, int num2); // função principal do programa int main(int argc, char *argv[]){ setlocale(LC_ALL,""); // para acentos do português // variáveis usadas na resolução do problema int num1, num2, maior; // vamos pedir para o usuário informar os dois números printf("Informe o primeiro número inteiro: "); scanf("%d", &num1); printf("Informe o segundo número inteiro: "); scanf("%d", &num2); // os números são iguais? if(num1 == num2){ printf("Erro. Os dois números são iguais."); } else{ // vamos chamar a função para obter o número maior maior = maior_numero(num1, num2); printf("O maior número é: %d", maior); } printf("\n\n"); system("PAUSE"); return 0; } // função que receberá dois números inteiros e retornará // o maior deles int maior_numero(int num1, int num2){ // o primeiro número é maior que o segundo? if(num1 > num2){ return num1; } else{ return num2; } } |
C ::: Dicas & Truques ::: Struct (Estruturas, Registros) |
Como escrever um função que retorna uma estrutura (struct) usando a linguagem CQuantidade de visualizações: 16215 vezes |
Muitas vezes precisamos escrever funções que retornam estruturas, ou melhor, que alocam e retornam ponteiros para estruturas. Esta não é, definitivamente, uma tarefa para iniciantes em C. Contudo, esta dica lhe fornecerá um código completo indicando-lhe uma das formas mais simples de conseguir tal proeza. Antes de executar o código, porém, dê uma olhada atenta na função obter_livro(). Veja que esta função recebe o título, o código e o número de páginas de um livro. Em seguida a função aloca memória para uma estrutura, preenche seus membros e retorna um ponteiro para tal estrutura. Eis a listagem completa: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> // define a estrutura Livro struct Livro{ char *titulo; int codigo; int paginas; }; // função que aloca e retorna um ponteiro para uma // estrutura Livro struct Livro* obter_livro(char *titulo, int codigo, int paginas){ // aloca memória para uma estrutura Livro struct Livro *temp = (struct Livro*)malloc(sizeof(struct Livro)); // preeche os membros da estrutura temp->titulo = titulo; temp->codigo = codigo; temp->paginas = paginas; return temp; } int main(int argc, char *argv[]){ // obtém uma instância da estrutura Livro struct Livro *a = obter_livro("Programando em Java", 345, 120); // verifica se a estrutura foi retornada com // sucesso if(a != NULL){ printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n", a->titulo, a->codigo, a->paginas); } // obtém uma segunda instância da estrutura Livro struct Livro *b = obter_livro("JavaScript - Guia", 540, 800); // verifica se a estrutura foi retornada com // sucesso if(b != NULL){ printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n", b->titulo, b->codigo, b->paginas); } puts("\n\n"); system("PAUSE"); return 0; } Ao executar este código nós teremos o seguinte resultado: Titulo: Programando em Java Codigo: 345 Paginas: 120 Titulo: JavaScript - Guia Codigo: 540 Paginas: 800 Pressione qualquer tecla para continuar... |
C ::: Dicas & Truques ::: Matemática e Estatística |
Como testar se um número é primo em CQuantidade de visualizações: 2554 vezes |
O Número Primo é o número maior que 1 e que só pode ser dividido por 1 e por ele mesmo, ou seja, números primos não podem ser divididos por outros números, a não ser por ele mesmo e pelo número 1. Dessa forma, 2, 3, 5, 7, 11, 13, 17, etc, são todos números primos. É importante observar que 0 e 1 não são números primos, e que o número 2 é o único número primo par. Veja agora um código C completo que pede para o usuário informar um número inteiro positivo e mostra uma mensagem indicando se o número informado é primo ou não: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ int numero, i; int primo = 1; // verdadeiro, true // vamos solicitar um número inteiro positivo printf("Informe um número inteiro positivo: "); scanf("%d", &numero); // o número é negativo? if(numero < 0){ printf("Número inválido.\n\n"); } // é 0 ou 1? else if((numero == 0) || (numero == 1)){ printf("Número válido, mas não é primo.\n\n"); } // passou até aqui. Vamos testar se o número é primo else{ for (i = 2; i <= (numero / 2); i++){ // se passar no teste, não é primo if (numero % i == 0) { primo = 0; // recebe false break; } } if(primo){ printf("O número informado é primo\n\n"); } else{ printf("O número informado não é primo\n\n"); } } printf("\n\n"); system("PAUSE"); return 0; } Ao executar este código C nós teremos o seguinte resultado: Informe um número inteiro positivo: 9 O número informado não é primo |
Desafios, Exercícios e Algoritmos Resolvidos de C |
Veja mais Dicas e truques de C |
Dicas e truques de outras linguagens |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |