Ir ao conteúdo

isrnick

Membro Pleno
  • Posts

    1.558
  • Cadastrado em

  • Última visita

Tudo que isrnick postou

  1. Como você ainda está começando a aprender C é melhor que sempre use { e } após comandos de controle de fluxo do programa, como for, if, while, etc, mesmo que dentro das chaves só exista 1 comando... E nunca vai ; no final da linha desses comandos (existem alguns poucos casos em que colocar ; nessas linhas é uma opção, e você ainda não chegou no ponto de usar isso, e não será o caso em lugar algum nesse exercício). (Mais pra frente quando já tiver mais prática poderá omitir as chaves quando houver apenas 1 comando, mas primeiro tem que aprender a fazer sempre com chaves. Alguns programadores até preferem sempre usar chaves para manter a consistência do código.) Ok, segue seu código com modificações, fiz apenas essas correções de sintaxe da linguagem C, colocando { e } nos devidos lugares (e removendo os ; onde não deveriam existir), mas não alterei o restante da lógica do seu programa: #include <stdio.h> #include <stdlib.h> int main () { int vet1[5]; int vet2[5], maior, menor, i,j, matriz; for (i=0; i<=4;i++){ printf ("Diga o valor do vetor %d -> ", i+1); scanf ("%d", &vet1[i]); // lê os dados } maior=0; // assume que o maior valor está na primeira posição for (i=1; i<=4;i++){ if (vet1[i] > vet1[maior]){ maior= i; // acha a posição do maior } } for (j=0;j<=4;j++){ menor=0; for (i=1;i<=4;i++){ if (vet1[i] < vet1[menor]){ menor= i; } } vet2[j] = vet1[menor]; vet1[menor] = vet1[maior]; } for (i=0; i<=4; i++){ printf ("%d \n", vet2[i]); // imprime os dados } return 0; } É importante você entender essa parte, note também que fica fácil entender o fluxo dos comandos com todas as chaves { } e com o código bem indentado.
  2. @Flávio Pedroza Em C bool, true e false são definidos da biblioteca stdbool.h, logo se vai usá-los deve incluí-la. (E não está usando as bibliotecas stdlib.h e string.h então não precisa incluí-las.) E aqui está o código do @Flávio Pedroza com apenas algumas modificações para apenas imprimir (escrever) os números não repetidos (não precisando do vetor auxiliar): #include <stdio.h> #include <stdbool.h> /* Leia um vetor com 20 numeros inteiros. Escreva os elementos do vetor eliminando ele- mentos repetidos. */ #define TAM 20 int main() { int vet[TAM], i,j; bool rept; //variavel auxiliar para indicar se existe numero repetido for (i=0; i<TAM; i++) { printf("Digite o %do valor: ", i+1); scanf("%d", &vet[i]); } for (i=0; i<TAM; i++) { rept = false; for (j = 0; j < i; j++) { if (vet[i] == vet[j]) { rept = true; //indica que o numero esta repetido break; } } if (!rept) { //apenas imprime os numeros nao repetidos printf("%d ", vet[i]); } } return 0; }
  3. Mas 0 também é um número inteiro... Ele diz que deve eliminar os repetidos na escrita, ou seja não precisa alterar o vetor, apenas não imprime o número novamente se já tiver impresso, pra isso poderia apenas fazer checar todos os números anteriores do vetor e ver se algum deles é igual ao número atual, se não encontrar nenhum igual então imprime o número atual.
  4. Tentou sem usar start? Colocando só o caminho do arquivo? Normalmente você abre o jogo através de um link? Tem algum parâmetro/configuração extra na linha de comando desse link? Se abrir o Speed.exe clicando nele no Explorer o jogo abre normalmente? Fora isso só consigo pensar em usar runas, que é pra rodar um programa com um usuário específico... Mas não deveria ser necessário.
  5. Seria algo assim: @ECHO OFF :ESPERA TASKLIST /FI "IMAGENAME eq notepad.exe" /FI "STATUS eq running" | FIND /I "notepad.exe" > NUL IF "%errorlevel%"=="1" GOTO ESPERA GOTO INICIO :INICIO TASKLIST /FI "IMAGENAME eq notepad.exe" /FI "STATUS eq running" | FIND /I "notepad.exe" > NUL IF "%errorlevel%"=="1" ( ECHO copiar pasta c:\pasta para d:\pasta aqui GOTO ESPERA ) GOTO INICIO Assumo que o script batch vai ficar sempre rodando, mas quer que ele faça apenas 1 backup quando o aplicativo (no meu exemplo "notepad.exe") está fechado, não infinitos backups, então fiz ele sempre esperar até a próxima vez que o programa abrir novamente após fazer uma cópia/backup.
  6. Não, a ideia é diferente, não fica fazendo divisões pra ver se os números são primos. No crivo de Eratóstenes inicialmente assume-se que todos os números no intervalo são primos (um vetor indica todos inicialmente como true), aí começando do primeiro primo conhecido, o 2, acha todos os múltiplos dele e elimina marcando como não-primos (muda a posição no vetor para false), aí segue até o próximo número após 2 que ainda consta como primo, que é 3, e marca todos os todos os múltiplos de 3 como não-primos, e segue para o próximo número que ainda consta como primo, que é 5, e assim por diante, continuando até chegar na raiz quadrada de 2 milhões que é o intervalo de números que desejamos identificar como primos ou não no nosso caso. Ele usa a característica de que um número só pode ser múltiplo de números primos que vieram antes dele, então conforme vai eliminando os múltiplos dos primos já encontrados, todos os números não-primos no intervalo até o próximo número primo já terão sido eliminados e identificados como tal, sobrando só o próprio próximo número primo corretamente identificado na seqüência. Dê uma lida no artigo da Wikipedia que dá mais detalhes de como o crivo de Eratóstenes funciona. adicionado 32 minutos depois Mas posso fazer uma modificação no algoritmo para eliminar os múltiplos de 2 primeiro separadamente, aí o incremento para encontrar os múltiplos dos outros números primos pode ser 2x o primo: #include <stdio.h> #include <stdbool.h> #include <math.h> int main() { bool primo[2000001] = {false}; int i, j, n, raizQuad; long long somaPrim; n = 2000000; for (i = 2; i <= n; i++){ primo[i] = true; } for (j = 2*2; j <= n; j += 2){ primo[j] = false; } raizQuad = (int) sqrt(n); for (i = 3; i <= raizQuad; i++){ if(primo[i]){ for (j = i*i; j <= n; j += 2*i){ primo[j] = false; } } } somaPrim = 0; for (i = 2; i <= n; i++){ if (primo[i]){ somaPrim += i; } } printf("%lld\n", somaPrim); return 0; }
  7. Segue outra solução que fiz, ainda mais eficiente, usando o crivo de Eratóstenes: https://pt.wikipedia.org/wiki/Crivo_de_Eratóstenes #include <stdio.h> #include <stdbool.h> #include <math.h> int main() { bool primo[2000001] = {false}; int i, j, n, raizQuad; long long somaPrim; n = 2000000; for (i = 2; i <= n; i++){ primo[i] = true; } raizQuad = (int) sqrt(n); for (i = 2; i <= raizQuad; i++){ if(primo[i]){ for (j = i*i; j <= n; j += i){ primo[j] = false; } } } somaPrim = 0; for (i = 2; i <= n; i++){ if (primo[i]){ somaPrim += i; } } printf("%lld\n", somaPrim); return 0; } O tempo de execução desse programa foi de 0.01s, o programa anterior que postei demora de 0.21s a 0.35s, mais de 20 vezes mais lento.
  8. Tenta aumentar o tamanho do buff para 4. setbuf() não serve para o que você pretende fazer aí, o que faz quando usa NULL é desligar o buffer. https://en.cppreference.com/w/c/io/setbuf
  9. Está funcionando corretamente: https://onlinegdb.com/SykbmxWSV #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { double k,pi,numtermos; printf("Digite a quantidade de termos: \n"); scanf("%lf",&numtermos); pi=0; k=0; do { pi = pi + 2 * pow(-1,k) * pow(3,0.5-k) / (2 * k + 1); k=k+1; } while (k < numtermos); printf("Valor de pi:\n"); printf("%lf",pi); getchar(); return 0; } Digite a quantidade de termos: 5 Valor de pi: 3.142605 ...Program finished with exit code 0 Press ENTER to exit console.
  10. Falta inicializar k e pi, fazendo que comecem com valor 0, e a condição do do while também está errada, deve continuar enquanto k for menor que a quantidade de termos.
  11. Poste a sua tentativa para vermos onde está tendo dificuldades ou poste suas dúvidas. Não podemos resolver problemas pelos usuários.
  12. A condição do while está errada, o ciclo do while deve continuar enquanto o erro for maior ou igual a precisão (não menor ou igual). E como postei na primeira resposta a função abs() é para o tipo int, para double a função para obter o valor absoluto é fabs(), e para float a função é fabsf(). https://en.cppreference.com/w/c/numeric/math/fabs -> valor absoluto dos tipos de ponto flutuante https://en.cppreference.com/w/c/numeric/math/abs -> valor absoluto do tipos inteiros
  13. Você precisa postar o código como está atualmente pra vermos qual é o problema e podermos te ajudar. (Leia minha assinatura abaixo para ver como postar códigos no fórum.)
  14. Está tentando usar essa fórmula? Fonte: http://mathworld.wolfram.com/PiFormulas.html Então tem algumas coisas erradas, deveria ser assim: pi = pi + 2 * pow(-1, k) * pow(3, 0.5-k) / (2 * k + 1);
  15. ^ não é um operador de potência em C. Em C ^ é um operador binário OU EXCLUSIVO, e realmente não vai funcionar com float. Para calcular potência precisa usar a função pow() da biblioteca math.h (onde xn é calculado fazendo pow(x, n)).
  16. Pi é um número irracional, e sua aproximação não pode ser armazenada como inteiro, precisa guardar como número de ponto flutuante logo o tipo das variáveis deve ser double (ou float). (E para double a função para obter o valor absoluto é fabs().)
  17. O programa não conta quantos primos tem, mas sim faz a soma de todos os números primos abaixo de 2 milhões. Em C o valor 0 (zero) é igual a falso, e qualquer valor diferente de 0 (zero) é igual a verdadeiro. (Isso é válido em muitas linguagens de programação.) (Na prática a biblioteca stdbool.h apenas define macros em que false expande para 0, e true expande para 1. https://en.cppreference.com/w/c/types/boolean ) E quem é Mr Scoth?
  18. isrnick

    C Série de Fibonacci em c

    Pelo que entendi basta usar essa fórmula para calcular o n-ésimo número da sequência de Fibonacci, e imprimir o resultado. #include <stdio.h> #include <math.h> int main() { int n, fn; printf("Deseja calcular qual numero Fibonnaci? "); scanf(" %d", &n); fn = (int) 1.0/sqrt(5.0) * (pow((1.0 + sqrt(5.0))/2.0, n) - pow((1.0 - sqrt(5.0))/2.0, n)); printf("F(%d) = %d\n", n, fn); return 0; }
  19. .read() retorna uma string, mas pode checar fazendo print(type(mensagem)) . O mais provável é que a string esteja diferente da string comparada, logo não entra no if. Uma situação comum é a em que existe um caractere nova linha '\n' no fim da string do arquivo mas você não incluiu na string do if, logo não serão iguais.
  20. Exatamente por isso, o double é mais preciso e consegue armazenar a resposta correta deste problema sem erros, mas o float não é tão preciso e se torna necessário fazer arredondamentos nas casas menos significativas do número quando o número fica muito grande, nesse caso o erro no resultado final é positivo e o número ficou maior.
  21. Seria espaço depois de cd, ou seja "cd Codeblocks". Mas o modo mais simples de abrir o cmd numa pasta é navegar até a pasta usando o Explorer (pela imagem que postou você já fez isso, já está com a pasta aberta na tela), e quando estiver lá digite cmd na barra de endereços da pasta e dê Enter.
  22. @Sérgio Lembo Meu programa original já tem a variável raizQuad para armazenar a raiz e não recalcular toda vez que rodar o loop. A única correção necessária no meu programa é fazer somaPrim ser tipo long long. #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i, j, raizQuad, primo; long long somaPrim = 2; /* i -> Contador de 3 a 2000000 obs. (inicia no 3 pois o unico numero primo par eh 2) e (conta de 2 em 2) j -> Contador de 1 ate o i (atual) para verificar quantos divisores tem o numero raizQuad -> calcula a raiz quadrada de i primo -> indica se o numero eh primo (1 = verdadeiro, 0 = falso) somaPrim -> soma dos primos (inicia no 2 pois o 2 eh o unico numero primo par */ for (i = 3; i <= 2000000; i += 2) { primo = 1; raizQuad = (int)sqrt(i); //So precisa checar ate a raiz quadrada do numero for (j = 3; j <= raizQuad; j += 2) { //Numeros impares so sao divisiveis por impares if (i % j == 0) { primo = 0; break; } } if (primo) { somaPrim += i; } } printf("A soma dos numeros primos abaixo de 2 milhoes eh: %lld\n\n", somaPrim); system("pause"); return 0; }
  23. Como organizar o código é uma preferência, desde que esteja consistente em todo o código não há problemas. Em projetos grandes costuma-se definir regras que todos os programadores devem seguir para manter a consistência. Mas a parte importante é saber que a função main tem tipo int, logo deve retornar um valor usando a palavra chave return , no caso retorna-se 0 (zero) para indicar para o sistema que o programa foi encerrado corretamente (sem a ocorrência de erros ou interrupção inesperada).
  24. Que foi o que eu falei que seria possível fazer...
  25. Talvez não entendi o que o criador do tópico quis dizer?

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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!