-
Posts
1.558 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que isrnick postou
-
C Faça um programa que calcule a soma dos números primos abaixo de dois milhões
isrnick respondeu ao tópico de Anatanael Barbosa em C/C#/C++
Se quiser manter usando um tipo inteiro poderia usar o tipo long ao invés de int, ou até long long se long não for o suficiente, só precisa lembrar de usar o especificador de tipo correto na função printf (%ld para long ou %lld para long long). https://en.cppreference.com/w/c/io/fprintf -
C Faça um programa que calcule a soma dos números primos abaixo de dois milhões
isrnick respondeu ao tópico de Anatanael Barbosa em C/C#/C++
Divisores sempre vem em pares, ou seja para cara divisor d de um dado número n existe outro divisor que pode ser encontrado dividindo n/d. (Com a exceção do caso em que divisor é a igual a √n pois nesse caso o outro divisor encontrado será o próprio divisor original, pois n / √n = √n.) No seu exemplo: 1 é divisor de 175, e 175/1 = 175 também é divisor de 175. 5 é divisor de 175, e 175/5 = 35 também é divisor de 175. 7 é divisor de 175, e 175/7 = 25 também é divisor de 175. Daí vemos que 175 tem 6 divisores, mas sabendo os 3 primeiros podemos encontrar os outros 3. Se fizer o mesmo para outros números vai notar que isto funciona para qualquer número, só precisamos saber metade dos divisores para encontrar todos os divisores dele. Então só precisamos achar metade dos divisores, pois a outra metade já fica implícita. E queremos saber em que ponto devemos parar de procurar divisores tal que garanta que já tenhamos encontrado a primeira metade dos divisores. Então observe abaixo que enquanto os números da primeira metade dos divisores estão em ordem crescente 1, 5 e 7, os seus respectivos divisores correspondentes, decorrentes divisão de 175 pelo divisor, estão em ordem decrescente 175, 35 e 25. 1 -> 175 5 -> 35 7 -> 25 E vamos continuar testando números acima de 7 e ver onde os dois se encontram: 8 -> 175/8 = 21.875 9 -> 175/9 = 19,444 10 -> 175/10 = 17,5 11 -> 175/11 = 15,9091 12 -> 175/12 = 14,583 13 -> 175/13 = 13,462 14 ->175/14 = 12,5 Note neste último que o número da direita finalmente ficou menor que o da esquerda, logo passamos da metade, logo seria suficiente procurar por divisores apenas até o número 13. Se pensar um pouco fica claro que a metade exata sempre vai estar no ponto onde os 2 lados são exatamente iguais, e esse ponto é na raiz quadrado do número analisado: √175 -> 175/√175 = √175 Logo, para encontrar divisores de um número só precisamos checar números que sejam menor ou igual que a raiz quadrada do número para encontrar a primeira metade dos divisores, e a segunda metade pode ser calculada a partir destes divisores já encontrados. No caso deste programa não estamos tentando achar todos os divisores dos números, apenas se existe algum divisor além de 1 e o próprio número, então basta checar até encontrar um divisor, mas se chegar na raiz quadrada sem encontrar nenhum divisor o número é primo. -
C Faça um programa que calcule a soma dos números primos abaixo de dois milhões
isrnick respondeu ao tópico de Anatanael Barbosa em C/C#/C++
Para ver se o número tem divisores só precisa dividir até a raiz quadrada do número, não precisa testar até o próprio número. E números ímpares só são divisíveis por números ímpares (quando tem divisores). #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i, j, somaPrim = 2, raizQuad, primo; /* i -> Contador de 3 a 2000000 obs. (inicia no 3 pois o unico numero primo par é 2) e (conta de 2 em 2) j -> Contador de 1 ate o i (atual) para verificar quantos divisores tem o numero somaPrim -> soma dos primos (inicia no 2 pois o 2 é o unico numero primo par raizQuad -> calcula a raiz quadrada de i primo -> indica se o número é primo (1 = verdadeiro, 0 = falso) */ for (i = 3; i <= 2000000; i += 2) { primo = 1; raizQuad = (int)sqrt(i); //Só precisa checar até a raiz quadrada do número for (j = 3; j <= raizQuad; j += 2) { //Números ímpares só são divisíveis por ímpares if (i % j == 0) { primo = 0; break; } } if (primo) { somaPrim += i; } } printf("A soma dos numeros primos abaixo de 2 milhoes eh: %d\n\n", somaPrim); system("pause"); return 0; } -
Outra maneira para eliminar números fracionários (além de eliminar letras) seria checar o que é o primeiro caractere seguinte ao número: if(scanf("%d%c", &nr, &ch) != 2 || ch != '\n') { printf("Erro, apenas numeros inteiros.\n"); } // Ou então: if(scanf("%d%c", &nr, &ch) != 2 || ch == '.' || ch == ',') { printf("Erro, apenas numeros inteiros.\n"); }
-
Para ser compilado o código já precisa estar salvo num arquivo, no máximo você vai poder fazer uma cópia do arquivo.
-
C Erro ao passa matriz como ponteiro (Falha de segmentação)
isrnick respondeu ao tópico de Leirbag System NRx em C/C#/C++
Pra você entender primeiro vamos voltar aos vetores. Isso lida com a diferença entre um vetor e um ponteiro. Quando você criar um vetor: int vetor[3]; Se usar o nome vetor sem os colchetes posteriormente no programa para armazenar num ponteiro, na prática o que é retornado é a referência da primeira casa do vetor, ou seja é o mesmo que fazer &vetor[0]. Então: int vetor[3]; int *ponteiro; //Fazer isso: ponteiro = vetor; //É o mesmo que fazer isso: ponteiro = &vetor[0]; Resultando em ambos os casos que o ponteiro aponta para a primeira casa do vetor (e não para o vetor inteiro). Podemos então fazer aritmética de ponteiros, ou notação de vetores, para apontar para as demais casas do vetor. //Por exemplo poderiamos acessar a terceira casa do vetor fazendo: *(ponteiro + 2) //Ou: ponteiro[2] Poderíamos acessar essa casa da mesma maneira diretamente no vetor fazendo vetor[2] (ou *(vetor + 2)), mas a diferença do ponteiro para o vetor é que o vetor contém a informação sobre o número de casas que ele contém, nesse caso ele é composto por 3 inteiros, mas esse ponteiro contém informação apenas sobre a primeira casa para onde ele aponta. Se usar a palavra chave sizeof para checar o tamanho verá que sizeof(vetor) é diferente de sizeof(ponteiro). Agora no caso da matriz: int matriz[3][3]; Seguindo a mesma lógica dada para os vetores, ao usar o nome matriz será obtida a referência para &matriz[0], ou seja a referência da primeira linha inteira da matriz, mas é um vetor inteiro de 3 posições, logo fazer essa atribuição num ponteiro comum não seria compatível: int *ponteiro; ponteiro = &matriz[0]; //ERRO Pois esse ponteiro só pode apontar para 1 único inteiro, mas está tentando guardar nele uma referência para um vetor com 3 inteiros. Nesse caso precisamos introduzir o conceito de um ponteiro que aponta para um vetor/array, para poder armazenar esta referência, cuja notação é (*ponteiro)[n], ou seja trata-se de um ponteiro que aponta para um array de comprimento n. Então nesse caso o código correto ficaria assim: int matriz[3][3]; int (*ponteiro)[3]; ponteiro = &matriz[0]; //CORRETO //Que é igual a: ponteiro = matriz; Logo, é necessário usar um ponteiro para um array no parâmetro da função, mas já que vai ter que colocar o número de colunas de qualquer maneira pode usar a notação de matriz flexível que já está usando em outras partes do código ponteiro[][3], é só uma questão de preferência. O seu engano foi usar um ponteiro para ponteiro (int **ponteiro) como parâmetro da função, e isto trata-se de um ponteiro que aponta para outra variável do tipo ponteiro, e não serve para apontar para um vetor, não contém a informação do comprimento do vetor logo são incompatíveis. E o que ocorreu no seu programa foi uma conversão forçada de um tipo o para outro, mas quando o programa tenta percorrer as posições da matriz nesse ponteiro eventualmente acaba tentando acessar uma posição da memória que não foi alocada e causa o crash do programa. OBS: Também não deve confundir um ponteiro para um vetor (*ponteiro)[n] , com um vetor de ponteiros *vponteiros[n], pois nesse segundo está sendo criado um vetor com n ponteiros comuns. Uma alternativa para não fixar o tamanho da matriz nos parâmetros da função é usar uma matriz de comprimento variável assim: int func(int linhas, int colunas, int matriz[linhas][colunas]); //ou para uma matriz quadrada: int func(int n, int matriz[n][n]); Nesse caso é importante que os parâmetros estejam na ordem correta, ou seja linhas e colunas tem que vir antes de matriz pois esta depende de que as variáveis já tenham sido declaradas no escopo da função, e já tenham recebido valores que definirão seu tamanho. -
É o enunciado realmente menciona que a função recebe 2 vetores... Mas não acho que o professor consideraria um erro se adicionar os comprimentos dos vetores como parâmetros. Mas deste modo a função não é modular, ou seja não pode ser reutilizada, visto que só vai funcionar nesse programa específico, ou então a pessoa que escrever o outro programa também precisaria saber previamente que deve definir as constantes X e Y para que a função funcione. Com os comprimentos dos vetores como parâmetros a função exige que essas informações sejam fornecidas para poder funcionar. Isso se torna especialmente importante mais pra frente quando tiver dividindo seu código em vários arquivos, e aprende a fazer bibliotecas que podem ser reutilizadas em programas diferentes, bastando importar o código que já está pronto no novo programa.
-
A função exibeDiferencaAB também deveria receber os comprimentos dos vetores A e B como parâmetros. E uma boa indentação do código é um requisito, senão dá muito trabalho identificar o que está acontecendo no código. E existem várias ferramentas para indentar códigos automaticamente, uma boa ferramenta online que eu uso é essa: https://www.tutorialspoint.com/online_c_formatter.htm E falando em facilitar a compreensão do código isso é mais uma recomendação do que uma necessidade: Código é feito para ser lido por outras pessoas, então usar nomes de variáveis descritivos e/ou colocar comentários ajuda a próxima pessoa a compreender seu código. Veja o código modificado: #include <stdio.h> # define X 10 # define Y 15 int busca (int numero, int n, int *vetor) { int i; for (i=0; i<n; i++) { if (vetor[i]==numero) return 1; } return 0; } void exibeDiferencaAB (int n1, int *vetor1, int n2, int *vetor2) { int achou, i; for (i=0; i<n1; i++) { achou=busca(vetor1[i], n2, vetor2); if (!achou) //se nao achou o numero printf("%d, ",vetor1[i]); } } int main(void) { int vetor1[X]= {1,4,3,7,99,14,17,16,11,13}; int vetor2[Y]= {4,2,3,9,1,1,5,16,11,33,44,55,66,23,5}; exibeDiferencaAB (X, vetor1, Y, vetor2); return 0; }
-
Sim. Do modo como o @Flávio Pedroza indicou não repete linhas de código.
-
Sim, tem uma linha vermelha apontando para o somaAl, não para o scanf... E fazer a soma na função faz sentido. adicionado 9 minutos depois Como falei se o scanf estiver fora da função você pode fazer um scanf para obter o primeiro valor de agência antes do while por exemplo... int main(void) { int agencia, dig1; int conta, dig2; printf("\nDigite a agencia:.... "); scanf("%d",&agencia); while (agencia!=0) { printf("\nDigite a conta:...... "); scanf("%d",&conta); calcDigitos(conta,agencia,&dig1,&dig2); //...código que imprime os resultados aqui... printf("\nDigite a agencia:.... "); scanf("%d",&agencia); } return 0; } @jcgs98 Outra opção seria fazer um loop infinito e interromper com um break como o @Flávio Pedroza indicou.
-
Pela imagem ela exigiu que a somaAlg fosse calculada na função, não que os scanfs estivessem dentro da função. No seu código a soma está no lugar correto. Eu indiquei que a leitura dos dados é que não deveria estar dentro da função. Não encerra não, o scanf para obter o valor inicial de agencia deve vir antes de fazer a primeira comparação para checar se agencia!=0 .
-
Não deveria pedir para o usuário digitar agência e conta dentro da função calcDigitos, como seu nome sugere ela deve apenas calcular os dígitos, nesse caso os valores da agência e conta seriam enviados via parâmetro para a função. Assim esta leitura de dados digitados pelo usuário ficaria no main, e aí bastaria fazer um ciclo que continua rodando até o valor da agência digitado ser igual a 0. adicionado 5 minutos depois Em C qualquer valor diferente de 0 (zero) é VERDADEIRO, e o valor zero é igual a FALSO. Sabendo dessa propriedade seria possível por exemplo fazer uma verificação assim: if (agencia) { printf("Agencia eh diferente de 0 = VERDADEIRO\n"); } else { printf("Agencia eh igua a 0 = FALSO\n"); } (Isso é só um exemplo não é uma sugestão para o seu código.)
-
Isso supõe que a pasta bin do MinGW, onde ficam os executáveis dele, foi configurada na variável de ambiente PATH do seu Windows para sempre poder rodar os executáveis de qualquer pasta que você esteja. Então você pode abrir o CMD na pasta onde está o código fonte e digita mingw32-make para compilar automaticamente.
-
Se quiser tirar as dúvidas poste o que não conseguiu entender. E veja aqui outra solução que pode ser mais fácil de entender: #include <stdio.h> #include <stdlib.h> int main(void) { int vNota[25] = {1, 1, 2, 10, 10, 3, 4, 6, 7, 7, 8, 9, 3, 10, 4, 5, 2, 7, 5, 9, 8, 4, 6, 8, 9}; int vAtend[25] = {1, 2, 3, 4, 5, 6, 2, 3, 4, 5, 1, 2, 3, 6, 4, 5, 4, 6, 1, 3, 4, 5, 6, 2, 4}; int func, j, qnt; float soma; for (func = 1; func <= 6; func++){ //Para cada funcionário faça: soma = 0; qnt = 0; for (j = 0; j < 25; j++) { //Percorre todos os atendimentos... if (vAtend[j] == func) { //Se encontrar o funcionário atual faça: soma += vNota[j]; //Soma a nota ao total do funcionário qnt++; //Incrementa a quantidade de atendimentos do funcionário } } if (qnt != 0) printf("\nMedia do funcionario %d: %.6f", func, soma/qnt); } return 0; } Mas seria interessante você entender a solução da sua professora pois em programação quanto mais opções, e maneiras diferentes de fazer algo, você aprender mais preparado estará para resolver problemas diferentes e/ou mais complexos.
-
Deu pra entender? Se tiver dúvidas pode perguntar.
-
#include <stdio.h> #include <stdlib.h> #define X 8 int busca (int num, int pos, int *vetor,int inic) { int i; for (i=inic; i<pos; i++) { if (vetor[i]==num) return i; } return -1; } int main (void) { int xua,m, i,j, aux=0; int achar=0; int vetor [X]; for(i=0;i<X;i++) { printf("\n\nDigite o numero %d do Vetor...: ",i+1); fflush(stdin); scanf("%d",&vetor[i]); } printf("\nVetor gerado\n"); for(i=0;i<X;i++) { printf("%d ",vetor[i]); } printf("\nQual numero buscar? "); scanf("%d",&achar); aux=busca (achar,X,vetor,0); if (aux == -1) printf("\nNumero nao encontrado!"); while (aux != -1) { printf("\nNumero %d encontrado na posicao.........: %d do vetor.",achar,aux); xua=aux+1; aux=busca (achar,X,vetor,xua); } return 0; }
-
Sim, o código está errado, o índice do vNota nessa linha deveria ser i, ficando: vTot[func]+=vNota[i];
-
Tem 6 funcionários então ela criou um 2 vetores de 6 posições, vcont para contar quantas vezes cada funcionário atendeu, e vtot para somar as notas recebidas por cada funcionário em cada atendimento (= total das notas). Observe que vetores na linguagem C começam com índice 0, e nesse caso o índice vai até 5. Mas os números dos funcionários começam em 1 e vão até 6. Então para compensar ela subtraiu -1 dos números dos funcionários para fazer cada índice do vetor corresponder a um dos funcionários. Tendo a soma total e a quantidade de atendimentos de cada funcionário basta dividir a soma pela quantidade para obter a nota média do funcionário. Sua professora também tratou o caso especial em que nenhum atendimento foi realizado pelo funcionário, pois nesse caso não é possível calcular a média pois não é possível dividir por zero, então o programa dela só calcula e imprime a média se a quantidade de atendimentos vcont do funcionário for diferente de zero.
-
Tem que entender o que o enunciado diz, mas sua confusão é justificável visto que o enunciado não é claro o suficiente. Pelo que entendi (e confirmado pela resolução da sua professora) basicamente o enunciado está dizendo que foram feitos 25 atendimentos pelos funcionários. No vetor vNota estão as notas que cada atendimento recebeu, e no vetor vAtend estão os números dos funcionários que fizeram cada atendimento respectivamente. Ou seja, o n-ésimo atendimento recebeu nota vNota[n] e foi atendido pelo funcionário vAtend[n].
-
Uma maneira seria percorrer os vetores 6 vezes, 1 para cada funcionário, e ir somando as notas deste funcionário e contando a quantidade de notas, e calcula e imprime a média do respectivo funcionário toda vez que acabar de percorrer o vetor dividindo a soma pela quantidade.
-
C Estrutura de repetição: Media de 10 numeros com estrutura de repetição
isrnick respondeu ao tópico de Yoshino152 em C/C#/C++
soma = soma + num media = soma / 10 -
C Estrutura de repetição: Media de 10 numeros com estrutura de repetição
isrnick respondeu ao tópico de Yoshino152 em C/C#/C++
Está calculando a média errado, faça a soma dos números no ciclo for, e depois do ciclo calcule a média dividindo a soma por 10. -
Basta usar a equação da elipse para achar os valores de x para cada y. https://www.somatematica.com.br/emedio/conicas/conicas2.php
-
Os melhores que sei são www.onlinegdb.com e repl.it .
-
A função rand() faz parte da biblioteca stdlib.h então deve incluí-la no programa para usá-la. E também é necessário usar srand(time(NULL)) uma vez no começo do programa para gerar uma semente para o gerador de números aleatórios, e como a função time() faz parte da biblioteca time.h também precisa incluir essa biblioteca. #include <stdlib.h> #include <time.h> int main(void) { srand(time(NULL)); //usar no começo do programa, ou ao menos 1 vez antes de usar rand() int num; . . . num = rand() % 1001; . . . }
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais