Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. Isso foi você que escreveu, no post #3 E isso no #8 depois de outras coisas. Você sugeriu que ele usasse o modem nesse modo se acaso não estivesse. Você disse que a "a banda dividirá com a outra porta" e que o wifi seria prejudicado. Nada disse sobre a operadora. Se o primeiro ZTE estivesse em bridge ele não pensaria em expandir o sinal, porque só teria um AP na rede.
  2. Atente para o que expliquei. Só o modem receptor pode ser bridge (ponte) e é bobagem se não tiver outro para por no lugar. E eu expliquei porque. Se deixar isso em bridge vai perder a cobertura das antenas desse lado, e 50% do wifi. E vai perder duas portas ethernet. De um total de 5 que pode usar.... 40%... aritimética e as leis da física.
  3. Mesmo 4 anos acho que ainda se pode tentar aprender algo de uma questão assim. O lado da geometria Isso pede um programa em C mas supõe noções de geometria e trigonometria que o estudante pode não ter, apesar de ser algo do ensino fundamental. Considere o triangulo retângulo clássico com lados 3 4 e 5 como na figura. A noção de altura h vai depender de qual lado é a base, mas fica claro que a maior altura é o comprimento do maior cateto. Porque? São 3 alturas. Considere o clássico teorema de Pitágoras do ensino fundamental: para essa dimensão a hipotenusa vale 5. E o teorema diz que a soma dos quadrados dos catetos é igual ao quadrado da hipotenusa. Como algum tamanho (positivo) os catetos tem, se a2 + b2 = c2 então c não pode ser maior a e não pode ser maior que b. E assim h3 no desenho não pode ser maior 3 ou 4 já que os dois triângulos internos também são triângulos retângulo... Usando mais do ensino fundamental --- sistemas lineares --- é trivial ser que por exemplo nesse caso h vale 12/5 e as duas partes da base no último triângulo medem 16/5 e 9/5 A área do triângulo é a metade do produto da base pela altura. Mas num triângulo retângulo se pode pensar diferente: Como um dos ângulos é reto então o triângulo retângulo é obviamente metade de um retângulo com os lados iguais aos catetos. Basta ver na figura acima e pensar um pouco. E a área do retângulo é o produto da base pela altura, então bata achar os lados menores do tal triângulo O lado da linguagem C Então basta ler os 3 valores e separar o maior, e então calcular a tal área. Do programa original Essa é uma condição interessante e impossível: if (A == B & B == C) { area = (B * C) / 2; printf( "\n\nO valor da area do triangulo é igual " "a %i\n\n ", area); } Mais do ensino fundamental: a igualdade é transitiva. então duas coisas iguais a uma terceira são iguais entre si. Esse if identificaria um triângulo equilátero. Só que um triangulo retângulo não pode ser equilátero, como está claro pelo teorema de Pitágoras citado acima. E area não foi declarado. printf( "Digite o tamanho do lado A do triangulo " "retangulo: "); scanf("%f", &A); printf( "Digite o tamanho do lado B do triangulo " "retangulo: "); scanf("%f", &B); printf( "Digite o tamanho do lado C do triangulo " "retangulo: "); scanf("%f", &C); Isso é muito muito chato de usar. Ao chamar o programa o cara já tem um triângulo em mente. É um porre ter que ficar esperando 3 mensagens óbvias e digitar 3 valores para depois ter as respostas. Permita que o cara passe os valores na linha de comando, e se não passar que digite os 3 valores na mesma linha. E entenda que tem uma razão para scanf() retornar um int. USE. É bobagem seguir sem testar. Não, não são iguais. Onde se aprende isso? Imagine um quadrado com medida 5. trace a diagonal e vai ver dois triângulos retângulo, com catetos de medida 5 e hipotenusa de medida ao quadrado igual a 50... Tem razão, mas não pode usar '!=' para comparar float ou double porque muitas vezes vai dar erro. Não é como int. Pode dar diferença tipo na sexta casa decimal e aí seu cálculo já era. Deve comparar SEMPRE com uma tolerância. Veja no exemplo ao final... Um exemplo O programa a seguir lê as 3 medidas e se o triângulo for considerado retângulo calcula a área e a maior altura #include <stdio.h> int main(int argc, char* argv[]) { double l[3] = {0}; double a, b, c; printf( "\n\ Entre com as medidas dos 3 lados do triangulo,\n\ separadas por ao menos um espaco\n\ \n\ Medidas: "); int res = scanf("%lf %lf %lf", &a, &b, &c); if (res != 3) { fprintf( stderr, "Erro ao tentar ler os 3 valores\n"); return -1; } // lado 1 l[0] = a; // lado 2 if (b > l[0]) { l[1] = l[0]; l[0] = b; } else l[1] = b; // lado 3 if (c > l[0]) { if (c > l[1]) { l[2] = l[1]; l[1] = l[0]; l[0] = c; } else { l[2] = l[1]; l[1] = c; } } else { if (c > l[1]) { l[2] = l[1]; l[1] = c; } else l[2] = c; } // sera um triangulo retangulo? // t. de Pitagoras double delta = .001; double diff = (l[0] * l[0]) - (l[1] * l[1]) - (l[2] * l[2]); if (diff < 0) diff = -diff; if (diff > delta) { printf( "\n\ Medidas lidas: %.2f %.2f %.2f\n\ Medidas em ordem decrescente: %.2f (hipotenusa) %.2f (maior cateto) %.2f (menor cateto)\n\ \n\ Esse não e um triangulo retangulo\n", a, b, c, l[0], l[1], l[2]); return -2; } double area = l[1] * l[2] * 0.5; printf( "\n\ Medidas lidas: %.2f %.2f %.2f\n\ Medidas em ordem decrescente: %.2f (hipotenusa) %.2f (maior cateto) %.2f (menor cateto)\n\ area = %.2f\n\ maior altura = %.2f", a, b, c, l[0], l[1], l[2], area, l[1]); return 0; } Saída do exemplo Entre com as medidas dos 3 lados do triangulo, separadas por ao menos um espaco Medidas: 3. 4. 5. Medidas lidas: 3.00 4.00 5.00 Medidas em ordem decrescente: 5.00 (hipotenusa) 4.00 (maior cateto) 3.00 (menor cateto) area = 6.00 maior altura = 4.00 Entre com as medidas dos 3 lados do triangulo, separadas por ao menos um espaco Medidas: 6 7 9.2195 Medidas lidas: 6.00 7.00 9.22 Medidas em ordem decrescente: 9.22 (hipotenusa) 7.00 (maior cateto) 6.00 (menor cateto) area = 21.00 maior altura = 7.00 Entre com as medidas dos 3 lados do triangulo, separadas por ao menos um espaco Medidas: 6 7 9.2194 Medidas lidas: 6.00 7.00 9.22 Medidas em ordem decrescente: 9.22 (hipotenusa) 7.00 (maior cateto) 6.00 (menor cateto) Esse não e um triangulo retangulo Entre com as medidas dos 3 lados do triangulo, separadas por ao menos um espaco Medidas: 6 7 9.2197 Medidas lidas: 6.00 7.00 9.22 Medidas em ordem decrescente: 9.22 (hipotenusa) 7.00 (maior cateto) 6.00 (menor cateto) Esse não e um triangulo retangulo Ativar todos os alertas ou mesmo tratar qualquer alerta como erro é interessante numa primeira compilação ou se sua empresa ou escola assim exige, mas não é essencial. Um erro é um erro e não gera código algum. Variável não declarada é um erro. E compilar certinho não quer dizer muito. Veja o que expliquei aqui por exemplo.
  4. Em geral não tem. O uso da banda em redes domésticas é focado no download. Por exemplo você seleciona um vídeo a 4K de uma plataforma com uma mensagem curtinha, de centenas de bytes. E aí pode receber 3h de conteúdo a 4K gastando até 30mbits de download. É o mesmo cenário com audio e navegação. Em jogos o que importa em geral é a latência e o tráfego é minimizado ao extremo. Games chegam a ter vários gigabytes de dados locais justamente para isso. Veja se seu provedor atual não pode te fornecer estatísticas de quanto tem usado de download e upload. Eles tem esse número e pode ser útil.
  5. @LucasG97 Em geral deve ligar no roteador principal. A diferença é mínima para o computador, em termos de latência por exemplo, mas todo o tráfego para tudo que estiver ligado no segundo roteador passa por um cabo. Assim, somar a esse também o tráfego para esse computador que está numa posição intermediária não é adequado: vai penalizar todo mundo que está na segunda rede, sem razão. Seu roteador principal só em uma porta gigabit, então provavelmente é melhor deixar a porta gigabit para ligar no outro roteador, se tiver dispositivos rápidos no wifi. Não. Não vai. Como em qualquer switch o roteador tem total condição de prover 1000 full-duplex para todas as portas, independendo do tráfego wifi ou da internet. Isso se chama capacidade de comutação. Um switch gigabit de 8 portas, por exemplo, sempre tem 16mbits de capacidade de comutação. Veja na documentação. Não é assim. O roteador não tem "especialização". É uma caixinha com umas 7 funções. Colocar o roteador em modo bridge não tem sentido a menos que compre outro roteador para ficar no lugar dele, porque ele vai passar a ser um mero conversor de mídia. Entenda: Pois é: esse é um roteador da classe AC1200, wifi5 com 4 portas ethernet, 1 GB 3 FE E esse também. AC1200 4 portas gigabit E eles tem cada um as suas antenas. Se colocar o primeiro em bridge vai perder a cobertura do wifi, os 1200 megabits, uma perda de 50%... Nada esperto a menos que tenha outro. Considere que 5ghz raramente passa duas paredes com qualidade então se perder isso no primeiro não estará fazendo nada de útil. E claro que vai perder as 2 portas ethernet. Uma já podia ligar na TV que provavelmente já está ao lado dele... TV são grandes consumidoras de banda hoje em dia e é meio ingênuo ligar uma TV que não se move via wifi... E FE --- 100 mbits --- é mais que suficiente para 4K de vídeo por exemplo.
  6. Se leu #10 #11 e #12 acima sabe que eu acho que não serve. Esses cabos não são para uso externo e não vão durar nada. Tanto faz a categoria. Se for UTP não serve. Se for blindado STP CAT5e serve para essas velocidades e disância, mas precisa ver a especificação se a blindagem inclui UV por exemplo. Não vou recomendar algo ilegal, nem sugerir opções. Deve ter notado acima que não incentivo tal coisa. O que eu disse sobre adaptadores MOCA é usado em situações similares em termos de distância e exposição. Existem dutos para uso externo, como os da marca DutoPlast. São baratos e muito bons. Uma antena direcional é ok e é legal.
  7. Estamos de acordo. A diferença parece vir a partir dessa constatação. Não vou reproduzir a foto tem rua aqui também. Conheço ruas inteiras em que a energia por exemplo parece vir de um único poste. Há comunidades em que tem um pacote de serviços, com TV por assinatura sem assinatura, pay-per-view sem pay, internet disponível, preço do kit é fixo por mês. De novo, a diferença aparece com o que o sujeito faz a partir dessa constatação: vai ser mais um --- talvez o primeiro --- a fazer o certo ou mais um a puxar um fiozinho de nada? Vai ser mais um a incentivar isso num forum público ou vai dizer que é ilegal? Escolhas
  8. Esses cabos UTP, tanto faz a categoria, não são adequados para uso externo. Não vão durar nada. Use cabos blindados, STP, se for insistir nesse caminho. Sabe que esses cabos são mais baratos que os coaxiais? Então deve ter uma razão para a operadora usar cabos coaxiais... Será que é pela blindagem e proteção UV? É. É ilegal usar qualquer parte da infraestrutura pública, postes, calçadas, árvores, canteiros, jardins e tal. Mas cada um parece ter a sua noção de legal. Não dá pra entender o que quer dizer. A julgar pelas respostas se mudou para uma casa que fica em frente àquela onde morava, mas do outro lado da rua, e tem um poste convenientemente de cada lado da rua em frente às casas? E continua morando alguém na casa da frente, que é a do outro lado da rua e onde está o modem da operadora? Pode usar cabos coaxiais e um adaptador MOCA. Mais durável. Ou uma antena direcional ponto a ponto
  9. Entendo. Em relação às configurações de DHCP mesmo os equipamentos mais simples tem que oferecer o mínimo: faixa de endereços tempo de validade do endereço endereços opcionais de DNS O que nem todos tem e é decisivo para esse uso é o endereço do gateway padrão. Esse da operadora VIVO não tem: Esse velhinho da D-Link DIR-655 tem mais coisas Mesmo roteadores novinhos hoje em dia podem não ter isso, especialmente os mais baratos. O contéudo do forum é pesquisável, então um cara com uma questão sobre vários AP na LAN pode parar nesse tópico aqui. Por isso quando acho que posso contribuir prefiro uma resposta mais objetiva para o caso e não para o particular usuário. O forum fica mais útil assim, na minha opinião. Essas coisas não são especialmente complexas, mas já teve ter notado que há uma imensa coreografia de protocolos e coisas rodando em uma rede IP, mesmo uma simples. E simplificar pode levar a coisas como essa afirmação de que só pode ter um servidor DHCP na rede, ou coisas como aqueles tutoriais salvadores sugerindo usar roteadores em modo AP, a ideia de colocar o roteador da operadora em modo bridge, a ideia que o roteador da empresa Y é uma m. sem nenhum argumento. e coisas assim. Nem sei quanta vezes já me "explicaram" isso de DHCP, muitas vezes em lugares em que a rede 3x por dia, em bares e restaurantes. Muitas vezes porque o "técnico" especialista explicou para o cliente que o intervalo de DHCP tinha que ser muito grande (dias) para não gerar tráfego na rede. Outro mito.
  10. Essa é a tela que a TP-Link usa em alguns modelos ilustrando o modo AP. Cada fabricante pode interpretar isso a seu modo. Um AP --- Access Point --- é um troço que tem uma entrada via cabo e uma saída via rádio. Ao colocar um roteador como AP o aparelho pode por exemplo desabilitar ou não as portas ethernet, já que um AP não tem isso. Todo roteador com wi-fi inclui um ponto de acesso, um AP. Simples assim. Modo AP é outra coisa e não é uma coisa assim estabelecida. Não acredito que no caso desse tópico um AP (ou dois) sejam solução. Numa rede doméstica deve precisar das portas ethernet ao menos para as TV que gastam muita banda hoje em dia e não andam pela casa para precisar de wifi. Porque usar apenas 200 endereços e descartar o resto? Isso é um mito, com origem provável em desconhecimento ou preguiça. E um fala pro outro e escrevem em forums como esse e passam adiante. Só que não é verdade. Como eu expliquei acima, é pouco esperto usar um só. Na dúvida consulte a bíblia do DHCP o RFC 2131 onde tem apenas tudo sobre isso. Eu expliquei porque é até sugeri 3 faixas de IP e o tempo de lease. Pode só copiar. E expliquei as razões para isso: latência e redundância.
  11. Então quer saber se tem problema em configurar rotadores como AP, só que não está usando isso. Mas tentou isso porque estava tudo problemático e agora continua problemático? Até li umas recomendações em vídeos no YouTube, recomendando fazer isso. Assisti até alguns, mas não entendo de onde vem a ideia ou porque seria de alguma vantagem. Mas não é. Tenho um roteador aqui nesse modo até. E porque? Porque eu precisava de um AP e não tinha, então esse aparelho foi colocado como AP. Onde ele está? Está dentro do forro de gesso do Hall interno desde 2015 eu acho. Porque só serve como AP. Não se usa nada dele, filtros, roteamento, DDNS, DHCP, WAN, nada. Era pra ser um AP. Virou um. Não é seu caso. Use os roteadores no modo comum. Mas não precisa dos roteadores e apenas dos AP e dos switches que eles contém. Faça o simples. Não deve ligar assim. Está tudo errado e vai ter uma perda enorme de banda, como uns 40% já na segunda rede e mais ainda na terceira. E claro que o tráfego em cascata vai ter uma performance miserável na LAN. O segundo roteador vai ser o gateway do terceiro e o primeiro vai ser o gateway do segundo e tudo vira uma bagunça. Seria preciso ver como configurou os IP e as portas WAN para ter uma noção melhor do prejuízo e dos problemas, mas muita coisa sequer vai funcionar. Vai ficar com 3 segmentos de rede separados, múltiplo NAT, latências enormes, tráfego em cascata. Compartilhamento de impressoras e arquivos raramente vai funcionar, automação quase nada, espelhamento de tela idem. A conexão cabeada não tem relação com o modo AP. E nem está claro que esses roteadores sequer ofereçam esse modo. Nem se sabe o modelo deles. Não faça isso a menos que seja inevitável por não ter portas ou poder passar os cabos. Deve ligar tudo em paralelo nas portas LAN do roteador do provedor. Não precisa --- e em geral não deve --- desativar DHCP nos roteadores 2 e 3. Se fizer isso só vai eliminar a redundância e aumentar muito a latência ao conectar coisas na rede. Apenas faça um plano antes de sair ligando as coisas. Leva minutos e nunca vai dar problema. Exemplo simples considerando o roteador da operadora com 4 portas ethernet e wifi, e mais dois aparelhos iguais: Defina a LAN que vai usar, /24 está ok para uma rede doméstica para começar. Ponha esses aparelhos todos na (mesma) mesa ao lado de um computador para nem ter que levantar da cadeira Não ligue nada na internet. Não faz diferença. Nada disso tem a ver com a internet afinal defina a LAN que vai usar. Exemplo 192.168.0.0/24. Isso quer dizer que a máscara será 255.255.255.0, o tal /24 programe seu roteador da operadora para 192.168.0.1 e os outros dois em .2 e .3 sua rede /24 tem 254 hosts, certo? .0 não pode usar porque é o endereço de rede. .255 não pode usar porque é o endereço de broadcast. sem surpresas tem de 192.168.0.1 a 192.168.0.254 pra usar. separe uns 10 pra seu uso em roteadores, testes e configurações: resta de 192.168.11 a .254 então separe 3 faixas para o DHCP. Se os roteadores tem performance similar use igual mesmo, mas se os secundários são velhinhos pode deixar menos endereços para eles. Vamos ficar com algo simples 2x50 nos secundários. Então De .1 a .10 reservados. Já estará usando 1 2 e 3 para os roteadores faixa 1 de 11 a 154, com 144 hosts, certo? faixa 2 de 155 a 204, com 50 hosts, certo? faixa 3 de 205 a 254, com 50 hosts, certo? Use um intervalo pequeno de lease do DHCP, tipo 5 minutos (300s) porque assim muitos potenciais problemas se resolvem sozinhos em... 5 minutos o gateway padrão da rede será, claro, 192.168.0.1 ou não vai acessar a internet configure as faixas de DHCP usando esse tempo, gateway e as faixas que planejou ANTES. Se os roteadores 2 e 3 não tem essa opção no DHCP (endereço do gateway) simplesmente não use. É melhor pra você. Arrume outros. configure o wifi como tal. Use redes separadas e deixe a vida seguir. Isso é secundário. Se precisa mesmo poder ficar andando com um tablet pela rede sem cair a conexão use rede mesh, que foi criada para isso. E é caro pra caramba. Caso contrário o que acontece é que vai ter a melhor cobertura possível usando todas as antenas e eventualmente vai ter que se reconectar para uma rede mais próxima, mas já salva nos dispositivos. ligue os roteadores 2 e 3 em portas LAN do roteador da operadora. Tudo vai funcionar ok. Sem perdas e com latência pequena no DHCP. E com redundância: se a internet cair não vai ficar sem a LAN. Encaminhamento de portas e DDNS e tudo mais será configurado apenas no roteador 1. Vai poder acessar todos os roteadores a partir de qualquer ponto da rede e compartilhar arquivos e impressoras de qualquer ponto da rede.
  12. Bem, sim e não, @devair1010 Não existe relação entre uma coisa e outra. Não há nada de especial em ler um certo número de blocos por vez, ou gravar um certo número de blocos por vez. Desde que seja de propósito. É preciso ver os argumentos passados para cada função... Ao usar while (fread(&LerContatos, sizeof(Contato), 2, arquivoContatos)) fread vai ler 2 registros do tamanho sizeof(Contato), e transferir os dados para o endereço &LerContatos, que vai ser visto como unsigned char*. E o ponteiro do arquivo vai ser avançado pelo total de bytes lidos. Só que ContatoProfissional LerContatos; FILE *arquivoContatos = fopen("contatos.dat", "rb"); E typedef struct { int sequencial; char nome[50]; char email[30]; long int telefone; } ContatoProfissional; ContatoProfissional Contato; Então se vê que não foi uma escolha feliz de nomes, e o programa está uma bagunça. Mas pode ter dados suficientes no arquivo para ler dois registros certamente não tem onde gravar os dois se conseguir ler então deve cancelar o programa. E se não cancelar por certo esses dados lidos além do tamanho de LerContatos vão se perder para sempre, e por isso disse que vai ler apenas os ímpares, 1,3,5... A questão do fwrite é similar. Se tiver dados no endereço especificado pode gravar tantos quanto precise. Mas se não tiver dados fwrite vai seguir pela memória copiando o que tiver lá e gravando no arquivo. E se não tiver acesso à memória a partir de algum ponto desses o programa vai cancelar. Só isso. Exemplo: Contato contato[300]; Se tem algo assim fwrite pode gravar os 300 de uma vez. E é mais eficiente, claro. Mas não tem como saber se tem de fato dados válidos lá para os 300. Isso é a lógica do programa que vai fazer acontecer. E não dá pra saber se tem espaço na saída para gravar isso. Por isso fwrite retorna o total gravado. Em geral isso é pouco. Existe uma norma para isso. Veja ITU E.123, E.164, o RFC 2806. E as convenções, por exemplo nos celulares. Um número aqui no BR estaria bem descrito como +123 (12) 123456789. Pode ser ok aceitar hifens e espaços para formatar os números. E no teclado pode usar letras ao invés de números, apesar de ser pouco comum no Brasil. Talvez alguém se lembre da campanha da Porto Seguros que tentou emplacar o 333-Porto para o telefone... Ou alguém se lembre de usar o teclado do celular para entrar com texto... 8 pode ser T,U ou V também... Isso está errado, @devair1010. Entenda que fgets só deixa o '\n' lá se tiver espaço. Não pode ir lá cegamente e colocar um 0 porque se o usuário entrar com 50 ou mais dígitos fgets vai colocar exatamente os 50 lá. Entenda que fgets pode não ler nadinha e aí seu programa segue sem olhar pra trás, cosiderando que leu algo. fgets retorna char* por uma boa razão. Esse erro é o mesmo de não testar o retorno de scanf. Contato.nome é um endereço e tem certamente algo lá. Algum valor tem. Não há garantia que o que está lá na linha seguinte foi lido por fgets
  13. Pois é: como eu disse, não pode colocar as antenas desse AX6000 em dois lugares. Pode abrir mão das antenas do aparelho do provedor, simplesmente porque em outro aparelho na rede, o que não tinha dito antes. Não está claro que vai melhorar em algo, apesar de estar no limite do alcance de gigabit. Deve considerar todos os dispositivos da rede e não um só. E mesmo um só dificilmente iria conseguir processar o que viesse perto desse limite. Pois é: troque o switch por um switch mais rápido e a rede toda vai sair ganhando. Troque placas de rede onde possível e use 5G ou 10GB na LAN e as latências vão diminuir e tudo vai fluir melhor na LAN.
  14. Em modo bridge o roteador se torna apenas um conversor de mídia. Mas não há muito que gerenciar da internet de um modo ou de outro, apenas encaminhamento de portas, algum firewall ou DDNS. Alguns roteadores ou um computador na entrada podem ter mais regras de acesso, como filtros de conteúdo. Boa parte do trabalho do roteador primário está mesmo do lado da LAN, gerenciando a INTRAnet. Colocar o roteador em modo bridge em geral significa abrir mão de várias portas ethernet e da cobertura das antenas, já que se ficar apenas com um AX6000 não pode por antenas em dois lugares e a cobertura a 5ghz vai ficar naturalmente prejudicada, já que esse sinal raramente passa duas paredes com qualidade. 5% ou 6% de performance não parece nada importante. Quantos dispositivos tem? Se tiver poucos, considere que provavelmente não tem nada na sua rede que consiga processar isso sozinho. E por outro lado poucos serviços do lado da internet não vão ter um limite do quanto entregam para cada cliente. Esses números de performance são coisas vazias, enviando nada para lugar nenhum, esses dados que vem por uns 30s são nada e não são processados por quem recebe ou por quem envia. A realidade é bem distinta. Não está claro que seja uma bomba, apenas por esses 5-6% no wifi, e teria que testar muitas vezes para ter certeza de que não é uma flutuação normal. O fato da entrada ser coaxial ou fibra não é assim relevante, exceto pelo upload: em geral na NET/Claro o upload fica entre 10-20% do download via coaxial, e via fibra em geral é praticamente simétrico. Só que a maioria dos usuários nem chega perto de usar 10-20% de upload, com o tráfego totalmente concentrado no download.
  15. Erro no Fread que imprimi de um arquivo apenas um contato é não o restante Está lendo dois registros por vez Teste com 4 ao menos e vai poder ver os ímpares. Mas bem rapidinho. Notou que não para o programa para poder ver os contatos? Tem que ser muito dinâmico o leitor para poder ler antes que o programa apague a tela. Tem muita coisa ainda errada em seu programa e está um pouco longe de funcionar. Muitos são erros comuns, e deles eu tenho uma lista de onde copio essas coisas há tempos. Parece que todos esses programas tem a mesma origem e eu acabava escrevendo sempre as mesmas coisas, então recortar e colar é o simples. Pode ser que tenham livros ruins, apostilas ruins, instrutores ruins, ou que copiem programas ruins durante gerações. Ou tudo isso. Coisas para considerar (da minha lista ) Não use system() para nada. Não estará fazendo nada. Não estará aprendendo nada. Não há praticamente nada que possa fazer com system() que não possa fazer em C ou C++. system() foi escrita em C e o sistema quase todo também. E em geral é proibido em empresas e escolas afinal: é um risco grande de segurança. E se tem algo que você não possa inicialmente fazer em C ou C++ talvez não deva mesmo fazer. evite retornar void de funções: em geral é um desperdício. E muitas vezes um erro. Use argumentos nas funções, e retorne algo delas. É mais esperto e expressivo. Nunca use variáveis globais. Isso é um pesadelo e sempre vai cair na sua cabeça. Em geral é proibido em empresas e escolas. Não declare NADA que use memória fora de main(). Nunca leia valores do teclado para alimentar seu programa antes dele estar rodando. Só vai te atrasar e não acrescenta absolutamente nada. Use constantes, use funções que retornam a estrutura preenchida. Leia de arquivos: é trivial em C. Ao terminar os testes aí sim incorpore a leitura. Um programa interativo é chato para testar. Durante o desenvolvimento ninguém quer interagir com o programa. Nunca escreva um programa interativo, mesmo que seja o objetivo final. Use nomes significativos para as variáveis e fuja de coisas como aux, aux1 e aux2. E não use nomes de variáveis enormes porque em uma expressão fica muito difícil de ler. Se seu programa tem um menu, entenda que o menu() deve mostrar as opções e ler e retornar a opção. Um void menu() é um desperdício. scanf() foi escrita para ler entrada formatada. Não use para ler do teclado, que claramente não é entrada formatada. Só vai dar mais trabalho. Muito mais trabalho. Ao usar scanf() ou alguma função da família, como fscanf() entenda que ela retorna um valor. E teste. É ingênuo deixar o programa seguir sem testar. TESTE sempre. Exemplo: para 5 especificadores --- aquelas coisas com % na frente e que não tem um asterisco nem outro '%' --- como "%d %d %f %f %d" scanf() pode ler de 0 a 5 itens ou dar erro e retornar -1. Então teste o retorno que vai estar entre -1 e 5... Nunca escreva um programa interativo. Não vai aprender nada. Não vai ganhar nada. Escreva e teste todas as funções. DEPOIS de tudo testado coloque a parte interativa. isso inclui claro o eventual menu. evite ler do teclado a menos que seja o objetivo do problema. Ler de arquivos é muito mais simples, seguro e fácil de reproduzir. Não há razão para ficar parado em frente a tela minutos inventando nomes de campos e coisas assim: o efeito é que vai acabar não testando direito porque é difícil controlar e repetir testes. Não misture entrada de dados ou formatação com a apresentação dos dados ou a lógica do programa, Isso é um desastre para manutenção e desenvolvimento. Um printf() de 6 linhas é muito, mas muito melhor que 6 printf() de 1 linha. E se só vai mostrar o texto puts() é ainda melhor e dezenas de vezes mais rápido que uma série de printf(). Ao usar uma estrutura de dados como uma lista, uma pilha ou fila, entenda que ela é um container e nada tem a ver com os dados. Não misture NUNCA os dados com a estrutura porque só via complicar tudo. Em especial vai ficar muito mais difícil aproveitar a estrutura em outros programas, e essa é toda a razão de escrever um programa. typedef struct { int sequencial; char nome[50]; char email[30]; long int telefone; } ContatoProfissional; Seu programa só tem um tipo de contato. Tanto faz se é Profissional ou Olímpico ou Verde. Use apenas Contato e quando tiver mais categorias então acrescente algo (especialização). E long int para um telefone? E depois ainda escreve isso no prompt: printf("Digite o telefone (00 90000 0000): "); scanf("%ld", &Contato.telefone); Acha mesmo que o usuário vai entender que é pra digitar um único número inteiro? Testou isso? Vai operar com o número de telefone? Não vai. Use o simples: todo mundo (mesmo, já que é um padrão global) sabe como é um número de telefone: +XX (YY) ZZZZZZ use um char[]. Leia o manual: scanf retorna um int. Testou isso? Não. Claro que vai dar erro. Testou o que acontece se o cara for digitar 1 e bater a mão no q por exemplo? Seu programa entra em loop. TESTE seu programa em partes, pra ver o que funciona e o que não funciona. Vai aprendr muito mais e muito mais rápido. Não perca horas digitando um programa "completo" que depois vai ficar horas cancelando na sua frente em segundos. Teste as partes. void exibirContatosCadastrados() Pra que esse nome gigante? Só pode exibir contatos. E só os cadastrados. É a realidade. Exibir() não dá na mesma? void menu() { printf("1 - Inserir um contato.\n"); printf("2 - Exibir os contatos cadastrados.\n"); printf("3 - Alteracao de dados de um contato.\n"); printf("4 - Excluir um contato.\n"); printf( "5 - Consultar os dados de um determinado " "contato.\n"); printf("0 - Sair.\n"); printf(">> "); } Se isso é o menu, não seria muito mais simples e lógico ler aí dentro e retornar a opção? Faça o simples. E para que nada menos que 7 chamadas a printf() para imprimir 7 linhas? Não seria mais simples, mais legível e dezenas de vezes mais rápido usar uma única chamada? Não retorne void. EXEMPLO Essa função. copiada da sua, faz a mesma coisa, com um só printf e retorna a opção. int menu(void) { char linha[20]; do { printf("\ \n\ 1 - Inserir um contato.\n\ 2 - Exibir os contatos cadastrados.\n\ 3 - Alteracao de dados de um contato.\n\ 4 - Excluir um contato.\n\ 5 - Consultar os dados de um determinado\n\ contato.\n\ \n\ 0 - Sair.\n\ \n\ >> "); fgets(linha, sizeof(linha), stdin); if (linha[0] < '0') continue; // le de novo if (linha[0] > '5') continue; // le de novo return linha[0]; // retorna o primeiro numero } while (linha[0] != '0'); return linha[0]; } Sobre isso ContatoProfissional Contato; int contSequencial = 1; int main() { //... Entenda que Contato e contSequencial serão globais, válidos por todo o programa. Você não quer isso: só dá erro, é o diabo pra testar e gera muitas dependências e fragilidades, além de ser proibido em muitas escolas e empresas. Use argumentos e funções. É muito, mas muio mais simples. while (fread( &LerContatos, sizeof(Contato), 2, arquivoContatos)) Qual a razão para esse '2'? Vai ler um registro por vez. Ao implementar as funções em seu programa a PRIMEIRA que escreve é sair. E testa. Sério que deixou essa de fora? while (fread( &LerContatos, sizeof(Contato), 2, arquivoContatos)) { printf( "Nome: %sEmail: %sTelefone: " "%ld\nSequencia: %d", LerContatos.nome, LerContatos.email, LerContatos.telefone, LerContatos.sequencial); } Vai repetir toda vez os nomes dos campos? Não seria mais simples e esperto ter uma linha de título com os nomes dos campos e depois só os dados, numerados talvez? Como todas as planilhas? Em geral o comum nesses programas para iniciantes é ler os dados todos para a memória, em uma coleção de contatos, e apenas ler e gravar no disco no início e no fim do programa. É muito ais rápido e simples, já que em geral terá poucos contatos. E para alterar um registro lá no meio vai ser complicado. getchar(); printf("Digite o nome do contato: "); fgets(Contato.nome, 50, stdin); Qual o propósito de getchar antes do printf, e sem avisar o usuário? Mais um comentário: Sobre esse trecho void inserirContato() { FILE* arquivoContatos = fopen("contatos.dat", "ab"); if (arquivoContatos) { // ... fwrite( &contato, sizeof(contato), 1, arquivoContatos); fclose(arquivoContatos); } else { printf("ERRO AO ABRIR O ARQUIVO.\n"); } } é muito comum isso, mas também é muito chato de digitar, de ler e de acompanhar um programa desses: entenda que se não conseguir abrir o arquivo vai mostrar aquela mensagem. Só isso. Não é muito mais simples escrever isso desse jeito mesmo? E para que esse nome gigante? Compare: void inserirContato() { FILE* arq = fopen("contatos.dat", "ab"); if (arq == NULL) { printf("ERRO AO ABRIR O ARQUIVO.\n"); return; }; // ... fwrite(&contato, sizeof(contato), 1, arq); fclose(arq); } retornando assim que identificou o erro ao invés de deslocar todo o resto do código pra direita e colocar dentro do if...
  16. Repetidor WiFi nunca é boa ideia. Se tem a senha do aparelho apenas configure uma rede wifi como precisa e ajuste o gateway padrão e IP para o que usa em sua rede. E pode configurar DHCP com uma faixa do que usa na rede, assim os clientes wifi terão latência menor na resposta. E ligue uma porta L:AN dele na sua rede. Leva minutos. Esse é como um AC1200, WIFI5
  17. muito do que eu disse é, claro, altamente especulativo. Entenda que "sem conexão" é diferente de "sem DNS". Sobre o "crime", apenas interceptar e alterar DNS já pode ser crime. E ao fazer isso o cara tem acesso a todo o tráfego de DNS desses clientes. E depois pode simplesmente encaminhar o tráfego e responder. Mas pode não ter capacidade de responder em tempo para os clientes e ocorrer timeout em alguns ou todos. Você pode usar intervalos de lease pequenos em alguma região em que detectou esse comportamento. Isso diminui o alcance de uma redefinição para o valor máximo desse intervalo. Fizeram algum mapeamento geográfico desses problemas? Com TR-069 pode gerar um grupo de teste casado com algum serviço DHCP e acompanhar as coisas
  18. Em resumo: não use as portas WAN de nenhum roteador exceto o que está ligado a internet. Faça os testes da LAN sem a internet, afinal nada tem a ver. Se tem 4 roteadores teste um a um ligue os roteadores em paralelo. uma única rede IP Que significa? perguntei algo ofensivo? Desculpe
  19. A razão mais comum de mudar endereços de DNS --- no modo crime --- é interceptar acesso a certos sites em que o criminoso tenha interesse, e desviar o tráfego para um servidor que ele controle, para por exemplo capturar dados de usuários. O firewall não resolveria quase nada. Pode bloquear (no firewall) o acesso a algum desses servidores estranhos, mas dá para imaginar que eles fiquem online por pouco tempo e voltem com novos endereços. E se for mesmo um caso de spoofing voltado a certos sites o usuário acaba acessando o resto. E se bloquear ele não vai acessar nada. Imagine que alguém "captura" acessos a um certo banco ou loja, por exemplo. E passe o resto para outros servidores DNS e a vida segue, Apenas acessos a esses sites-alvo seriam afetados. Atualizar o firmware do roteador pode interferir no mecanismo de injeção que o pessoal usa. De onde vem o DNS que seus roteadores usam? É gravado na instalação? Sei provedor não tem acesso mais ao aparelho uma vez instalado? Não usa DHCP para endereçar os roteadores? Pode usar um tempo de lease pequeno... Ou comissionar um firmware com uma backdoor para seu uso. TR-069 seria uma mão na roda, afinal existe para isso. DOCSIS também permite ao menos redefinir a imagem do roteador.
  20. O mais provável é que esteja tudo certo e apenas ligou isso errado. Então são 4 roteadores. Deve ligar tudo em paralelo, uma única LAN, ou compartilhamento vai mesmo um inferno, e algumas coisas nem vão ser possíveis. Não deve fazer isso. Nunca. A menos que realmente precise e nesse caso provavelmente não estaria perguntando sobre isso nesse forum. Nada tem a ver DHCP com DNS e não existe esse conceito de retorno. Imagino que não tenha um servidor DNS para sua rede. DHCP pode ter vários, mas deve usar uma única rede IP. Compartilhamento de arquivos e impressoras não usa nenhum recurso dos roteadores, e o firmware não vai fazer nenhuma diferença. Não em redes domésticas. Isso seria importante se fosse talvez interligar duas LAN pela internet e precisasse compartilhar arquivos entre as duas. Compartilhamento de arquivos usa LAN e ethernet. Nada tem a ver com a internet. Não poderia. O compartilhamento de arquivos na LAN usa um switch, a parte das portas ethernet do roteador. E, claro, o wifi, que também é ethernet. Como ligou essas coisas? Como testou? Quantas máquinas são? Há comunicação entre elas por IP por exemplo? O que fez para testar?
  21. Compartilhamento de arquivos e impressoras na LAN nada tem a ver com o roteador. Talvez não tenha explicado bem o que quer fazer. Nada disso tem a ver com a rede. O compartilhamento deve ser configurado em cada sistema do modo tradicional. Se usar várias versões de Windows e Linux pode precisar mudar algo em relação a SMB no Windows ou Samba no Linux, mas em geral nem é preciso. Vincular IP com MAC nada tem a ver com isso. Mesmo que precise manter o IP em redes pequenas pode reservar o endereço no próprio DHCP whitelist tem a ver com conexão apenas, o mesmo caso de blacklist. Nada com compartilhamento
  22. Um em cada piso, ao lado de uma smart tv é o comum. Me foi recomendado usar roteadores em modo AP e me foi dito que isso resolveria muitos problemas. Eu não soube imaginar qual. Alguém me mandou um link de um vídeo que explicaria tudo. E assisti um vídeo de um certo Max com muitas explicações, e que tem mais de 1,5 milhão de exibições no Youtube. Uma perda de tempo. Muita coisa simplesmente errada. Muitos erros conceituais, o cara mal sabe explicar certas coisas, pula outras, até separei uma lista de tudo que estava errado. Eu tenho um roteador em modo AP onde moro. Isso porque era mais prático. Só que ele está dentro do forro de gesso no hall íntimo. há anos. Era para ser mesmo um AP. Só que eu já tinha o aparelho. Pode usar os cabos coaxiais para ajudar a puxar um cabo de rede. É trivial porque esse cabo é mais grosso e não precisa dele. Note que a VIVO permite ligar os decodificadores de TV via ethernet, ao contrário de Claro/Net, Sky, GVT, Tim e outros, que muitas vezes até tem a porta no aparelho mas não usam. obrigando o usuário a usar cabos coaxiais duros e om barramento em série, um desastre.
  23. Obrigado por esclarecer! Eu não ia ver isso nunca. Não há razão para usar o C80 como AP ou algo assim. Não sei porque fez isso. E essa noção de roteador principal seria o que? Um roteador não sabe isso. Nos extremos pode não ser ok. Se tem dois por exemplo eles deveriam estar a 1/3 e 2/3 da distância em uma casa comprida. Numa casa de vários pisos em geral é a mesma coisa, mas em cada piso. Essa casa tem ou não tem dutos para telefone ou TV? Tem ao menos o interruptor paralelo dos dois lados da escada? Na prática se acaba colocando os roteadores ao lado de alguma TV porque simplifica tudo. Tenho um lugar aqui onde tem dois pendurados atrás das TV desde 2015
  24. Aqui tem a lista dos aparelhos dessa marca que são compatíveis com OneMesh: Dispositivos TP-Link OneMesh. Isso no site do fabricante hoje. E não tem esse aparelho na lista, como eu te disse. Manter o mesmo nome e senha é normal; É como funciona a rede mesh --- malha --- e nada tem a ver com seu aparelho da operadora estar em modo bridge. Pode usar uma rede mesh para estender qualquer rede wifi que tenha na LAN. E não precisa claro ser a única. Não estou certo da diferença entre a rede mesh e esse produto onemesh no entanto. Como eu disse antes, não precisa. E o C80 não é compatível com isso. Procure, como eu também disse, um aparelho AX como o AX-73 hoje em dia, se esse lance da rede WIFI única é de fato importante pra você. Gerenciar o que? Controle parental? Firewall? NAT? DHCP? E entenda que vai perder metade das portas ethernet e a cobertura de wifi. Se o AsKey for um AC1500 por exemplo vai perder exatamente isso: 300 mbps em 2.4 e 1200 mbps em 5 GHz: 40% da banda. E a cobertura oferecida pelas antenas dele. Simples aritmética. E o cabeamento pode ficar infernal. Pois é: não conheço a casa nem o técnico. Mas posso te dizer que onde estou agora é dessa época e tem um duto levando telefone para todos os ambientes. E já fiz isso incontáveis vezes em muitos lugares. Sugiro verificar: sua casa não tem mesmo dutos para telefone? Por onde entrou o cabo da VIVO? Me lembro de já ter usado o duto que leva o fio de retorno da luz da escada em uma casa de dois pisos uma vez. Mesmo sobrados muito antigos em geral tem um interruptor para a luz da escada em cada lado da escada... Em muitos casos usei dutos como os dutoplast que servem para uso externo, para esse propósito. Mas em geral em instalações comerciais quando era preciso passar muitos cabos. E em casos que o pessoal havia por exemplo alugado um imóvel anexo e precisava unificar a rede, e não haviam mesmo dutos. São baratos e a prova de agua e luz esses dutos. Só você pode dizer o que é importante em sua instalação. Mesh não é uma maravilha. Custa caro e só traz isso: transitividade transparente para o caso de ficar andando com um dispositivo pelo site. Eu não acho importante, nem me importo de eventualmente precisar fazer isso com o celular, leva segundos afinal. Só que minha prioridade é a rede em si. E os dispositivos que uso mais são computadores e as TV, e dispositivos de automação que não se movem, tipo lâmpadas, sensores e interruptores. E é melhor ver mesh como uma solução apenas para wifi. TV hoje em dia são grandes consumidoras de banda e pouco sentido faz não usar um cabo para ligar a TV na rede. Mesmo que não use internet, porque tem o espelhamento de tela e os servidores de mídia. Se precisa disso pode usar, dessa marca, qualquer aparelho compatível com mesh, como o AX23 ou AX73 e usar um Deco X20 da mesma marca no outro piso. Ligado via cabo. E nada tem a ver com usar o aparelho da VIVO em modo bridge. Deve evitar a todo custo usar isso em cascata, e a razão é óbvia: todo o tráfego para o terceiro teria que passar pelo segundo. A questão do DHCP não precisa ter em todos os roteadores, mas é esperto ter ao menos em outro fora o do provedor, já que o aparelho pode parar e ele não é seu. E se ele parae for o único você vai ficar sem a LAN. Não é esperto. Cai a internet e você não pode passar um filme do laptop na TV do primeiro piso? Não pode imprimir na impressora wifi que está no escritório? Você não quer isso. E a latência diminui, com um laptop obtendo um endereço de imediato, porque o servidor está do outro lado do cabo ou da antena já. Mas é muito comum essa deficiência, por ter uma noção bem difundida de que não se deve --- oui não se pode --- ter mais de um servidor DHCP na rede. É um mito e uma bobagem. Como é comum restaurantes em que o wifi para sempre na hora do almoço e tipo 10X por dia. Você resumiu bem: só estava errado. De todo modo, resumindo o lado mesh: se isso é importante pra você pode usar um aparelho só desses X20 para projetar a rede wifi de um AX23 ou Ax73 ou qualquer outro da lista que te enviei, projetando a rede wifi de um piso no outro e terá boa cobertura. E repito nada tem a ver com a internet nem com colocar o aparelho da operadora em modo bridge nem com ter uma única rede wifi nada tem a ver com ethernet via cabo (wifi também é ethernet) e é melhor considerar isso em separado. E as TV gastam muita banda hoje em dia. LAN nada tem a ver com internet. Existiam muito antes. Nem toda rede tem acesso a internet
  25. Rodando o programa como postado Digite a quantidade de pessoas [max.2147483647]: 4 M s M S F f f n O n·mero de pessoas que responderam sim e: 0. O n·mero de pessoas que responderam nÒo e: 0. A percentagem de pessoas do sexo feminino que responderam sim e: 0.000000. A percentagem de pessoas do sexo masculino que responderam nÒo e: 0.000000. como usou acentos e não se preocupou com a configuração de locale e coisas assim alguns acentos e caracteres da lingua portuguesa podem não ser impressos. como testou o retorno de scanf --- apenas em um ponto e não em todos --- comparando com EOF ao invés de usar o número de especificadores, seu programa falha se teclar algo diferente de 1 e 0, que foi a interpretação que usou para SIm e Não. Seis casas decimais para uma porcentagem de pesquisa de 4 opções talvez seja exagerado. E um sinal % seria bem-vindo Talvez pudesse ainda considerar que: o que está bom pode melhorar informar ao usuário que ele pode digitar até 2,14 bilhões de questões talvez seja um exagero. Incluir limits.h somente para poder usar INT_MAX talvez seja menos efetivo do que usar um limite mais perto de uns 10 elementos, ao invés de INT_MAX, que pode ser considerado exagerado para um programa interativo. Afinal alguém vai ficar lá digitando. E se passar de uma tela fica ruim pra conferir os valores. algum tipo de instrução ao usuário sobre o que se espera que ele digite até esse limite seria uma cortesia interessante, e aceitar minúsculas e maiúsculas seria também cortês. E trocar "S/N" por "1/0" não parece somar nada ao código ou à experiência de uso dele. Talvez devesse se ater ao enunciado. contar as respostas, algo como "1 de 2147483647" ajudaria a lembrar ao usuário quanto falta para terminar, ou a se posicionar se estiver copiando as respostas de uma lista numerada. desconsiderar respostas inválidas pode ser efetivo, para manter as porcentagens auditáveis e evitar a fúria de um usuário ao errar na 10a de 11 respostas. outros não é usado para nada, podia assim não existir. o programa usa 4 acumuladores e depois soma ao final para conseguir o total por sexo. Só que o enunciado pede apenas o total por sexo e o total positivo para feminino e o total negativo para masculino. Assim ao acumular femnao e mascnao o programa faz uma soma final sem necessidade. Ao invés de if (sexo == 'f') { if (resp == '1') femsim++; if (resp == '2') femnao++; } else if (sexo == 'm') { if (resp == '1') mascsim++; if (resp == '2') mascnao++; } else outros++; Prefira por exemplo if ((resp == 's') || (resp == 'S')) { if ((sexo == 'f') || (sexo == 'F')) ++i, ++sim, ++fem_sim; else if ((sexo == 'm') || (sexo == 'M')) ++i, ++sim; } else { if ((resp == 'n') || (resp == 'N')) { if ((sexo == 'm') || (sexo == 'M')) ++i, ++não, ++masc_nao; else if ((sexo == 'f') || (sexo == 'F')) ++i, ++não; } } Que só avança se a resposta for válida. aceita SNsnMFmf. conta as respostas não cancela se o cara digitar errado. int outros = 0; int femnao = 0, mascnao = 0; int femsim = 0, mascsim = 0; Todos esses valores são quantidades (não-negativos) e estariam melhor representados como unsigned. Sobre putchar('\n'); int resps = mascsim + femsim; int respn = mascnao + femnao; int fem = femsim + femnao; int masc = mascsim + mascnao; printf( "O número de pessoas que responderam sim e: %d.\n" "O número de pessoas que responderam não e: %d.\n" "A percentagem de pessoas do sexo feminino que " "responderam sim e: %f.\n" "A percentagem de pessoas do sexo masculino que " "responderam não e: %f.\n", resps, respn, (femsim * 100.0) / (fem > 0 ? fem : 1), (mascnao * 100.0) / (masc > 0 ? masc : 1)); putchar('\n'); É difícil entender duas chamadas a putchar apenas para gravar '\n' na saída. Porque não estão esses '\n' na mesma chamada a printf? São só dois símbolos. Prefira printf( "\n\ %d pessoas responderam sim.\n\ %d pessoas responderam não.\n\ %6.2f%% das pessoas do sexo feminino responderam sim.\n\ %6.2f%% das pessoas do sexo masculino responderam não\n\n", sim, não, (fem_sim * 100.0) / (sim > 0 ? sim : 1), (masc_nao * 100.0) / (não > 0 ? não : 1)); Que mostra algo como 2 pessoas responderam sim. 2 pessoas responderam não. 50.00% das pessoas do sexo feminino responderam sim. 50.00% das pessoas do sexo masculino responderam não Que é a mesma coisa mas é mais fácil de ler e de alinhar, e não tem as duas chamadas a putchar, simplesmente porque os dois '\n' estão na (única) chamada a printf. E parece mais fácil de ler na saída e no código. Entenda que não tem controle sobre onde vão usar seu programa, então se vai usar acentos e caracteres de algum idioma particular deve chamar locale e configurar a página de código de acordo. Veja no início desse post que a saída não ficou assim ok em algum computador. Sobre esse trecho int n = -1; /* valor negativo sendo uma não quantidade */ scanf("%d", &n); if (n <= 0) return 1; // ... for (int i = 0; i < n; i++) { int r = scanf(" %c %c", &sexo, &resp); if (r == EOF) break; Considere É sabido então que scanf retorna um int. Usou n = -1 inicialmente para poder encerrar o programa se scanf não ler nada, por exemplo porque o usuário teclou uma letra por engano. Só que na chamada seguinte declarou e usou r para receber o retorno de scanf. Por uma questão de consistência, no mínimo, deveria fazer a mesma coisa nos 2 pontos: ou trata o retorno de scanf ou coloca um valor sentinela numa das variáveis de scanf. entenda que ao usar o especificador " %c %c" scanf pode retornar -1, 0, 1 ou 2, já que é um scanner e pode ler apenas uma letra, e aí seu programa já era. Teste sempre o retorno de scanf comparando com o total de especificadores, 2 nesse caso. Use: if (r != 2) break; considere uma mensagem de erro. Considere também usar continue ao invés de break e simplesmente ignorar essa entrada. Imagine você mesmo digitando 10 de 12 números e aí erra na hora de digitar a resposta. Não seria melhor ignorar, ou avisar o usuário? Esse é um comportamento de programa que enfurece o usuário, ou mesmo o autor do programa tentando testar... Entenda que "%c %c" também aceita as duas letras juntas, como SM ou m0 no seu caso Isso está correto printf( "%s%d%s", "Digite a quantidade de pessoas [max.", INT_MAX, "]: "); mas é 'difícil de ler e alinhar, e mais lerdo: está passando 3 parâmetros, incluídas duas constantes, para printf. Se escreve por uma nota ou em um trabalho ou entrevista prefira o simples e mais legível printf( "Digite a quantidade de pessoas [max = %d]: ", MAX_RESP); porque é muito mais rápido, e simples de alterar sem ter que ficar procurando campos.´É assim em java, Python, C# e C++ por exemplo. Deve ter uma razão. EXEMPLO Considerando o que eu disse e alterando um pouco o seu programa, uma possível implementação seria: (saída de uma execução) Digite a quantidade de pessoas [max = 12]: 4 Vai ler 4 respostas SsNn MnFf Use uma linha para cada resposta, com 'S' ou 's' para gostei, 'N' ou 'n' para não gostei, e 'M' 'm' 'F' 'f' para o sexo [1 de 4]: s Y [1 de 4]: Y s [1 de 4]: s m [2 de 4]: s F [3 de 4]: N m [4 de 4]: n F 2 pessoas responderam sim. 2 pessoas responderam não. 50.00% das pessoas do sexo feminino responderam sim. 50.00% das pessoas do sexo masculino responderam não Note que pode usar maiúsculas ou minúsculas para as respostas apenas respostas válidas são consideras prompts de instrução são mostrados ao usuário a formatação é mais simples. O código do exemplo, completo #define MAX_RESP 12 #define DEF_RESP 4 #include <stdio.h> int main(void) { unsigned n = 0; unsigned res = 0; printf( "Digite a quantidade de pessoas [max = %u]: ", MAX_RESP); res = scanf("%ud", &n); if (res != 1) return -1; if (n > MAX_RESP) n = DEF_RESP; printf("Vai ler %d respostas\n", n); char sexo = 0; char resp = 0; unsigned masc_nao = 0; unsigned fem_sim = 0; unsigned sim = 0; unsigned não = 0; printf( "\ SsNn MnFf\n\ Use uma linha para cada resposta, com 'S' ou 's' para gostei,\n\ 'N' ou 'n' para não gostei, e 'M' 'm' 'F' 'f' para o sexo\n\n\n"); for (unsigned i = 1; i <= n;) // incrementa apenas se for valida { printf("[%u de %u]: ", i, n); res = scanf(" %c %c", &resp, &sexo); if (res != 2) continue; if ((resp == 's') || (resp == 'S')) { if ((sexo == 'f') || (sexo == 'F')) ++i, ++sim, ++fem_sim; else if ((sexo == 'm') || (sexo == 'M')) ++i, ++sim; } else { if ((resp == 'n') || (resp == 'N')) { if ((sexo == 'm') || (sexo == 'M')) ++i, ++não, ++masc_nao; else if ((sexo == 'f') || (sexo == 'F')) ++i, ++não; } } } printf( "\n\ %d pessoas responderam sim.\n\ %d pessoas responderam não.\n\ %6.2f%% das pessoas do sexo feminino responderam sim.\n\ %6.2f%% das pessoas do sexo masculino responderam não\n\n", sim, não, (fem_sim * 100.0) / (sim > 0 ? sim : 1), (masc_nao * 100.0) / (não > 0 ? não : 1)); }

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!