Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. abra a pasta do programa e veja se gerou um executável...
  2. Acho que esse é o 4.o tópico sobre esse exercício que vejo nesse forum nos últimos dias. Postei um programa que é praticamente a solução pra esse problema e tem uma discussão lá sobre isso. Acho que devia ler. E teve um outro tópico sobre o mesmo problema mas não sei agora o link. Pode achar pesquisando o conteúdo que eu postei na semana passada ou na anterior, direto aqui no link do perfil dos usuários. De volta ao seu programa E se fossem 30 campos? Ia testar uma a um em um if? Porque está se preocupando com os campos se sabe que vai classificar pelo primeiro? Apenas leia as linhas e carregue pra memória numa lista numerada, um vetor. Coo faria numa folha de papel. E sobre o insertion sort vou dizer o mesmo que eu disse para seus dois colegas que postaram aqui sobre o mesmo problema: Se vai usar insertion sort e está lendo um a um no arquivo. para que vai esperar acabar o arquivo e ter o vetor inteiro na memória pra depois classificar por inserção? Não é esperto. Use insertion sort direto da entrada e faça o simples: insira na ordem já. Isso afinal é insertion sort. Para que perder esse tempo todo colocando os caras primeiro fora de ordem para depois ordenar? De todo modo postei uma função e uma estrutura de dados que faz dos dois modos. Dê uma olhada lá. Esse é o outro tópico sobre o mesmo problema... No tópico #14 eu postei uma solução
  3. Eu acho que já expliquei umas vezes que o programa como está não funciona para palavras de tamanho max e é preciso corrigir isso. Não é uma melhoria. É um erro. Assim como o erro na inicialização que poderia cancelar o programa dependendo das opções de compilação porque está gravando em memória não alocada. Ou mesmo nem compilar dependendo da análise do compilador porque estaticamente já está errado. Não vou mais explicar isso porque está acima umas 3 ou 4 vezes. E também no outro tópico.
  4. arfneto

    C Alguém pra me ajudar?

    Pois é... strtok() não é o caminho que eu seguiria. Como eu te disse a primeira opção é fgetc(), mais simples. O compilador faz isso, o sistema faz isso, strtok() e fscanf() fazem isso... Mas pode conseguir assim. Um problema óbvio você já viu: usando scanf() você pelo menos tem um especificador %[xyzt] onde pode colocar qualquer coisa. Em strtok() tem apenas um char. Seria muito mais fácil modificar a rotina que te mostrei. E mais flexível. Evite editar seus posts a menos de alguma correção ortográfica ou algo assim. Dificulta para quem lê ou acompanha. Mais ainda: o software do forum não notifica o leitor de alguma alteração então você não vai conseguir respostas do que postar a partir de alguém que já tenha lido o post que alterou. Pense nisso... De volta ao seu programa Não entendo a razão de ter um printf() em seu programa. Muito menos uma chamada a system() Pra que isso? NUNCA faça isso a menos que faça parte do enunciado. E se fizer parte faça o menu ou a parte que imprime por último Outro caminho Usando OCR na imagem que postou o arquivo volta sozinho a ser texto: Snob representa I krok representa V squid representa X leij representa L snob snob Prata valen 34 créditcs snob krok Ouro valem 57800 créditos squid squid Iron valem 3900 créditos quanta vale squid leij snob snob ? quantos créditos säo sncb krok Silver ? guantos créditos säo sncb krok Gold ? quantos créditos Sao sncb krok Iron ? quanta wood Could wood chuk mood ? Porque não colocar isso em um arquivo e simplesmente usar para fazer o programa, talvez uma linha por vez? Escrever uma função para mostrar a tabela na tabela ajudaria também int mostra_tabela(Tabela*); e pronto. Está mesmo perdendo tempo com um menu e coisas assim? lendo dados da tela? Sério? Isso só vai te atrasar...
  5. arfneto

    C Alguém pra me ajudar?

    Você disse que nem tinha ideia do que significava Você tem dois tipos de entrada as que entram com um valor as que pedem uma resposta Se vier na ordem errada pode ser que não tenha dados suficientes e precise desprezar algo Tem muitas maneiras de implementar isso. Uma seria usar uma tabela simples acumular os valores logo no inicio, algo tipo typedef struct { char* token; int v_credito; int v_unidade; } Token; typedef struct { int N; Token T[300]; } Tabela; int main(int argc, char** argv) { Tabela T; T.N = 0; // ... }; E aí você vai preenchendo conforme receba dados, mais ou menos como o compilador faz com as variáveis. E quando vem uma consulta você pesquisa na tabela e vai somando os valores conforme a unidade pedida. Pode ler uma linha inteira com fgets() e separar os tokens com strtok(), pode usar fscanf() ou mesmo usar fgetc(). Eu postei um programa em C ontem que usa essa última opção, pode ser um exemplo porque ele faz exatamente isso: um parser. É mais complicado lá porque é um algoritmo recursivo, mas mude a rotina insere() lá e ela vai montar sua tabela sem gastar mais que uns minutos pra alterar... Claro, as outras opções também funcionam.
  6. arfneto

    C Alguém pra me ajudar?

    É uma gramática simples para ler e computar valores em duas "moedas" distintas: valor numérico e valor em créditos. Precisa analisar o texto e pegar as palavras chave e depois tabelar os valores. chaves: representa (entrada) vale (entrada) créditos (entrada) quantos (saida) quanto (saida) Basta ler as frases da entrada e agir de acordo com os termos
  7. Só posso imaginar que não leu direito. Repetiu o que eu disse pra corrigir o que eu disse... Corrigir os dois erros não é uma melhoria. Está errado apenas. Lamento se confundi alguém
  8. Não, não há. É exatamente o contrário. sizeof(0 foi escrito para isso. Tentou ao menos rodar o exemplo que te mostrei? sizeof(char) em seu compilador deve retornar 4. Mesmo que seja um cross-compiler, a menos que tenha sido escrito por um grupo de mulas. E fgets() vai funcionar de acordo. Se ler a documentação, ao menos a primeira página, do que te mostrei vai ver Que ilustra o fato de sizeof(0 retornar o valor correto para a máquina em que o programa está rodando Nada teria a ver com o projeto ou o tamanho. Seria apenas o uso inadequado de um operador. sizeof() na documentação E você vê que nada teria a ver com um bloco de memória alocado dinamicamente... Tem alguma referência sobre essa "boa prática"? Eu nunca vi uma implementação assim desse operador em 40 anos de C
  9. { while((fgets(palavra, sizeof(palavra), arq))!=NULL ) printf("%s\n", palavra); } Porque não tentou ao menos rodar um programa assim? #define max 10 #include <stdio.h> int main(int argc, char** argv) { char palavra[max]; printf("sizeof(palavra[max]) %d max %d sizeof(char) %d\n", sizeof(palavra), max, sizeof(char)); return 0; }; Não, não há um bug. Esse é o modo comum de chamar gets() Eis o protótipo char *fgets(char *str, int n, FILE *stream) Curiosamente aceita um int ao invés de um const unsigned mas é isso. Aqui sim temos um bug: Como vê no "programa" acima, max é 10 e palavra tem 30 bytes então fgets() não vai deixar você ler além de 10... Cuidado com essas definições. Se usar alocação dinâmica não há no padrão como identificar o tamanho da área alocada, um sizeof(). E isso não deveria ser um problema: se foi você que alocou passou o tamanho no malloc() então você deve saber. Se não foi você deve haver uma documentação dizendo até onde pode ler. Exato Na dúvida, recorte o trecho de código e teste em separado. Leva minutos. Cuidado. Isso não faz sentido. E não seria boa prática. E a observação não se aplica: sizeof() nada tem a ver com vetores. Apenas tipos ou variáveis estaticamente alocadas. Não deve confiar: LEIA e rode esse programa #define max 10 #include <stdio.h> int main(int argc, char** argv) { char palavra[max]; printf("sizeof(palavra[max]) %d max %d sizeof(char) %d\n", sizeof(palavra), max, sizeof(char)); printf("sizeof's (char) %d (int) %d (long) %d\n", sizeof(char), sizeof(int), sizeof(long)); printf("sizeof's (long long) %d (double) %d (float) %d\n", sizeof(long long), sizeof(double), sizeof(float)); printf("sizeof's (palavra[0]) %d\n(32 bits)\n", sizeof(palavra[0])); return 0; }; E verá sizeof(palavra[max]) 10 max 10 sizeof(char) 1 sizeof's (char) 1 (int) 4 (long) 4 sizeof's (long long) 8 (double) 8 (float) 4 sizeof's (palavra) 1 (32 bits) Como vê, por ser um operador, você pode chamar sizeof() com tipos também. sizeof na documentação
  10. arfneto

    C++ Erro no printf C++

    você aparentemente não entendeu. Eu te expliquei o porque da mensagem de erro, porque você disse que não tinha entendido... E o que estava indefinido era o erro e a variável c. Pela falta do terminador o compilador esperava algo como eu expliquei E por isso c ficou indefinido e gerou a mensagem ao final do scope
  11. Usando termos suaves, o programa é bem fraquinho. Mas não é pra mudar nada no item 1. Apenas corrigir o que está errado e preencher as lacunas e o trecho faltante, como foi muito discutido aqui e em dois tópicos. Curiosamente você deixou de corrigir DOIS erros óbvios que foram listados e comentados... Espero que não tenha entregue isso... for (i = 1; i <= 20; i++) { resposta[i] = ' '; } De novo? resposta é char[20] não pode escrever <=20 for (i = 0; i <= max; i++) { if (resposta[i] == letra) max é strlen(resposta) então não pode comparar comparar de 0 a max inclusive. Provavelmente não testou com uma palavra de 20 letras né? De 0 a 20 são 21... Mas seu professor pode testar... Sobre as melhorias Acho que não era isso que queria escrever... Não são palavras repetidas. Talvez não tenha lido a discussão, mas não acha mais interessante antes de tudo tirar o código duplicado no if e no while? E não ecoar a palavra quando o tal "jogador 1" digita? E deixar ele confirmar já que não está vendo a palavra que digitou? E já pensou em mostrar as letras posicionadas na palavra, tipo aquele jogo, sabe? Forca? E deixar uma listinha com as letras que o cara já tentou, só por cortesia? Tipo forca mesmo? Algo ingênuo assim A __ A __ __ S __ (T B M) para análise... E que tal usar uma fonte tipo máquina de escrever --- monospaced, tipo Courier New por exemplo --- para mostrar as letras, pra ficar mais arrumadinho na tela? E que tal letras grandes, já que é só digitar o número? No seu programa, claro. E afinal não precisa nem implementar... E mostrar um "ASCII chart" com o tal "enforcado" clássico conforme o cara for errando? Olha que meigo, pesquisando por "hangman ASCII art" no Bing E que tal enviar mensagens pela rede para jogar em dois computadores o jogador 1 e o 2? ...
  12. Pensando nesse troço, vou te mostrar uma função que consome esse tipo de entrada. Não testei muito, mas não vejo razão pra não funcionar A partir de (SAE) (SAD) como diz no desenho, e do exemplo Você vê que do lado esquerdo da raiz tem uma árvore igual, (SAE) seria ( 2 (1) (3) ) certo? E do lado direito? Nesse caso seria a árvore com raiz 7, ( 7 (6) (8) ) Só que não termina aí: 8 tem um descendente à direita e então seria ( 7 (6) (8 ( ) (9) ) ) Então você só precisa resolver a primeira parte: a raiz depois vai ter, a partir do '(', a árvore esquerda e depois o outro grupo a partir do '(' com a árvore direita. Claro que as duas podem estar vazias por exemplo // 2 ( (1) (3) ) ok // 2 ( ( ) ( ) ) ok // 2 ok // 5 ( 2 (1) (3) ) (7 (6) (8 () (9) ) ) o exemplo [*] Mas o que importa é que é a mesma coisa, sempre Então se você tiver uma rotina int insere(FILE*); que você chama com o arquivo aberto, apontando para a primeira posição da raiz, e ela retornar o total de nodes que ela conseguiu extrair ela vai fazer quase tudo que precisa: no caso do exemplo [*] ela deve retornar 8. Mas se chamar a partir do node 2 ela retorna 2, se chamar a partir do 7 ela retorna 3, o 6 para a esquerda e o 8 e o 9 pra direita, e assim por diante. Acho que deu pra entender... Uma pequena mudança no mecanismo Seria legal poder usar espaços e mudar de linha para separar exemplos mais complicados Compare 5(2(1)(3))(7(6)(8()(9))) Com essa notação textual, digamos, mais estilosa 5 ( 2 (1)(3) ) ( 7 (6) ( 8( ()(9) ) ) E fica mais fácil de imaginar a árvore e conferir os dados... Então uma pequena liberalidade em insere() para aceitar espaços e coisas assim faz bem. Eu fiz isso porque é mais simples o programa fazer do que eu ficar rabiscando no papel Um teste de uma rotina para o exemplo acima -> Node: '5' -> Node: '2' Lido ')' Node: '1' Lidos 1 nodes a esquerda de '2' Lido ')' Node: '3' Lidos 1 nodes a esquerda Node Terminal Lidos 0 nodes a direita Lidos 1 nodes a direita de '2' Lidos 3 nodes a esquerda de '5' -> Node: '7' Lido ')' Node: '6' Lidos 1 nodes a esquerda de '7' -> Node: '8' Node Terminal Lidos 0 nodes a esquerda Lido ')' Node: '9' Lidos 1 nodes a esquerda Node Terminal Lidos 0 nodes a direita Lidos 1 nodes a direita Lidos 1 nodes a esquerda de '8' Node Terminal Lidos 0 nodes a direita de '8' Lidos 2 nodes a esquerda Lidos 0 nodes a direita Lidos 2 nodes a direita de '7' Lidos 4 nodes a esquerda Lidos 0 nodes a direita Lidos 4 nodes a direita de '5' Inseridos 8 Nodes E como seria essa função? int insere(FILE* F) { if (F == NULL) return -1; // sem arquivo char campo[80]; char* p = &campo[0]; int lNodes = 0; int rNodes = 0; int n = fgetc(F); while (3) { switch (n) { case '(': if (p != campo) { *p = 0; printf("-> Node: '%s'\n", campo); lNodes = insere(F); printf("Lidos %d nodes a esquerda de '%s'\n", lNodes, campo); rNodes = insere(F); printf("Lidos %d nodes a direita de '%s'\n", rNodes, campo); return 1 + lNodes + rNodes; }; // nao tem campo antes desse () lNodes = insere(F); printf("Lidos %d nodes a esquerda\n", lNodes); rNodes = insere(F); printf("Lidos %d nodes a direita\n", rNodes); return lNodes + rNodes; case ')': if (p == campo) { printf("Node Terminal\n"); return 0; } else { *p = 0; printf("Lido ')' Node: '%s'\n", campo); return 1; }; // if() break; case 8: // tab case 10: // newline case 13: // return case 32: // espaco break; case EOF: if (p == campo) return 0; *p = 0; printf("EOF?: Ultimo Node: '%s'\n", campo); return 1; break; default: // apenas grava *p = (char)n; p += 1; break; }; n = fgetc(F); }; // while() printf("Final em insere()\n"); return 0; }; // insere() Podia ser mais curta. mas deixei muitas mensagens e coisas supérfluas E como seria main() para testar um desses? Pode ser algo bem simples, como int main(int argc, char** argv) { if (argc < 2) { printf("\nUse: programa nome_do_arquivo\n"); return -1; }; FILE* F = fopen(argv[1], "r"); if (F == NULL) return -1; printf("Inseridos %d Nodes\n", insere(F)); fclose(F); return 0; }; Basta chamar na linha de comando e passar o nome do arquivo que tem os dados da árvore, como se faz desde os '70. O programa "todo" É bem simples. Como eu disse no primeiro tópico, é importante escrever em torno dos dados. Esse é o trecho mais importante case '(': if (p != campo) { *p = 0; printf("-> Node: '%s'\n", campo); lNodes = insere(F); printf("Lidos %d nodes a esquerda de '%s'\n", lNodes, campo); rNodes = insere(F); printf("Lidos %d nodes a direita de '%s'\n", rNodes, campo); return 1 + lNodes + rNodes; }; E veja como dá pra associar de imediato com a tal notação: ao ler um '(' se eu tenho um campo então eu chamo insere() para a esquerda e para a direita e retorno a soma dos dois mais 1 claro, já que a raiz também é um nó... Pense nisso. Na prática basta trocar os printf() pelas chamadas às rotinas que inserem na árvore e usar um percurso qualquer e terá as respostas do enunciado. Eu preferi não escrever aqui. Não me culpe se tiver algo errado. Não testei quase nada. Mas acho que não tem.
  13. arfneto

    C++ Erro no printf C++

    int a, b, c printf("Vamos Realizar um calculo\n"); O compilador consegue avaliar que 'a' e 'b' são int, porque as vírgulas separam as declarações. Mas para 'c' não dá pra ter certeza e fica indefinido. Mas ao encontrar o printf() entenda que printf() é uma função e retorna o número de bytes enviados para a saída. Assim o compilador imagina int a, b, c = printf("Vamos Realizar um calculo\n"); Como o mais provável, e assim explica o porque faltou o '='. E como 'c' não foi declarado, ao final do escopo ele vai claro se queixar da referência a 'c' por causa dessa linha c = a + b; adicionado 2 minutos depois Apenas o fim. No C Standard ISO/IEC 9899
  14. Não consigo entender o que você quer dizer e onde isso está associado a qual estrutura de loop. Eis o texto Você entendeu o que eu expliquei sobre não usar pilha ou recursão? Se está determinado a não usar estude o algoritmo chamado Morris Traversal como descrito aqui Ou entenda que pode chamar sua rotina de novo a cada '(' que encontra, passando apenas o lado em que está. A tal notação textual como escrita aí é preOrder, primeiro o nó, depois a esquerda e depois a direita. Apenas siga a onda
  15. Não é apenas uma questão estrutural. O compilador precisa dos protótipos para poder encontrar as declarações das funções e nem sempre é possível colocar todas numa ordem em que compile sem protótipos... Então o melhor é ir declarando, se possível em alguma ordem objetiva tipo a alfabética... O lance dos comandos eu acho que não entendi. Dada uma condição C e um loop while(C){S} ela é igualzinho a um for (;C;){S} que por sua vez equivale a {S}while(C){S} então a menos do fato do {S} rodar ao menos uma vez no terceiro caso vai dar na mesma. Eu acho que no caso da sua notação podia apenas chamar de novo o processo a cada novo nível, recursivamente ou em loop. Acho já te disse isso: acho que sem recursividade e sem uma pilha vai ficar difícil tratar isso. Árvores são assim.
  16. Inclua os protótipos no início de seu arquivo: int alturaArv(No*); void Imprimir(No*); void Imprimirpos(No*); void Imprimirpre(No*); void inserir(ArvBinaria*, int); void InserirDir(No*, int); void InserirEsq(No*, int); No* inserirnew(No*, int); int tamanho(No*); Basta copiar isso para depois das structs. Ou vai ter sempre para compilar. E deixe main() no início sempre. Facilita para você e para os outros. Porque inserir Dir e Esq? O programa desse modo:
  17. typedef struct cadastro { char descricao[50]; int categoria; int quantidadeEstoque; int categoriaLivro; int categoriaResvistas; int caixa; } Cadastro; //Possuir um menu de opção. (Funcionando) No futuro considere a sugestão de nunca escrever o menu antes de terminar o programa. Só faz você perder tempo. Porque tem 3 campos para categoria? Porque não escreveu uma função simples desde o início para listar TODO o cadastro do jeito que está? Como controla o tamanho do cadastro? Porque não criou uma estrutura tipo itens e colocou todos dentro do cadastro? Faria sua vida mais fácil Poderia declarar apenas Cadastro loja; loja.N = 0; // vazio no início Se escrevesse typedef struct { char descricao[50]; int categoria; int quantidadeEstoque; int categoriaLivro; int categoriaResvistas; int caixa; } Item; typedef struct { int N; Item item[MAX]; } Cadastro; E isso? Para que um loop que só lê um produto? Está errado: produto é do tipo Cadastro[] certo? Qual o índice? Sim, devia ser i só que usou apenas 1 no loop então de nada serve... Pense nisso. Você quer ler produto e variar i Para acessar produto aí dentro precisa de -> e não ponto já na função recebeu apenas o endereço. adicionado 4 minutos depois Esqueci de comentar sobre listar por caixas. Não precisa inventar nada: apenas escreva uma função tipo compara_obras que compara duas obras e compara os registros, retornando 1 se a caixa da segunda obra é maior que a caixa da primeira, 0 se for a mesma caixa e -1 se a caixa do primeiro for menor. Ai você chama sort() e diz pra usar essa função que escreveu. Ela vai classificar seu cadastro e retornar as obras separadas.
  18. Esse é outro problema, imagino. Quando voltar a esse problema recomendo que leia com atenção o que expliquei no tópico #9 porque vai economizar seu tempo. Vou te mostrar um programa de exemplo que escrevi para outro propósito mas pode ajudar. Para o seu arquivo ele mostra Saída E depois É bem simples e escrito em C mesmo O programa completo: adicionado 0 minutos depois É só um exemplo para um caso bem simples
  19. arfneto

    C++ Erro no printf C++

    ';' não é um finalizador de linhas. Isso seria o '\n' mesmo. É perfeitamente legal escrever int a , b, c ; por exemplo. E também é perfeitamente legal escrever int i; int j; int k; Ligeiramente off-topic Não é boa ideia declarar mais de uma variável por linha, por várias razões. Isso está em vários guias de recomendação, em várias empresas e mesmo no C++ Core Guidelines. E sempre inicialize suas variáveis. Se usasse uma por linha provavelmente não teria esquecido do ; por exemplo porque as 3 declarações seriam iguais: int a = 0; int b = 0; int c = 0;
  20. WMI é muito poderosa. E em scripts é o máximo, em especial porque você pode chamar de dentro do Office em minutos e extrair praticamente qualquer coisa do sistema. Windows é totalmente instrumentado. Tem medidores e estruturas para tudo. E você pode criar seus próprios provedores para seus sistemas Mas tem uma versão nova, Windows Managed Infrastructure (MI) descrita em https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wmi_v2/windows-management-infrastructure e não seria certo não dizer.
  21. "engessado" como em gesso. Acho que é apenas um programa ruim. Não envolve assim muita coisa, como a escola ou o método... Talvez seja um sinal de que eu tenho razão int obter_amostra(dado_t *dado); float obter_temperatura(dado_t *dado); int obter_hora(dado_t *dado); Não sei o que dizer. Esses genericamente se chamam getters e até alguns IDE geram automaticamente dependendo da linguagem, como o Idea para java e o CLion para C e C++. Nada acrescentam ao seu modelo. E vão absolutamente na contra mão da abstração. Se pensar no último modelo que te expliquei, todos os campos são iguais e abstratos. Sequer o nome é salvo. Vou tentar explicar com um exemplo: Um csv de 4 campos e 500 registros vão vir de um arquivo com 501 linhas a partir da primeira você gera um vetor nomes[4] e um vetor registro[500][4]. Essa é a realidade. quando quer ler o terceiro campo do registro 350 saberia que o nome do campo está em vetor[2] e o valor em registro[349][2]. A realidade de novo. Enquanto não for operar com os dados você não converte nada. Apenas texto. Se fosse ganhar um premio ou um dinheiro ou fosse importante pra você no futuro, seria trivial anexar um vetor de formatos, dizendo se o campo é char, string, int, float, ou se requer um tratamento especial. Apenas mais um vetor[4], um formato[4] que teria a descrição. Ex: 1 para char 2 para string 3 para int 4 para float. Se fosse ganhar mais um premio, ou mais um dinheiro, ou quisesse apenas sossego por ter um tratamento genérico para CSV, podia usar o 0 no vetor de formatos e declarar um vetor de funções em C. E assim quando o cara tivesse um campo que precisava de um tratamento especial apenas escrevia por exemplo 0 no vetor de formatos e no seu programa você chamaria if ( !*formato[2] ) valor = (*rotina[2])( registro[349][2]); // se o campo 2 tem um tratamento especial, por exemplo ir no banco de dados e identificar a placa do veiculo que trouxe o pacote referente ao registro 350, alguem ja escreveu uma funcao para fazer isso e passa o endereco dela no vetor. O programa chama, o valor retorna e a vida segue. C foi escrita para esse tipo de problema se o campo 2 tem um tratamento especial, por exemplo ir no banco de dados e identificar a placa do veiculo que trouxe o pacote referente ao registro 350, alguém ja escreveu uma função para fazer isso e passa o endereço dela no vetor. O programa chama, o valor retorna e a vida segue. C foi escrita para esse tipo de problema Funciona bem. E em C não é difícil. Vou ler o seu programa logo mais adicionado 11 minutos depois tentei ler o programa mas vi que postou só trechos. Não ajuda muito. As suas declarações estão certas. Para acessar apenas precisa do endereço do CSV. Sua abstração como eu já disse não está muito boa. E por isso está tendo mais trabalho. Um csv deve corresponder a um modelo abstrato CSV completo. E eu já te expliquei porque. Não deve se apegar a um modelo só porque veio do livro ou professor ou do livro do professor. Espero que tenha entendido como o modelo pode ser mais útil, se leu o que escrevi acima e os outros posts. Para acessar algum campo precisa do número do registro e ele será dado[N] claro. Seus getters não vão servir de nada. Só atrapalham. E se fossem 30 campos? E se fossem os dados de 300 sensores? Ia mesmo escrever uma função praticamente igual para cada um? Não, não ia. De todo modo basta escrever obter_amostra(dados[N])
  22. Mas não respondeu sobre a notação e o while() desistiu de implementar aquilo? Que quiz dizer com o lance do "while" E se nem tem um código completo fica difícil de dizer algo.E nada sobre os insert(). Acho que devia focar na notação e na recursividade ou na pilha. Vai precisar de um dos dois funcionando se quer usar uma árvore. É muito mais difícil sem isso. Acho que não devia insistir
  23. Quer dizer que não conseguiu ler a tal "notação textual"? Não entendi porque tem uma função para inserir a esquerda e outra a direita. E tantas inserir() afinal. Seu código não parece completo. Veja o final do case 2 acima... main() deve sempre ser a primeira função de seu programa. Em geral em outro arquivo
  24. Seu professor perdeu uma oportunidade de criar uma abstração importante. Muito da aparente dificuldade desse programa vem de uma abstração pobre, quase inexistente, de um arquivo csv. Quanto mais perto da realidade o modelo estiver mais simples fica o programa. Um arquivo CSV é uma matriz MxN de campos, um delimitador, um vetor de N posições se ele tiver um header --- e nesse caso pode descontar essa linha e ficar com Mx(N-1) no vetor de dados. Um char* com o nome do arquivo original, porque pode ser importante. Assim ele fica abstrato e pode ser reconstruído no disco a qualquer momento. Isso é importante. O arquivo não pode morrer dentro do programa ou não vai servir pra nada. O outro parâmetro que falta é saber se na entrada os campos tem ou não aspas ou algum delimitador determinando os campos, como aspas ou apóstrofes. E assim sabe se vai gerar na saída. Porque muitas vezes o arquivo vem com os campos entre aspas para proteger espaços ou caracteres de controle ou coisas como vírgulas dentro do campo. EXEMPLO LOAD DATA INFILE 'c:/tmp/discounts.csv' INTO TABLE discounts FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; Esse comando acima é o que se usa para importar um arquivo csv em um bando de dados MySQL. E dá pra entender do que estou falando. Tem algo semelhante para um milhão de outros programas. E essa abstração de um bloco de parâmetros, argc/argv, existe para todos os programas em Windows ou Linux ou Unix ou OsX então deve ser importante, certo? E então deve ser uma boa solução já que está em uso desde os '70. Como o CSV. Uma outra abstração importante mais recente seria JSON. Ou XML.
  25. @mandalori Entendeu o que eu expliquei? Conseguiu aplicar em seu problema?

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!