Você está aqui: C ::: Dicas & Truques ::: Recursão (Recursividade) |
Como calcular fatorial em C usando uma função recursivaQuantidade de visualizações: 777 vezes |
Sempre que estamos no assunto de recursão (ou recursividade), um dos primeiros exemplos que vêm à nossa mente é o cálculo de fatorial, pois seu entendimento é fácil e, dessa forma, podemos nos concentrar nos aspectos da função recursiva. Na matemática, o fatorial de um número natural n, representado por n!, é o produto de todos os inteiros positivos menores ou iguais a n. O fatorial de um número n pode ser definido recursivamente da seguinte forma: 0! = 1; n! = n x (n - 1)!; sendo n > 0 Entendida esta definição, veja agora o código C completo para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <locale.h> // função recursiva para calcular o fatorial de um número int fatorial(int num) { // caso base if (num <= 1) { return 1; } else { return num * fatorial(num - 1); } } int main(int argc, char *argv[]){ int i; setlocale(LC_ALL,""); // para acentos do português // vamos calcular o fatorial dos número de 0 até 10 for (i = 0; i <= 10; i++) { printf("\%2d! = %d\n", i, fatorial(i)); } printf("\n\n"); system("PAUSE"); return 0; } Ao executar este código nós teremos o seguinte resultado: 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800 Note que aqui nós calculamos e exibimos o fatorial dos números de 0 até 10. |
Link para compartilhar na Internet ou com seus amigos: |
C ::: Dicas & Truques ::: Ponteiros, Referências e Memória |
Como usar ponteiros void na linguagem C - Curso de Linguagem C para iniciantesQuantidade de visualizações: 16548 vezes |
Em dicas desta seção você aprendeu que é possível criar ponteiros para os mais diferentes tipos. Veja:---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- int *ponteiro_int; float *ponteiro_float; double *ponteiro_double; Existe, porém, um tipo de ponteiro que pode ser usado com todos os tipos de dados existentes ou ainda a serem criados. Este tipo é conhecido como void, ou seja, um ponteiro genérico e pode ser declarado da seguinte forma: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- void *ponteiro; // ponteiro genérico Veja um trecho de código no qual usamos um ponteiro genéríco para apontar para variáveis de diferentes tipos: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int valor = 20; float valor2 = 5.23; void *ponteiro; // ponteiro genérico ponteiro = &valor; // aponta para um inteiro printf("%d\n", *(int *)ponteiro); ponteiro = &valor2; // aponta para um float printf("%0.2f\n", *(float *)ponteiro); system("PAUSE"); return 0; } Uma observação importante é a necessidade de uma conversão explícita (cast) no momento de desreferenciar um ponteiro genéríco. Neste caso ele precisa ser convertido para o tipo de ponteiro sendo usado no momento. Veja: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- printf("%d\n", *(int *)ponteiro); A parte (int *)ponteiro converte o ponteiro genérico em um ponteiro do tipo int e o símbolo * externo é usado para desreferenciar. Se essa conversão não for feita teremos um aviso e erro na maioria dos compiladores. Veja: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- printf("%d\n", *ponteiro); [Warning] dereferencing 'void *' pointer invalid use of void expression Embora essa conversão seja necessária quando estamos desreferenciando um ponteiro genérico, podemos abrir mão dela na atribuição de um ponteiro genérico a um ponteiro de um tipo específico: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- ponteiro = &valor; // aponta para um inteiro int *ponteiro_int = ponteiro; printf("%d\n", *ponteiro_int); Para finalizar, saiba que as funções malloc() e calloc() retornam ponteiros void, ou seja, ponteiros genéricos que podem ser atribuídos a ponteiros de qualquer tipos. Neste caso, o ponteiro retornado por estas funções aponta para a primeira posição do bloco de memória requisitada. |
C ::: Dicas & Truques ::: Arquivos e Diretórios |
Como ler o conteúdo de um arquivo uma linha de cada vez usando a função fgets() da linguagem CQuantidade de visualizações: 28682 vezes |
A função fgets(), disponível no header cstdio ou stdio.h, é usada para ler caracteres de um arquivo e armazená-los em um vetor de caracteres. Esta função recebe três argumentos. Veja:char *fgets(char *buffer, int num, FILE *file); No exemplo abaixo usamos um laço while() para ler o conteúdo até que o final de arquivo EOF seja encontrado. Desta forma, como sabemos que cada linha no arquivo termina com um marcador de fim de linha, fica fácil ler cada linha. É claro que se a linha sendo lida for maior que o tamanho do buffer, o efeito não será conseguido. Observe ainda que cada linha lida contém o caractere de fim de linha anexado a ela: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> const int TAM_BUFFER = 255; // quantidade de caracteres // a serem lidos no buffer de cada vez int main(int argc, char *argv[]) { FILE *arquivo = fopen("c:\\testes.txt", "r"); char buffer[TAM_BUFFER]; // testa se o arquivo foi aberto com sucesso if(arquivo != NULL){ // vamos usar um laço para ler o conteúdo do arquivo // e armazenar no buffer while(fgets(buffer, TAM_BUFFER, arquivo)){ printf("%s\n", buffer); } fclose(arquivo); // libera o ponteiro para o arquivo } else{ printf("Nao foi possivel abrir o arquivo."); } printf("\n\n"); system("PAUSE"); return 0; } |
C ::: Dicas & Truques ::: Arrays e Matrix (Vetores e Matrizes) |
Como testar se uma matriz é uma matriz identidade usando CQuantidade de visualizações: 1619 vezes |
Seja M uma matriz quadrada de ordem n. A matriz M é chamada de Matriz Identidade de ordem n (indicada por In) quando os elementos da diagonal principal são todos iguais a 1 e os elementos restantes são iguais a zero. Para melhor entendimento, veja a imagem de uma matriz identidade de ordem 3, ou seja, três linhas e três colunas: Veja um código C completo no qual nós declaramos uma matriz quadrada de ordem 3, pedimos para o usuário informar os valores de seus elementos e no final informamos se a matriz é uma matriz identidade ou não: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <locale.h> int main(int argc, char *argv[]){ setlocale(LC_ALL,""); // para acentos do português int n = 3; // ordem da matriz quadrada int matriz[n][n]; // matriz quadrada int i, j, linha, coluna; int identidade = 1; // vamos pedir para o usuário informar os elementos da matriz for (i = 0; i < n; i++){ for (j = 0; j < n; j++) { printf("Elemento na linha %d e coluna %d: ", (i + 1), (j + 1)); scanf("%d", &matriz[i][j]); } } // agora verificamos se a matriz é uma matriz identidade for(linha = 0; linha < n; linha++){ for(coluna = 0; coluna < n; coluna++){ if(matriz[linha][coluna] != 1 && matriz[coluna][linha] != 0){ identidade = 0; break; } } } // agora mostramos a matriz lida printf("\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%d ", matriz[i][j]); } printf("\n"); } if (identidade){ printf("\nA matriz informada é uma matriz identidade."); } else{ printf("\nA matriz informada não é uma matriz identidade."); } printf("\n\n"); system("PAUSE"); return 0; } Ao executar este código C nós teremos o seguinte resultado: Elemento na linha 1 e coluna 1: 1 Elemento na linha 1 e coluna 2: 0 Elemento na linha 1 e coluna 3: 0 Elemento na linha 2 e coluna 1: 0 Elemento na linha 2 e coluna 2: 1 Elemento na linha 2 e coluna 3: 0 Elemento na linha 3 e coluna 1: 0 Elemento na linha 3 e coluna 2: 0 Elemento na linha 3 e coluna 3: 1 1 0 0 0 1 0 0 0 1 A matriz informada é uma matriz identidade. |
Vamos testar seus conhecimentos em Fundações |
Fundações diretas ou rasas A viga de fundação é também chamada de viga baldrame. É utilizada para conectar sapatas isoladas e distribuir melhor o peso da estrutura para as camadas do solo. A partir disso, projete uma viga de fundação para os pilares P1 e P2, indicados na figura, sendo a taxa no solo σs = 0,4. Considere: P1 = P2 = 1.800KN. Dimensões P1 e P2 = 25cmX100cm. A) a = 400cm e b = 280cm. B) a = 365cm e b = 250cm. C) a = 250cm e b = 365cm. D) a = 345cm e b = 230cm. E) a = 405cm e b = 315cm. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Engenharia Civil - Estruturas de Aço e Madeira |
O aço no edifício A estrutura de estabilização da moldura estrutural da edificação da figura abaixo, que se caracteriza pelo fato de não possuir amarrações diagonais nem paredes de cisalhamento para assegurar a estabilidade lateral, pode ser chamada de: A) Estrutura contraventada. B) Moldura amarrada excentricamente. C) Moldura resistente a momentos. D) Paredes de cisalhamento. E) Nenhuma das alternativas anteriores. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Python |
Qual das formas abaixo é usada para criar uma LIST em Python? A) valores = {5, 1, 9, 4} B) valores = [5, 1, 9, 4] C) valores = (5, 1, 9, 4) D) valores = [5.. 1.. 9.. 4] E) valores = list[5, 1, 9, 4] Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Engenharia Civil - Construção Civil |
Fases de uma obra Ao documento em que se registram, pela ordem de sucessão em que são executados, os serviços necessários à realização da construção e os respectivos prazos, dá-se o nome de: A) Diário de obra. B) Cronograma físico-financeiro. C) Gráfico de Gantt. D) Planejamento. E) Cronograma físico. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Python |
Analise o seguinte código Pythonpalavra = "python" palavra.upper() print(palavra) A) PYTHON B) Um erro de execução na linha 2 C) python D) Python Verificar Resposta Estudar Cards Todas as Questões |
Desafios, Exercícios e Algoritmos Resolvidos de C |
Veja mais Dicas e truques de C |
Dicas e truques de outras linguagens |
Códigos Fonte |
Software de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais |
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais |
Linguagens Mais Populares |
1º lugar: Java |