Ir ao conteúdo
  • Cadastre-se

Ansi C

Membro Pleno
  • Posts

    3.288
  • Cadastrado em

  • Última visita

Tudo que Ansi C postou

  1. Não, não, está comentando de outra situação, que não é que se encontra no enunciado do exercício. E sim, penso que a maioria entendeu o que tentou explicar e as diferenças dos diferentes retornos da função. Sim, sim, sabemos o que tem no enunciado para a partir disso racionalizar um programa, ao menos uma solução que funcione num caso específico sem se preocupar se o tal "usuário" vai teclar com bund4 ou bater com teclado na cabeça, ou digitará além do permitido, ou quais enganos de poderiam afetar a resposta, ou quais situações fora do escopo normal de leitura da função fgets. Não, não... eu não preciso que diga nada sobre abrir fluxos ou traga outras complicações para o que já está por demais discutido. Vamos usar redirecionamento na linha de comando, na forma correta, e avaliar o newLine (no padrão Windows). Vejam abaixo, usei um programa dessa discussão e um arquivo digitado com newLine. Resultado 2 letras ou 2 char. Por ora isso é tudo que precisamos para escrever uma solução. A situação [aquela definida pelo enunciado] Como pretende ler os dados? Redirecionando o fluxo de entrada no Windows Supondo que o arquivo tem 10 palavras e cada palavra de no máximo 30 caracteres [conforme enunciado], e estão separadas por ENTER Desse jeito: canelas-sassafrasinho-do-campo cabecas-duras-focinhos brocas-do-coleto-do-algodoeiro borboleta-amarela-da-mamoneira bicos-de-brasa-de-testa-branca bico-grosso-da-garganta-branca besouros-amarelos-do-eucalipta beija-flores-de-orelha-violeta beija-flor-de-gravata beija-flor-azul-de-rabo-branco O vetor vai precisar de no máximo capacidade suficiente para 30 caracteres ou letras + o separador de palavras. main.c #include <stdio.h> #include <string.h> int func( void ){ char palavra[33] = { 0 }; fgets( palavra , 33 , stdin ); if (palavra[0]) printf( "Leu %zd letras.\n" , strlen( palavra ) - 2 ); return 0; } int main( void ){ for (int i = 0 ; i < 10 ; ++i){ func( ); } return 0; } Ilustração Um padrão Windows que difere do padrão (Norma) do C não dificulta em nada a solução, em específico, para leitura com redirecionamento. Veja o texto da normal Numa situação normal a função não mais captura dados, após encontrar o caractere de nova linha ou atingir o limite especificado pela variável com valor do tamanho. Tradução Eletrônica: Descrição No portal: https://www.cplusplus.com/reference/cstdio/fgets/ Aqui a discrição é um pouco mais clara, principalmente, com o significa de retido: Um caractere de nova linha faz com que fgets pare, porém, é um caractere válido pela função e incluído na ‘string’ copiada para str. Ou seja, a função para de lê de duas maneiras: quando atinge o limite estipulado e quando o caractere de nova linha é lido, o que vier primeiro em caso de sucesso. Portanto, o caractere de nova linha é considerado um caractere válido pela função, havendo espaço ele será copiado para o vetor com os outros isso pode estar afetando seus "contadores", caro usuário.
  2. Fiz o teste para um só palavra sem dar NL no arquivo. Ele não aparece, porque não tem. Legal Dar um Enter lá, e pronto ele aparece junto a última letra. acetilparaetoxilfeniluretanico[CRFL] Ainda não entendi porque 32 ou 33 caracteres não resolve esse problema. Se tem que resolver com fgets então: Captura-se a linha com 32 ou 33 caracteres, pois sabemos que se não for assim vai ter que liberar esses não uteis para o resultado de outra maneira. Já sabe que 2 deles é newLine então subtraia do resultado do retorno da strlen.
  3. ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 30 letras. A frase: 97 99 101 116 105 108 112 97 114 97 101 116 111 120 105 108 102 101 110 105 108 117 114 101 116 -61 -94 110 105 99 A frase: acetilparaetoxilfeniluretânic ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 3 letras. A frase: 111 13 10 A frase: o ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 30 letras. A frase: 97 108 102 97 102 97 115 45 100 101 45 115 101 109 101 110 116 101 115 45 101 115 112 105 110 104 111 115 97 115 A frase: alfafas-de-sementes-espinhosas ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 2 letras. A frase: 13 10 A frase: ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 30 letras. A frase: 97 110 100 111 114 105 110 104 97 115 45 100 101 45 112 101 115 99 111 -61 -89 111 45 118 101 114 109 101 108 104 A frase: andorinhas-de-pescoço-vermelh ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 3 letras. A frase: 111 13 10 A frase: o ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 30 letras. A frase: 98 97 108 97 110 -61 -89 97 45 114 97 98 111 45 100 101 45 103 97 114 103 97 110 116 97 45 112 114 101 116 A frase: balança-rabo-de-garganta-pret ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 3 letras. A frase: 97 13 10 A frase: a ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 30 letras. A frase: 98 101 105 106 97 45 102 108 111 114 45 97 122 117 108 45 100 101 45 114 97 98 111 45 98 114 97 110 99 111 A frase: beija-flor-azul-de-rabo-branco ....*....1....*....2....*....3 1...*....0....*....0....*....0 Digite uma frase com ate 30 letras: Leu 2 letras. A frase: 13 10 A frase: output.txt main.c #include "stdio.h" #include "string.h" int func( void ){ char pal[31] = { 0 }; printf("\ ....*....1....*....2....*....3\n\ 1...*....0....*....0....*....0\n\ Digite uma frase com ate 30 letras: "); char* p = fgets(pal, 31, stdin); printf("\tLeu %zd letras. A frase:\n", strlen(pal)); for (int i = 0; i < strlen(pal); i += 1) printf("%d ", pal[i]); printf("\nA frase: "); puts(p); return 0; } int main( void ){ for(int i = 0 ; i < 10 ; ++i){ func( ); } return 0; } O caractere newLine (que nos arquivos do Windows é; CRLF) sendo capturado. Porque arquivos gerados no Windows tem um padrão. [] Função fgets para no LF, conforme a normal (padrão)
  4. Existe um controle de produtos vendidos? Pode ser um vetor, cujo valores são códigos de produtos vendidos, e daí eles se repetem dentro, basta ordenar para saber a quantidade de cada. Ou um vetor de vendidos, cujo os índices são relacionados ao códigos dos produtos, e cada em cada índice é a quantidade de vendas respectivamente. p. Ex. Código 100 por exemplo, é associado ao índice 0 desse vetor, então o valor no índice 0 é a quantidade de vendas do produto de código 100. Isso faz sentido? De qualquer maneira, acho que é assim que se resolve essa questão.
  5. Não sei qual dos programas desses (na discussão) me permitiria testar um arquivo naquele formato padrão da função fgets. Por quê? Eu não preciso provar nada a ninguém @arfneto , muito menos para um estranho que frequenta o mesmo fórum de discussão. Não é você que decide o que é objetivo ou não. Mas está livre para deixar sua OPINIÃO, como sempre fez. Além disso, não seguirei sua recomendação porque poderia está resolvendo o exercício por ele (o autor do tópico) sem haver necessidade para tanto, mas não me importo que outros o faça, cada qual usa o fórum do seu modo, e isso é super normal. []
  6. esse não é o texto na norma (padrão). Só especulação, o enunciando garante que a palavra tem no máximo 30 caracteres, mas não diz nada sobre exceções do tipo que leva o usuário a cometer erros, nem se que sabe ao certo se O usuário é humano, a entrada pode bem vir formada de outra sistema. Decerto a palavra tem no máximo 30... isso é garantido por razão do enunciado Exemplo: castanhas-subterrâneas-maiores acetilparaetoxilfeniluretânico capins-finos-de-folha-comprida canelas-sassafrasinho-do-campo cabeças-duras-focinhos-de-rato brocas-do-coleto-do-algodoeiro borboleta-amarela-da-mamoneira bicos-de-brasa-de-testa-branca bico-grosso-da-garganta-branca besouros-amarelos-do-eucalipta beija-flores-de-orelha-violeta beija-flor-de-gravata-vermelha beija-flor-azul-de-rabo-branco @arfneto Quais dos programas testamos um arquivo assim?
  7. O exercício está situado em três etapas a primeira é Ler os 5 nomes de máximo 70 caracteres (está garantido de que não haverá entradas de nomes acima de 70 caracteres). Você pode escrever essa entrada "analiticamente", passo a passo um comando para cada nome, ou fazer com está fazendo, porém, a estrutura deve cuidar apenas da Leitura, Ler ou (Entrada) p. Ex: char nomes[5][71]; /**! * Entrada dos Nomes * * Querendo descreva o que acontece abaixo, ou não. */ for( int i = 0 ; i < 5 ; i = 1 + i ){ printf( "Digite seus dois primeiros nomes (no máximo 70 caracteres): " ); scanf( " %70[^\n]" , &nomes[i][0] ); } Converter (processo) e Imprimir (saída) podem ou não estarem no mesmo ‘loop’, penso que se entende mais quando estão cada qual no seu. Já a entrada, essa realmente me parece ser solitária. []
  8. Essa é a sua opinião. Não entendi... [] Esta é a documentação dela, onde errei
  9. Lendo ou relendo só esse trecho, porque é tudo que existe do enunciado, alguém pode se pergunta qual é o separado das palavras? Toda resposta é o máximo 30 caracteres ou a linha, o que vier primeiro. Ou seja, usualmente para toda situação em que a palavra tem menos de 30 caracteres está capturando a nova linha, exceto quando a palavra tem os exatos 30 caracteres. Na expressão que realiza a contagem, pode ou não contar o newline com um digitável, depende do que está escrito no enunciado, mas o caractere precisa ser capturado. Por esse motivo Nada no enunciado leva a acreditar que essa não é uma situação normal e que os dados fornecidos, sendo as palavras no limite do máximo, estarão fora do limite do que estipula o exercício. São hipóteses que o usuário criou para justificar sua opinião. Se tratando de exercício, a menos que se prenuncie contrário; os dados fornecidos são ideais (sem falhas).
  10. É porque identificação deve ser única, você poderia identificar cada input radio sequencialmente de 'r1' até 'r5' também, depois usar um loop para resgatar o valor em cada um deles, ou escrever a verificação um a um que também é bom.
  11. A capacidade do vetor ainda não é o bastante para comprimento da ‘string’ Capacidade = comprimento (70) + 1; do contrário, para todos os casos que há espaço na posição máxima (70) o algoritmo falha Se usar o seguinte comando que captura a linha ou 69 caracteres, o que ocorrer primeiro. Independe..., siga o enunciado capturando o máximo 70 caracteres ou a linha. fgets( pal , 71 , stdin ); []
  12. OK Como disse antes, é melhor com enunciado completo. Sim, mais como falei, e vou falar outras vezes caso não tenha entendido da primeira. Eu até gosto de argumentos, porém nesse caso penso ser melhor o enunciado completo do autor da dúvida. Só para confirmar se um caractere a mais ou a menos faz diferença. No aguardo []
  13. Uns IDE tem esse recurso, incluindo uns ‘na ‘internet’’ exemplo: https://www.onlinegdb.com/, cujo nome já diz tudo. É legal. []
  14. Melhor com enunciado completo. Essa é só a sua opinião []
  15. Sugiro que escreva o enunciado completo da questão. Note que: Uma palavra tem no máximo 30 caracteres (imprimíveis e não) ou termina antes de 30 com nova linha (do inglês: new line). Não é capacidade desse vetor é 32. char palavra[ 32 ]; Suponha que o usuário digite o máximo andorinhas-de-pescoço-vermelho\n ~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~ | | + -- -- -- --> A Palavra tem no máximo 30 caracteres (Sem espaço) andorinhas de pescoço vermelho\n ~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~ | | + -- -- -- --> A Palavra tem no máximo 30 caracteres (Com espaço) Com e sem espaços foram digitados 31 caracteres. Por isso é melhor que post o enunciado completo, seguido de nova tentativa de resposta. []
  16. Faz como o usuário assim explica, e faz também combinando o múltiplo de 3 vizinho do limite inferior. O resto do algoritmo se resume a adições sucessivas 3 até o extremo superior. Ilustração Números múltiplos de 3 entre -4 e 32 : -3, 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30 Durante a Entrada X <-- (-4) Y <-- (32) No Processo RESULTADOS POSSIVEIS <----- resto <-- (X%3) ^ ^ | | ENQUANTO (X%3) FACA X += 1; /**< complementar */ -2 --> complementar +2 para 3 ------ PARA X < Y FACA X = 3 + X: ESCREVER( X ) -1 --> complementar +1 para 3 ------ 0 --> Divisivel inteiro ----------- 1 --> complementar +2 para 3 ------ 2 --> complementar +1 para 3 ------ | ---> aproximação + porque a série é crescente. Saída Os tais limites são X e Y conforme o enunciado Quando dizem ENTRE dois extremos, querem dizer intervalos abertos ]X, Y[, não incluir nem X, nem Y. Exceto se for enunciado da seguinte maneira: "Intervalo entre x e y.., inclusive". A diferença está na saída (resposta), já o algoritmo muda bem pouquinho, decerto não fará diferença para a opinião de seu professor. Apenas responda. []
  17. @skyneGKL As informações na matriz(6, 6) me parecem irracionais, eu não consegui encontrar significado. E mais, as postagens posteriores não foram o suficiente para ajudar na minha interpretação, também. Resta seu algoritmo. O nome adequado do vetor é cidades .cada valor no elemento/subscrito dele é uma cidade, cada par de valor é o índice no subscrito da matriz que representa a distância entre elas. Dessa maneira. Cada valor em 'distancias' é uma distância acessível por um par de cidades. A trajetória percorrida é a soma das distâncias entre cada cidade do vetor cidades. O laço se repete 5 vezes acumulando 5 valores de distância. Filézinho! Pode acontecer uma variação de resposta em que a matriz real e lógica diferem em composição para coincidir os índices sem operações extras, ou seja, o índice 1 da matriz real é também o índice 1 da lógica, apenas para evitar operações aritméticas de adaptação. int distancias[][7] = { {0, 0, 0, 0, 0, 0, 0}, {0, 1, 2, 3, 4, 5, 6}, {0, 1, 2, 3, 4, 5, 6}, {0, 1, 2, 3, 4, 5, 6}, {0, 1, 2, 3, 4, 5, 6}, {0, 1, 2, 3, 4, 5, 6}, {0, 1, 2, 3, 4, 5, 6}, }; Uma linha e uma coluna extra ignorada para satisfazer a condição de não adaptar os índices do vetor cidades. Do contrário, terão que ser adaptados os índices do vetor durante entrada, na composição de vetores em C. Índice: 0 1 2 3 4 5 Cidade: 2 3 1 4 5 0 []
  18. Se o enunciado pede que comunique com o usuário com mensagem do tipo Digitar/Entrar com x números, nós escrevemos. Quando enuncia Leia ou Ler, escreve-se mensagem apenas de resposta ou resultado ou retorno, ou saída e de entrada é facultativo. E esse é o caso: é só ler, não é Digitar ou Entrar, então sem mensagem na categoria de Apenas deixe o programa esperando os dados, sem avisar, e depois copie os 20 números e em seguida cole no prompt. A alternativa é redirecionar o fluxo de entrada por linha de comando usando a combinação: nome_do_programa < numeros_do_teste.dat Ilustração É um programa que lê e imprime os números até o fim da lista depois encerra. Encerra porque quando a função encontra o fim do fluxo (fim do arquivo) o valor em número é 0 terminado o laço. #include <stdio.h> int main( ){ int numero = 0; while (scanf( "%d", &numero ), numero != 0 ) { printf( "%d ", numero ); numero = 0; } return 0; } Essa lista: 65 96 15 10 26 15 69 25 59 62 04 21 74 21 71 68 53 50 67 31 94 51 30 63 79 53 76 13 72 34 85 68 34 72 47 24 31 25 55 Indiretamente isso ajuda a entender melhor sua entrada de dados. Vejamos: Precisa de um contador para saber quantos números já pegou e não está além da capacidade do vetor e verificar também se valor em número é menor que 1 (negativo ou zero) então se pelo menos um desses casos se confirmar o ‘loop’ WHILE é interrompido. []
  19. Entrada Saída Rapidamente eu diria que a maioria dos usuários usou tabela hash para resolver. São duas informações, a primeira entrada é capacidade (N + 1) do vetor (tabela hash) e a segunda quantidade de chaves (índices para o vetor). Analisando essas informações, diria que o vetor (tabela hash) tema capacidade igual a 7 A quantidade de chaves é 10, ou seja, serão 10 entradas antes de fim. Sempre que houver colisões, ou seja, o subscrito da tabela retorna um valor diferente de 0 incremente o contador, que no contexto do problema representa o acumulo de bilhetes falsos, ou não original. Caso não haja colisão, ou seja o subscrito retorne 0, então esse é um bilhete original e precisa ser atribuído valor 1 no subscrito. Segue a ilustração 6 10 | 6 1 3 6 6 4 2 3 1 2 | | | | | | | | | | hash[7] = {0}; | | | | // todos os subscritos são 0. | | | | hash[6] tem valor? 0 então atribuir 1 hash[1] tem valor? 0 então atribuir 1 hash[3] tem valor? 0 então atribuir 1 hash[6] tem valor? 1 então colisão incrementar contador ... A resposta final é 4 colisões: (6)x2, (3)x1, (2)x1 [ ]
  20. Com relação à saída, cada o programa deve imprimir UMA linha. Esse comando aqui, imprime duas linhas, a segunda tem o ENTER ('\n')
  21. Penso que se contar quantos campos estão preenchidos poderia usar a métrica no SWITCH e resolve seu problema. function progressBarInq( ){ let progressBar0 = document.getElementById( "InqProgress0" ); let progressBar25 = document.getElementById( "InqProgress25" ); let progressBar50 = document.getElementById( "InqProgress50" ); let progressBar75 = document.getElementById( "InqProgress75" ); let progressBar100 = document.getElementById( "InqProgress100" ); let verInq01 = document.getElementById( "InqueritoCircunscricaoPolicial" ); let verInq02 = document.getElementById( "NumeroDoIP" ); let verInq03 = document.getElementById( "DataDoRelatorio" ); let verInq04 = document.getElementById( "NumeroDoProcesso" ); progressBar0.style.display = "none"; progressBar25.style.display = "none"; progressBar50.style.display = "none"; progressBar75.style.display = "none"; progressBar100.style.display = "none"; var status = 0; if (verInq01.value) status = status + 1; if (verInq02.value) status = status + 1; if (verInq03.value) status = status + 1; if (verInq04.value) status = status + 1; switch (status) { case 4: progressBar100.style.display = "block"; break; case 3: progressBar75.style.display = "block"; break; case 2: progressBar50.style.display = "block"; break; case 1: progressBar25.style.display = "block"; break; default: progressBar0.style.display = "block"; break; } } progressBarInq( );
  22. Concordo e não deixaria de concordar porque sei que o problema do sinal e todo mais é confuso para maioria que está só começando. E sei também que isso não dura, depois de algumas horas, semanas ou meses em contado com a linguagem eles compreendem. [] Pois é: não tem.... Compare essa série do enunciado com isso que eu mostrei Na primeira imagem temos a lista (5) dos termos do polinômio de Mclaurin Na segunda imagem vem polinômio semelhante, qual a diferença? O termo n = 0, está resolvido e o limite finito. Simplificando para perceber que da série os 4 primeiros termos agora terá o seguinte aspecto ; nota-se que o sinal varia junta a constante x^2 O primeiro é -x^2 O segundo é O primeiro (vezes) -x^2 ... A pergunta do sinal tem uma resposta salvando a potência anterior. 4: +(x^8) <-- -(x^6) * -(x^2) ^ -----------| | 3: -(x^6) <-- +(x^4) * -(x^2) ^ -----------| | 2: +(x^4) <-- -(x^2) * -(x^2) ^ -----------| | 1: -(x^2) <-- (1) * -(x^2) @arfneto Post #10 compartilha uma codificação de exemplo, nela a alternância do sinal é feita por outra expressão, precisamente por uma variável equivalente à expressão (-1)^n do polinômio
  23. Pode dividir? A idade dividida por 16 será igual 1 ou maior se tem valor igual ou maior que 16. A idade dividida por 18 será igual 1 ou maior se tem valor igual ou maior que 18. Estamos interessando nos casos em que o quociente é 1 == para 16 Estamos interessando nos casos em que o quociente é 1 <= para 18 var idade_do_cidadao = 17; if (1 == ((idade_do_cidadao/16)|0)) { console.log("Seu voto é opcional"); } if (1 <= ((idade_do_cidadao/18)|0)) { console.log("Você é obrigado a votar"); } Como ainda estou aprendo, pode ser que tenha codificado algo errado. [ ] sorry.
  24. Sim, esse é o modo bom de avisar. Saberia no ato que (valor) subscrito não é array, consequentemente o segundo subscritor é o errado. []
  25. Não é o mesmo que tem aqui na imagem? Tem.. 1. Aqui 2. Aqui 3. Aqui @Victor Hugo Barbosa Silva Tudo do mesmo usuário! Quatro (4x) vezes para nunca esquecer, ou dizer que ninguém avisou. []

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!