Ir ao conteúdo
  • Cadastre-se

V!OLADOR

Membro Pleno
  • Posts

    437
  • Cadastrado em

  • Última visita

Tudo que V!OLADOR postou

  1. Bom, existe um erro evidente aqui Você provavelmente não gostaria de incrementar apenas a soma mas incluir as demais linhas no loop. Então, for(i = 1; i <= valor; ++i) { // todo o bloco deve ir entre { } } Mas especificamente sobre o algoritmo, eu acho que você está fazendo da maneira mais complicada (quiçá correta). O valor de valor é quadrado se valor == i*i, então basta algo como for(i = 1; i <= valor; ++i) { if (valor == i*i) { // valor é o quadrado do i: printar o resultado, os proximos 10 e terminar } } E caso seja quadrado, incrementar um novo loop de valor em diante e fazer o mesmo teste pra cada novo elemento (serão necessários dois loops portanto).
  2. Bom, após a leitura, bastaria imprimir a quantidade de sapatos lidos (o tamanho do vetor estoque) e isso cumpriria o primeiro objetivo do programa, a quantidade. O percentual também seria bem simples, basta um loop em estoque e verificar o tamanho de cada sapato (supondo que tamanho caracterize um tipo). Durante o loop, faça o somatório das ocorrências de cada tipo (ou seja, cada tipo deve ter uma somatória independe e devidamente inicializada com zero) e, ao final, a razão entre cada soma e o total (opcionalmente multiplicado por 100) resulta no percentual de cada tipo. Apesar de simples há várias linhas a serem escritas antes de funcionar. Por exemplo, eventualmente, definir uma lógica pra governar os tamanhos possíveis, fazer um vetor estoque que guarde uma quantidade arbitrária de calcados etc. Aparentemente você pode utilizar funções, então crie funções especializadas pra cada etapa. Por exemplo, pra cada estoque com n elementos e um determinado tamanho, uma função que retorne o total de ocorrências daquele tamanho (um inteiro). Isso deixaria tudo mais simples, elegante, menos errático, fácil de modificar etc. Tente e se engasgar poste o código atualizado pra ajudarmos dai em diante. Edit: Nas modificações que venha a fazer, você pode eventualmente cometer um erro aqui: estoque[i] = ler(); Sugestão mais segura: ler(&estoque[i]);
  3. Saudações, @arfneto! Fique a vontade pra entrometer-se sempre. Não li tudo em detalhes mas concordei com tudo que vi. Meu ponto entretanto era outro. O post original não tá bem redigido e deixa várias duvidas. Pra citar um exemplo: Dando uma olhadela rápida no arquivo .txt do @Leonardo Ely, o cabeçalho tem essa cara: usuario mensagem data local Com um espaço entre "usuario" e "mensagem" e tabs entre o resto (provavelmente uma exportação direta de um MS Excel ou algo do gênero). Na primeira linha temos: HarissonAndrade "@arthurmoledoval e @GuilhermeBoulos quais sao... #Eleicoes2020" 21/10/2020 00:12 Brasil Incompatível com o cabeçalho caso horário não seja considerado data (o que não parece ser o caso) e com separadores evidentes. Então, além das inconsistências, se ele utiliza um .txt com formatação diferente do .csv pra desenhar o algoritmo, o trabalho torna-se um pesadelo (curiosamente, no post original o .txt e .csv são classificados como idênticos, como de fato espera-se). Então não me refiro ao que eu gostaria que fosse ou meu estilo de .csv favorito e sim ao problema especifico do @Leonardo Ely, cuja descrição é um pouco incoerente. Veja que todas essa informações inconsistentes foram dadas no post original ao invés da enfase no formato que ele quer efetivamente utilizar: HarissonAndrade"@arthurmoledoval e @GuilhermeBoulos quais sao... #Eleicoes2020"21/10/202000:12Brasil E nem isso ele confirmou. O que me leva ao meu post inicial: caso especifique (coerentemente, precisamente) um formato, o problema é trivial. Em programação, a precisão na descrição do problema, e da solução, é um princípio fundamental.
  4. Que coisa confusa. Supõe-se que um formato .csv é exatamente separado por vírgulas (comma em inglês, por isso um "c" em "csv"). Quando você se refere a não ter separador, significa ter um espaço em branco entre as entradas? tipo, "aaaa bbbb cccc dddd"? ou nem isso, ou seja, "aaaabbbbccccdddd"? Caso tenha um espaço em branco, no fim das contas há um separador. Bastaria então usar a função getline (da biblioteca stdio.h) pra ler uma linha inteira, passar essa linha em seguida pra função strtok que a dividiria nas respectivas entradas (usando o espaço em branco como delimitador), e copiar cada uma pra sua respectiva string em struct info. Depois repetiria o processo pra próxima linha do arquivo. Há uma infinidade de soluções possíveis dependendo do formato do arquivo. Caso não tenha um espaço em branco mas sempre tenha uma característica usável, serve também. Por exemplo, o nome do usuário sempre começa com @, a mensagem sempre começa com " etc. Em tempo, isso aqui tá errado aparentemente: Você deu o endereço de um objeto, &i, do tipo struct info, pra guardar 1 entrada de sizeof(result) bytes, sendo que result é um ponteiro pra char e não corresponde ao tamanho de i. Uhh! Provavelmente você tinha uma ideia e escreveu outra coisa sem querer.
  5. Bom, você esqueceu de inicializar item pra então ser possível entrar no while. Ou seja, int qtd = 0, item = 1; E não esqueça de incluir os casos 1 e 7 no intervalo de possibilidades: while ((item >= 1) && (item <= 7)) E por fim, em linhas assim: total = total + (4, 99 * qtd); o idioma está incorreto. Você quis dizer: total = total + (4.99 * qtd);
  6. Bom, aparentemente S1 e S2 são completamente independentes, não? caso positivo você poderia simplesmente tentar o seguinte: /* ... */ printf("\nEscolha números e separe-os por /:\n"); fflush(stdin); fgets (Cood1,250,stdin); S1 = strtok(Cood1,"/\n"); while (S1 != NULL) { printf("%s\n",S1); S1 = strtok(NULL,"/\n"); } /* bloco pra S2 aqui */ return 0; e repetir o processo pra S2 em seguida.
  7. Como o colega @devair1010 foi nominalmente summonado pra resolver o problema mas parece que cheguei primeiro, vou deixar minha contribuição como spoiler pra não atrapalhar o papo .
  8. A primeira chamada de strtok retorna o primeiro símbolo na string fornecida (Cood1, no seu caso). Da segunda chamada em diante, com um argumento NULL, strtok retorna os demais símbolos da string fornecida anteriormente. Porém, se você fornecer uma nova string na segunda chamada (ou seja, não for um argumento NULL, e no seu caso foi Cood2), ela reinicia o processo e retorna o primeiro símbolo, novamente, agora da nova string. Basta reposicionar os while (ou seja, as chamadas subsequentes) imediatamente após a primeira respectiva chamada de strtok e talvez resolva o problema, por exemplo: S1 = strtok(Cood1,"/\n"); while (S1 != NULL) { printf("%s\n",S1); S1 = strtok(NULL,"/\n"); }
  9. Exemplo escrito em C do Quick Sort com OMP: Quicksort using OPENMP Cinco minutinhos estudando o exemplo acima e você já vai ser capaz de desenrolar a melhor forma de implementar sua própria versão.
  10. Bom, a afirmação correta deveria ser: essa convenção nada teria a ver com C e C++. Apenas começa a ter. Como expliquei acima, e por influência de Python (a maioria dos programadores desses novos projetos tiveram um ensino formal em Python). O tema tampouco é novo. Por exemplo, na GSL (GNU Scientific Library), vemos um ótimo exemplo de um projeto em C com orientação a objeto e encapsulamento (no estilo C, obviamente) e utilizando a mesma estrategia dos programadores de Python, mas com uma convenção própria. Efetivamente tudo é publico por definição. Obviamente ainda é cedo pra dizer que public e private são conceitos em desuso mas há uma tendência de usá-los menos e isso só vai tomar forma em 5-10 anos, ou não. Por sinal, Fortran AINDA reina na academia. Nos últimos dois anos trabalhei num projeto (física atômica e molecular) essencialmente em C++ e, ainda assim, escrevemos pelo menos umas 50 linhas de Fortran por dia. O velho Fortran anda mais vivo do que nunca com todo tipo de conceitos modernos. Vida longa a Fortran e LISP. Edit: Por sinal, Fortran anda tão vivo, que até mesmo nos cursos superiores aqui fora (moro no exterior) C++ tem sido gradativamente substituído por Python e... pasmem, Fortran continua nas grades curriculares!
  11. Aqui: pode causar um problema de segmentation fault porque o elemento i não existe. Afinal o vetor coef está vazio. Você pode simplesmente ler o coeficiente numa variável temporária e usar push_back pra colocá-lo no vetor. push_back vai alocar memoria por conta própria: for(int i = 0; i < ncoef; i++) { float temp; std::cout << "Digite o coeficiente " << i + 1 << ": "; std::cin >> temp; coef.std::vector<float>::push_back(temp); printf("Ok.\n"); } Você tampouco precisa da variável ncoef, porque coef já possui seu próprio tamanho internamente e você pode checá-lo com a função size. Por sinal, você também esqueceu de incluir a biblioteca <vector>.
  12. Além das explicações do Mauro e do Flávio, a linguagem Python incluiu uma convenção que vem tornando-se um padrão em C e derivados, usar "_" no inicio dos identificadores de membros privados em classes. Assim práticas relativamente velhas, como em C++, nos quais acessibilidade seria controlada por uma palavra reservada, e.g. public ou private, é reduzida a algo bem mais simples nos quais tudo é público, e o membro que inicia com "_" é reservada pra uso interno. Tudo controlado pelo programador e pelo cliente. Aos poucos essa nova tendência pode eventualmente aparecer nos novos guias de boas práticas. Já vi o uso em pelo menos dois projetos grandes relacionados a game engines com C++ e num projeto cientifico em C (na minha área de atuação profissional). Pessoalmente, eu até gosto da nova prática mas acho que deveríamos utilizar "_ _" pra limitar a possibilidade de conflito com Instâncias no código cliente.
  13. Em C os elementos de um array são indexados a partir do zero, ou seja, o intervalo pra cinco elementos seria entre count = 0 e count = 4. Então, no for for (count=1; count<=5; count++) count deveria iniciar em 0 e o loop não deveria terminar enquanto count < 5, totalizando 5 elementos.
  14. Duvida: você gostaria de remover uma sequencia de caracteres substituindo-os por espaços em branco ou gostaria de aparar a string? ou seja, fisicamente cortá-la em pedaços menores? Caso seja apenas trocar um pedaço da string por espaços em branco, você poderia usar memset. Por exemplo, suponha a string name, e que você gostaria de substituir dez caracteres a partir do quinto por um espaço em branco, ' ', memset(name + 5, ' ', sizeof(char)*10); Edit: name + 5 ou &name[5] são equivalentes.
  15. Ótimo, parabéns. Em C++ é sempre preferível usar o std::vector porque ele cuida de toda a parte burocrática sobre alocar recursos, liberar recursos além de varias funcionalidades pré-prontas. Assim, você precisa apenas se preocupar com o problema que gostaria resolver. Então, caso utilizado corretamente, eles podem ser tão eficientes quanto um array do C e mais versáteis, ou seja, devemos usá-los sempre que possível. Mas há um detalhe: eles permitem que sejam utilizados de forma incorreta (não ótima). Então, caso a aplicação demande eficiência, um std::vector mal utilizado pode degradar a eficiência do programa. Basicamente uma questão de (re)educação das boas práticas pra usá-los eficientemente. Os arrays (ou ponteiros) tradicionais não possuem esse caviat de serem bem ou mal utilizados, eficiência é quase garantida pela natureza da simplicidade, mas são perigosos por outras razões. O exemplo que dei pra você usando a função push_back( ), por exemplo, seria ideal pra um caso de algumas centenas de trabalhadores mas extremamente ruim caso seu objetivo fosse cadastrar os tralhadores da Índia (1.3 bilhões de entradas). Isso porque o vetor poderia eventualmente realocar 1.3 bilhões elementos na memoria; além disso o construtor da sua classe trabalhador seria invocado 1.3 bilhões de vezes pra criar o objeto t do seu código original; teríamos 1.3 bilhões de chamadas da própria função push_back( ) etc. Então deveríamos redesenhar todo o algorítimo pra evitar tudo isso. Por exemplo, usando a função reserve( ) pra pré-alocar memoria. Com arrays (ou ponteiros) tradicionais quase nada desse trabalho extra seria necessário mas deveríamos tomar conta da alocação, dos tamanhos, etc. pessoalmente. Na duvida, sempre use std::vector.
  16. V!OLADOR

    C Problema com Matriz #1

    Não deveria ser evidente? Quantos elementos existem entre j = 0 e j = 2? existe 0, 1 e 2. Ou seja, 3 elementos enquanto o array de cada linha i da matriz foi definido pra 2 elementos apenas. Agora, use o mesmo raciocínio pro caso entre j = 0 e j < 2 e veja a diferença.
  17. Há vários erros. A sintaxe pro if-else com vários casos é: if (a) { /* primeiro caso */ } else if (b) { /* segundo caso */ } else if (c) { /* terceiro caso */ } /* ... */ else { /* ultimo caso (se todos os anteriores são falsos) */ } Onde a, b e c representam a condição de cada caso. Além disso existem várias expressões sem o ; no final. Corrija todas. PS: Dev-C++ é apenas um editor de texto. C++ não é como Python no qual o código executa num interpretador.
  18. Bom, nesse outro contexto, agora manipulando ponteiros explicitamente, seria mais prático alocar e desalocar antes (e depois) do for: memoria *m = new memoria[numero]; // ... for (i = 0; i < numero; i++) { m[i].setValor(); m[i].imprime(); } // ... delete[] m;
  19. Sempre às ordens, patrão. Apenas cuidado porque eu sou o V!OLADOR e você está marcando outra pessoa, V1OL4DOR. Por sinal, eu não sabia que tinha um colega homônimo no fórum. Prazer em conhece-lo, @V1OL4DOR.
  20. Saudações, @arfneto! Claro, estou evitando sobrecarregar nosso amigo @kampa896 com informação demasiada pra não deixá-lo mais confuso. Certamente ele vai ter a oportunidade de aprender os detalhes e a notação adequada ao longo do estudo.
  21. Caso a entrada possua um tipo diferente daquele para o qual scanf foi instruída a ler, ela retornaria 0, indicando que leu zero elementos. Caso sejam vários elementos, ela retornaria então o numero de elementos lidos com sucesso, que pode não ser o total requerido, ou mesmo zero se nenhum dos elementos é compatível. O erro de leitura seria se, repentinamente, o arquivo stdin aberto automaticamente quando o programa começou a executar não pudesse ser lido. Então scanf indicaria o problema retornando EOF, que frequentemente equivale a -1 (depende do compilador). O uso de EOF faz mais sentido pra irmã de scanf, a função fscanf (file scan formatted), operando num arquivo manipulado pelo usuário. Seria muito raro ocorrer um erro com stdin, stdout e stderr, arquivos manipulados automaticamente.
  22. Bom, como fazer depende dos objetivos do programa, daquilo que você tem em mente pra ele. Se eu fosse modificar seu programa em cinco minutos eu faria algo como, std::vector<trabalhador> lista; // ... while (true) { std::cout << "INFORME OS DADOS SOLICITADOS: \n\n"; std::cout << "Nome do funcionario: "; info i1; std::cout << "\nCPF: "; info i2; std::cout << "\nNome da mae: "; familia f1; std::cout << "\nNome do pai: "; familia f2; trabalhador t(i1, i2, f1, f2); lista.std::vector<trabalhador>::push_back(t); // TODO: perguntar ao usuario se ele gostaria de terminar o cadastro de trabalhadores e terminar o loop caso positivo } no main mesmo, caso não haja razão pra fazer um rotina separada. E depois você poderia acessar o n-ésimo trabalhador da sua lista facilmente usando um iterador: for (std::vector<trabalhador>::iterator n = lista.std::vector<trabalhador>::begin(); n != lista.std::vector<trabalhador>::end(); ++n) { n->print(); // acessando o membro print() da classe trabalhador no n-esimo elemento da lista }
  23. Essa afirmação não está totalmente correta. C é uma linguagem com um conjunto de regras bem específico e não vai compilar quando a primeira delas for violada. Não há exceção. Não apenas C mas muitas outras linguagens da mesma família não podem reger problemas que estejam fora do seu escopo. Por exemplo, um erro de lógica do programador, escrito com a sintaxe correta, é um programa perfeitamente compilável mas vai produzir o resultado errado. Outro exemplo, um erro durante o tempo de execução é completamente alheio ao compilador. No seu caso o programa compilou? caso positivo, ele não possui erros semânticos mas o compilador não sabe nem o objetivo do programa ou se ele foi construído com a lógica correta pra atingir esse resultado. Essa é a sua função e não do C. Veja, no caso em tela, EOF significa "end of file", ou seja, fim do arquivo. Qual é o arquivo cujo final você está checando? caso você não saiba responder essa pergunta, o compilador tampouco vai saber. Caso você responda que está testando o final do arquivo stdin, então, eu poderia perguntar em seguida: você abriu esse arquivo? você testou se o arquivo está devidamente aberto? você sabe quantas linhas há nele? caso não saiba responder a esta pergunta também, advinha? o compilador tampouco. Caso você tenha respondido "não" pra alguma dessas perguntas, não há razão pro seu programa funcionar, aliás há uma grande chance dele não funcionar. Seja em C ou em Python. E se, por exemplo, toda vez que você digitar uma entrada no teclado, a shell do Ubuntu está adicionando uma nova linha ao buffer que representa a stdin? então nunca iriamos atingir o final do arquivo. Então, como você não sabe como a shell do Ubuntu está implementando o arquivo de entrada do seu programa, seria bom programar uma lógica que não dependesse desse arquivo. Por exemplo, while (scanf("%hd", &reclamar) == 1) Ou seja, ao invés de testar o final de um arquivo completamente desconhecido, você poderia tentar uma lógica segura, no caso, instruindo scanf a ler um short int e, em qualquer outro caso (retornando 0), induzir a execução a terminar. E por fim, dependendo da implementação do scanf que você está utilizando, ela retornaria EOF apenas se houvesse um erro de leitura do stdin antes de guardar a entrada em reclamar. Um erro bem raro de acontecer. Caso contrário ela retornaria infinitamente, com 1 elemento lido ou 0 elementos lidos.
  24. Ué, você escreveu o programa por conta própria? Porque aparentemente você não sabe fazer a parte mais simples. Suponha que você queira fazer a potência dos expoentes entre n = 0 até n = 10, e temos uma variável, digamos n_max, pra guardar a potência máxima, n_max = 10. Então, bastaria for (int n = 0; n <= n_max; ++n) { resultado = potencia(bas, n); printf("%f elevado a %d eh igual a %f\n", bas, n, resultado); } Convenientemente, você poderia ler n_max com scanf. O mesmo com a base da potência, se desejar.

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!