Ir ao conteúdo
  • Cadastre-se

Ansi C

Membro Pleno
  • Posts

    3.288
  • Cadastrado em

  • Última visita

  1. Boa tarde! A calculadora com C. Falhou ao compilar com pelo menos dois alerta, sendo um crítico e outro relacionado. a.c: Na função ‘main’: a.c:13:9: aviso: formato ‘%i’ espera argumento do tipo ‘int *’, mas argumento 2 tem tipo ‘int’ [-Wformat=] 13 | scanf("%i",operação); | ~^ ~~~~~~~~ | | | | | int | int * a.c:13:1: aviso: ‘operacao’ é usado não inicializado [-Wuninitialized] 13 | scanf("%i",operação); | ^~~~~~~~~~~~~~~~~~~~ Linha 13 exige o endereço! No programa, não expressou um caso para operador inválido, sendo senso comum nesse exercício e outro que também não fez é o “Divisão por zero”, que acrescentei. Agora sua calculadora compila! c'11 - gcc11.4 #include <stdio.h> int main () { int operacao , n1 , n2 , resultado; printf ("Digite um numero: "); scanf ("%i",&n1); printf ("Digite outro numero: "); scanf ("%i",&n2); printf ("Digite [1] para somar\n"); printf ("Digite [2] para multiplicar\n"); printf ("Digite [3] para dividir\n"); printf ("Digite [4] para subtrair\n"); scanf ("%i",&operacao); switch (operacao) { case 1: resultado = n1 + n2; printf("%i",resultado); break; case 2: resultado = n1 * n2; printf ("%i",resultado); break; case 3: if (n2) { resultado = n1 / n2; printf ("%i",resultado); } else { printf ("%s%c","Divisão por zero!",'\n'); } break; case 4: resultado = n1 - n2; printf ("%i",resultado); break; default:/* * Operador Inválido */ printf ("%s%c","Operação inválida",'\n'); break; } }
  2. Boa tarde! A calculadora com C. No teste, noto um último 'probleminha', ela não consegue interagir de fato com o usuário, porque não instrui, não lista suas operações, e essa instrução é de bom senso nesta atividade. Custa um printf E não tem o "Divisão por zero!" e sua expressão lógica.
  3. Bom Dia! Apliquei as sugestões e/ou correções e acho que não esqueci nada. c'11 - gcc'11.4 #include <stdio.h> int main () { float term1= 0 , term2= 0; int r= 0; char operador= 0; do { /* isto solicita e escanea um 1x termo */ printf ("Digite um número: "); scanf ("%f",&term1); printf ("Digite outro número: "); scanf ("%f",&term2); /* ... um operador aritmético */ printf ("Qual operação você deseja fazer:\n[1]+\n[2]-\n[3]x\n[4]/\n?"); scanf (" %c",&operador); /* isto seleciona o 'circuito' dum dos cinco resultados */ switch ((int)operador) { case '1':/* soma */ term1+= term2; break; case '2':/* diferença */ term1-= term2; break; case '3':/* produto */ term1*= term2; break; case '4':/* quociente */ if (term2>0.0f) term1/= term2; else { printf ("%s%c","Divisão por zero.",'\n'); term1= 0; } break; default: /* não é uma operação */ printf ("%s","Operador inválido"); /* isto lava uma linha: um extração de texto */ while ((r= getchar ())!=EOF && r!='\n'); term1= 0; break; } /* escreve o resultado */ printf ("O resultado é %f",term1); printf ("%c%s",'\n',"Continuar [s para sim]? "); r= scanf (" %c",&operador); } while (EOF!=r && 's'==operador); putchar ('\n'); } obrigado!
  4. @Endmmans Boa Dia Testei seu programinha, ele tem uma falha comum nessa categoria de expressões, essa falha fica na escolha do operador antes de um escaneamento do segundo valor. A falha aqui consiste na extração dum caractere em branco por razão da combinação com o especificador 'c'. Esse caractere extraido é o quebra de linha (nova linha) e/ou entrar (enter). Observe o que ele fez: Qual o primeiro valor? 2022 Qual o segundo valor? 12 Qual a operação desejada? (+ para somar, - para subtrair)O resultado é 0.000000 Sabe-se que a função scanf absorve inicialmente os “em branco” quando há espaço na corda de formato (para mais detalhes, confirme/confira na documentação). Basta um espaço à frente do especificador, assim no início da formato " %c", que resolvemos esse problema, especificmente. c'11 - gcc'11.4 #include <stdio.h> int main () { float valor1 , valor2 , resultado; char sinal; printf ("Qual o primeiro valor? "); scanf ("%f", &valor1); printf ("Qual o segundo valor? "); scanf ("%f", &valor2); printf ("Qual a operação desejada? (+ para somar, - para subtrair)"); scanf (" %c", &sinal); if (sinal == '+') resultado = valor1 + valor2; else if (sinal == '-') resultado = valor1 - valor2; printf ("O resultado é %f", resultado); }
  5. @DanielC4 Bom Dia Para mim, teu programa falhou já no início, isso mesmo, meu mestre! Ao solicitar um termo… alguém entrou com ele e o programa escreveu isto: 0 0 0 ... É coluna densa de valores desconexos. A propósito, o número que alguém entrou era um inteiro. Veja: Digite um termo inicial: 0xff Digite uma razão: Digite um número a ser pesquisado na sequência: 0 ... 145003 ... 0 -13008 7 ... Ele informou, 0xff um inteiro, né? Deu nisso, sequer tem a oportunidade dum segundo. ... O especificador nos argumentos da scanf não concorda com a mensagem na solicitação, que também não está de acordo com enunciado. Parece bobagem, eu sei! @devair1010 tua expressão também falhou no valor para termo.
  6. Boa Noite! Para mim, já falha no começo, isso mesmo no LEIA... porque do jeitinho fofo que está ..., talvez o programa não leia o dado inteiro (15). O programa escreve: Insira os valores do vetor- _ O enunciado diz: 15 posições de números inteiro Alguém Entra Insira os valores do vetor 034 0xff 0 9 8 7 6 5 4 3 2 1 20 22 02 Sim, meu bem! Acima, alguém entrou com seus 15 números no escaneamento, que apesar de enunciar inteiro, extrai em decimal, sendo 1/3 das bases que normalmente se estuda antes dessa categoria de exercício. Não chegará ao ranqueamento, mas se chegar terá resultado duvidoso, né? Daí adicione ao fato `maior_valor` que matou o sentido de usar matriz no exercício que é de matrizes - cultura deste fórum (CdH) Enfim, com uns ajustes até compila: c'11 - gcc'11.4 #include <stdio.h> int main ( ) { int vet [15]= {0}; int i= 0 , maior= 0; /* isto ler inteiro (15) */ printf("Insira valores do vetor (15)\n"); for(i= 0 ; i<15 ; i++) { int r= scanf ("%i", &vet[i]); if (EOF==r) return 1; if (1==r) continue; getchar (); --i; } /* isto ranquea o maior */ for (i= 0 ; i<15 ; i++) if (vet[maior]<vet[i]) maior= i; /* isto faz o produto */ for (i= 0 ; i<15 ; i++) vet[i]*= vet[maior]; /* isto escreve int... */ for (i= 0 ; i<15 ; i++) printf ("%i ",vet[i]); putchar ('\n'); }
  7. Boa Noite Já é um Padrão do Fórum Com certeza, exercícios de nível iniciante sobre vetores (de n-milhares) que insinua na resposta a inutilidade dos vetores num exercício dos vetores. c'11 - gcc'11.4 a.c: Na função ‘main’: a.c:9:10: erro: comparação entre ponteiro e inteiro 9 | soma == soma + n; | ^~ a.c:9:10: erro: instrução sem efeito [-Werror=unused-value] 9 | soma == soma + n; | ~~~~~^~~~~~~~~~~ a.c:13:17: erro: operandos inválidos para binário / (possuem ‘int’ e ‘int *’) 13 | media = (soma / n); | ^ | | | int * a.c:14:22: erro: formato ‘%f’ espera argumento do tipo ‘double’, mas argumento 2 tem tipo ‘int’ [-Werror=format=] 14 | printf("A media é %f.", media); | ~^ ~~~~~ | | | | | int | double | %d cc1: todos os avisos sendo tratados como erros Então moço!? A última falha é atentar contra a vida do vetor no exame de vetor! Em fim, com algumas correções, seu programinha até compila, assim: #include <stdio.h> int main () { int n= 20; int termo[n]; int i= 0; /* isto solicita os termos */ do { printf ("Insira um termo: "); scanf ("%d",&termo[i]); i= i + 1; } while (i < n); /* isto faz um somatório */ int soma= 0; i= 0; do { soma = soma + termo[i]; i= i + 1; } while (i < n); /* isto faz uma média */ float media= (float)soma / n; printf("A media é %f\n",media); return 0; } /* isto retorna ao sistema operacional rsrsrs :D */
  8. @Samuel Fortes Brasil Boa Terde! Ocorre por razão da instrução, seu comportamento e a ordem dos comandos no seu bloco de comando. Esses comandos e sua ordem exata estão escritos logo abaixo: ordem. comandos 0. repita 1. Escreval 2. contador <- contador + 1 3. Ate (contador = 10) Acompanhe o ritual comigo… O que acontece depois do incremento (2), vem a expressão lógica (3), a sua condição é? Até 10, ou seja… 1. escreve 9 2. adiciona 1 3.10 é igual a 10 pare A propósito, se queres a simulação até 10, incluso; expresse desta maneira: Algoritmo "Conte Ate 10 (inclusive)" var contador: Inteiro Inicio contador <- 0 repita contador <- contador + 1 Escreval(contador) Ate (contador = 10) Fimalgoritmo
  9. Hoje tenho uma filosofia diferente. Na C, string é um valor como texto, e não um tipo como int. Ou seja, a string “Hello W...” está para char [] da mesma maneira que 2022 está para int. Sei que parece tolice, mas, “de” e “para”, essas palavras que mudam o significado têm capacidade para cortar o raciocínio. E a pergunta foi: como 'criar' um vetor para receber varias strings? Suponho que para você existiu a opção estática, nela, declare-se o seu comprimento, depois declarem-se variáveis da definição. Deste modo, o processo ficaria um pouquinho mais documental. Assim: #include <stdio.h> typedef char Tinta [128]; int main () { Tinta paleta [132];/* Cores ... */ /* ... */ }
  10. Ansi C

    C Tirar scanf do loop

    @kgin Boa Tarde Tua expressão joga da velha não abriu. E esse exercício do jogo é de nível intermediário nas MATRIZES, sendo que essas são as únicas abstrações necessárias à solução. E MATRIZES!!!
  11. @FLASHLEGENDS Boa Dia! Disso Tem-se, simplesmente isso: int divisivel3 (int i,int j,int matriz[5][5]) { return matriz[i][j] % 3; } Ou ainda... inline int divisivel3 (int i,int j,int matriz[5][5]) { return matriz[i][j] % 3; } ... Ao avaliar a pergunta da função, ela é bem sucedida com retorno de valor 0, sendo, a propósito, apenas por curiosidade o valor na constante EXIT_SUCCESS. Por último, não notou que há uma na declaração e outra na definição a.c: Na função ‘main’: a.c:18:9: erro: declaração implícita da função ‘divisivel’; você quis dizer ‘divisivel3’? [-Wimplicit-function-declaration] 18 | if( divisivel ( i , j , matriz ) == 1 ) | ^~~~~~~~~ | divisivel3 ac:7:14: aviso: parâmetro não utilizado ‘argc’ [-Wunused-parameter] 7 | int main(int argc, char const *argv[]) | ~~~~^~~~ ac:7:32: aviso: parâmetro não utilizado ‘argv’ [-Wunused-parameter] 7 | int main(int argc, char const *argv[]) | ~~~~~~~~~~~~^~~~~~ c'11 - gcc'11.4 Compilável #include <stdio.h> int divisivel3 ( int i, int j , int matriz[5][5] ); int main () { int j , i; //Matriz com valores fixo para não fazer a leitura int matriz[5][5] = {{15,9,23,43,49}, {3,36,55,53,18}, {12,42,51,57,34}, {6,32,28,25,62}, {72,91,81,16,41} }; for(i=0; i<5; i++) for(j=0; j<5; j++) if( divisivel3 (i, j, matriz) ) // Atenção: re avaliar a pergunta printf("O Numero %3d e divisivel por 3\n",matriz [i][j]); return 0; } inline int divisivel3 ( int i, int j , int matriz[5][5] ) { return matriz[i][j] % 3; }
  12. @devair1010 Boa Noite! De fato, não precisa de um vetor para resolver esse problema. Foi um desejo que tive de momento. Minha solução é a tua solução: nela também o extremo inferior cresce a cada palpite ⇒escolha⇐ e o extremo superior diminui até que a diferença entre eles (isuperior - inferior) gera palpites próximos do número escolhido e por último ele. Obrigado!
  13. Boa Noite! ... MATRIZES É matriz na leitura, processo e saída. Sinto que existe um complô entre os editores de apontamento ou apostila das escolas e universidades furrecas, suspeito que combinaram de neutralizar ou inutilizar as matrizes nos exercícios que são das matrizes. Opinião Alguns alunos não querem usar e ousar nas matrizes a trava, suponho que não tenham consciência ou tenham medo de errar, acabam por pensar além da conta. O Problema Sem pensar muito, são 5 dados compostos de 3! É o que me diz, "3 notas de 5 alunos" ou cada aluno no programa é um dado composto de 3 notas, 3 notas é (abstração) um aluno ... Logo, Ai Está! minha opinião é outra! O contratado é: Informe as notas %i Aluno: * * * Por exemplo, nesse rascunho C'11- gcc'11.4 #include <stdio.h> #include <ctype.h> typedef float Aluno; int main () { /* solicitar a turma de 5 alunos */ Aluno turma[5] [3]= {0}; for (size_t a= 0 ; 5>a ; ++a) { int r; printf ("%s%zu%s%c","Informe as notas ",a+ 1,"º Aluno",'\n'); for (size_t n= 0 ; 3>n ; ++n) { r= getchar (); if (EOF==r) { perror ("Falha na solicitação"); a= 5; break; } if ('\n'==r) { ungetc (r,stdin); break; } if ('-'==r || ' '==r) { --n; continue; } ungetc (r,stdin); r= scanf (" %f",&turma[a][n]); if (1!=r) { getchar (); --n; } } while (EOF!=(r= getchar()) && '\n'!=r); putchar ('\n'); } printf ("%c%s%c",'\n',"Turma Notas",'\n'); for (size_t a= 0 ; 5>a ; ++a) { printf ("%zu%s",a+ 1,"º Aluno: "); for (size_t n= 0 ; 3>n ; ++n) { printf ("%.1f ",turma[a][n]); } putchar ('\n'); } /* ... */ } Sendo uma solicitação e não uma leitura, os escaneamentos terminam sempre na nova linha, de modo que cada linha é um aluno (para mim). A proposito, se fosse uma leitura, o programa ficaria preso até pegar turma. RASCUNHE UMA SOLUÇÃO SEM PENSAR MUITO! Porque pensam d+
  14. Boa Noite! Scanf meus jovens O nome completo é um composto separado por espaço em branco, certo? A função scanf argumenta com especificador '%s' e juntos correspondem a qualquer caractere que não seja espaço, OK! Use scanf!
  15. @Emerson2156547384729849 Boa Noite Sem pensar muito, basta unir os dois tipos dos diferentes tipos dos vetores e definir a matriz da união, claro que sim... declarar uma união exclusivamente para ter essa matriz, já que esse é o problema! Ou definir a matriz para o tipo que não há perda nas configurações: cuja única consequência no final é num especificador. obrigado por lê isso

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!