Ir ao conteúdo
  • Cadastre-se

arfneto

Membro Pleno
  • Posts

    6.252
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc, char** argv) { union { float valor; unsigned char bytes[4]; } u; unsigned int N = 0; FILE* file = NULL; file = fopen("teste.txt","w"); u.valor = 719877; N = fwrite((void*)&u, 4, 1, file); printf("Gravou float: %d * %d bytes\n", N, sizeof(float)); N = fwrite((void*)u.bytes, 1, 4, file); printf("Gravou byte a byte: %d bytes\n", N); fclose(file); file = fopen("teste.txt", "r"); float outro = 0; fread(&outro, 4, 1, file); printf("Leu um float: %f\n", outro); fread(u.bytes, 1, 4, file); printf("Leu em 4 bytes: %f\n", u.valor); printf("byte a byte: %X %X %X %X\n", u.bytes[0], u.bytes[1], u.bytes[2], u.bytes[3] ); fclose(file); printf("Lendo arquivo original\n"); file = fopen("arquivo.txt", "r"); unsigned char buffer[256]; N = fread(buffer, 1, 256, file); // le 240 printf("Leu %d do arquivo original\n", N); for (int i = 220; i <= 236; i += 8) { printf("%04d : %02X %02X %02X %02X %02X %02X %02X %02X\n", i, buffer[i], buffer[i + 1], buffer[i + 2], buffer[i + 3], buffer[i + 4], buffer[i + 5], buffer[i + 6], buffer[i + 7] ); }; // for() fclose(file); }; // main() Esse programa vai te ajudar a entender o que acontece: Ele grava de duas maneiras esse valor em um arquivo e depois lê e depois abre o arquivo original e mostra a parte que interessa Veja o resultado Gravou float: 1 * 4 bytes Gravou byte a byte: 4 bytes Leu um float: 719877.000000 Leu em 4 bytes: 719877.000000 byte a byte: 50 C0 2F 49 Lendo arquivo original Leu 256 do arquivo original 0220 : 00 00 00 15 00 45 AF C0 0228 : 50 00 00 00 00 00 00 00 0236 : 00 00 00 00 00 00 00 00 Estão invertidos como esperado, mas tem dois bits de diferença: de AF para 2F e de 45 para 49. Está certo sobre o valor? Sabe a máquina e a linguagem que gerou isso? O formato interno do float é o que importa aqui eu acho.
  2. trata-se apenas de inverter os bytes e as palavras. Você tem um arquivo que foi gerado assim? Big Endian? De que máquina? Sabe ler um dump ou usar um editor hex?
  3. Esse algoritmo é a implementação comum, como te mostrei. Apenas a transcrição da definição. No caso dos 3 métodos. Só muda o ponto da "visita", no caso aqui o momento onde imprime o nó. Veja um exemplo de código para os 3 tipos de percurso, em C, direto de https://www.tutorialspoint.com/data_structures_algorithms/tree_traversal_in_c.htm void pre_order_traversal(struct node* root) { if(root != NULL) { printf("%d ",root->data); pre_order_traversal(root->leftChild); pre_order_traversal(root->rightChild); } } void inorder_traversal(struct node* root) { if(root != NULL) { inorder_traversal(root->leftChild); printf("%d ",root->data); inorder_traversal(root->rightChild); } } void post_order_traversal(struct node* root) { if(root != NULL) { post_order_traversal(root->leftChild); post_order_traversal(root->rightChild); printf("%d ", root->data); } } Se acha que em seu cenário pode atingir mesmo algum caso limite e não quer usar recursão pode implementar todos os 3 usando uma pilha para controlar o percurso na volta. Não é complicado. O que importa para o aluno considerar é que: o inOrder trás os elementos em ordem crescente numa árvore binária. PostOrder visita os nós a partir "do fundo" e é a maneira segura de você apagar a estrutura ao final do programa, porque uma vez que você visitou o nó não vai mais passar por ele então pode chamar free() O percurso por nível é o que traz os elementos em ordem.
  4. arv* insere(arv* raiz, arv arvoree) { int i = 0; arv* a; if (i == NULL) { a = (arv*)malloc(sizeof(arv)); strcpy(a->nome, arvoree.nome); strcpy(a->email, arvoree.email); strcpy(a->endereco, arvoree.endereco); strcpy(a->dataAniversario, arvoree.dataAniversario); a->idade = arvoree.idade; a->esq = NULL; a->dir = NULL; Continua valendo tudo que eu escrevi, mas acho que ficou meio escondido isso no texto: Acabou de declarar como i = 0 e em seguida testa se é igual a NULL, que é... ZERO. void imprimePreOrdem(arv* raiz){ if(raiz != NULL) { printf("\nNome: %s\n", raiz->nome); printf("Email: %s\n", raiz->email); printf("Endereco: %s\n", raiz->endereco); printf("Aniversario: %s\n", raiz->dataAniversario); printf("Idade: %i anos\n\n\n", raiz->idade); imprimePreOrdem(raiz->esq); imprimePreOrdem(raiz->dir); } } Não é assim inusitado. É apenas o comum. Nada original. Veja por exemplo em https://www.tutorialspoint.com/data_structures_algorithms/tree_traversal_in_c.htm que Bem familiar não é. Não precisa nem abrir o site pra copiar o código Mas não é o caso de copiar. É a definição mesmo: Em preOrder você "visita" o nó na primeira vez que o vê e depois continua percorrendo a árvore, sempre começando pela esquerda. Não vem com muitas falhas. Considere que a recursão ocorre uma vez para cada nível. Com uma árvore binária como essa uma árvore de apenas 10 níveis já pode ter até 2^10 - 1 = 1023 elementos. Seria preciso uma entrada bem especial, algo como entrar com valores em ordem decrescente para cair no pior caso e deixar apenas um nó para cada nível para ter uma situação mais preocupante. Mas é válida a preocupação. E por isso em geral se tenta usar árvores balanceadas automaticamente para ir distribuindo os nós mais arrumadinhos para os dois lados em relação à raiz. Basicamente se faz isso usando rotação dos nós e mudando a raiz quando preciso, e mantendo a árvore "equilibrada".
  5. Ainda não entendi aquela parte, mas vendo seu programa tem algo que talvez você não tenha entendido mesmo nisso... Você vai criar uma classe cadastro. Ou uma struct como fez... mas.. struct cadastro { int cod; /* Código do solicitante*/ char solicitante[50]; /* Nome do solicitante*/ char cpf[11]; /* CPF do solicitante*/ char endereco[50]; /* Endereço do Solicitante*/ char email[50]; /* Email do Solicitante*/ char sexo[2]; /* Sexo do Solicitante (M)- Masculino e (F)- Feminino*/ char faixaetaria[2]; /* Faixa etária do solicitante*/ }; struct cadastro solicitante[MAX]; int topo; void inserir(); void excluir(); void listar(); void pesquisar(); void alterar(); int const MAXTAM=1000; int Frente, Tras; int Fila[MAXTAM]; void Fila_Construtor(){ Frente=0; Tras=-1; } Uma grande vantagem --- e a razão na verdade dessa linguagem ter sido criada --- é a facilidade de abstração. Isso quer dizer a simplicidade com que você cria um modelo no programa para representar a sua realidade. Você não fez nada. É como se estivesse programando em C ou FORTRAN. Essas funções que declarou depois são todas vinculadas ao cadastro. Está errado como escreveu. Pois é. C++ tem implementações de fila com todas essas funções já na biblioteca padrão. Imagino que não possa usar porque faz parte de seu enunciado escrever isso, mas é claro que pode escrever o programa usando isso e depois trocar pelas suas versões. Isso seria um caso simples de uma das propriedades mais importantes desse tipo de linguagem: o tal do encapsulamento. Isso quer dizer que de qualquer forma fila é uma outra classe de seu programa. E você deve usar isso. Toda uma geração de linguagens existe em torno desses conceitos, esse lance de programação orientada a objetos. Seu curso nunca teve uma introdução ao menos a respeito? Tem um enunciado mais preciso? Não está praticamente nada definido sobre as solicitações. De todo modo, considere esse exemplo e veja se entende a diferença entre o programa que fez, que é basicmente um programa em C, e esse: Um exemplo de cadastro: #include <iomanip> #include <iostream> using namespace std; class Cadastro { public: string nome; class Item { public: int cod; char solicitante[50]; char cpf[15]; char endereco[50]; char email[50]; char sexo[2]; // M F char faixaetaria[2]; }; int tamanho; int capacidade; Item** item; Cadastro(); Cadastro(int); ~Cadastro(); int Adicionar(const Item*); int Capacidade(); Item* Consultar(const int); Item* Consultar(const char* CPF); void define_nome(string); int Remover(const int cod); int Remover(const char* CPF); int Listar(); int Tamanho(); }; Um exemplo de fila: #pragma once #include <iomanip> #include <iostream> class Fila { public: class Solicitacao { public: int cod; int cod_solicitante; char descricao[50]; }; int capacidade; int tamanho; Solicitacao** sol; public: Fila(); Fila(int); ~Fila(); int Inserir(Solicitacao*); int Listar(); int Remover(Solicitacao*); int Tamanho(); bool Vazia(); }; Esse é um exemplo bem trivial, nem é muito certo. Mas imagino que dê pra entender as diferenças mais básicas: Um Cadastro tem itens As funções do cadastro se aplicam ao cadastro e ficam dentro dele Você pode pesquisar por nome ou CPF com rotinas iguais Uma fila tem solicitações As solicitações remetem a um cadastro As funções da fila fazem parte de cada fila Como escrever com isso int main(int argc, char** argv) { int res = 0; Fila fila(50); // solicitacoes Cadastro cadastro(10); // solicitantes Cadastro outros[2]; // exemplo cadastro.define_nome("oficial"); outros[0].define_nome("um outro"); outros[1].define_nome("mais um"); do { Alguem* um = cria_alguem(1); res = cadastro.Adicionar(um); delete um; cout << "Cadastro reporta " << cadastro.Tamanho() << " de " << cadastro.Capacidade() << " possiveis solicitantes" << endl; } while (res == 0); cadastro.Listar(); outros[0].Listar(); outros[1].Listar(); return 0; } Escrevi isso copiando do seu programa. Esse programa funciona e usa uma função cria_alguem() que devolve um item de cadastro novinho e com código crescente. E cria uma fila com tamanho e 3 cadastros e preenche um deles até lotar. Depois lista os 3 e encerra. E sabe que lotou porque Adicionar() retorna erro e aí sai do loop. E já é boa parte do seu programa num instante, porque em C++ é mais fácil criar modelos. Citando o criador da linguagem, um dos objetivos ao criar C++ era escrever uma linguagem com "abstrações de custo zero". Rodando esse programa: Criando Fila com capacidade para 50 solicitacoes Cadastro reporta 1 de 10 possiveis solicitantes Cadastro reporta 2 de 10 possiveis solicitantes Cadastro reporta 3 de 10 possiveis solicitantes Cadastro reporta 4 de 10 possiveis solicitantes Cadastro reporta 5 de 10 possiveis solicitantes Cadastro reporta 6 de 10 possiveis solicitantes Cadastro reporta 7 de 10 possiveis solicitantes Cadastro reporta 8 de 10 possiveis solicitantes Cadastro reporta 9 de 10 possiveis solicitantes Cadastro reporta 10 de 10 possiveis solicitantes Cadastro reporta 10 de 10 possiveis solicitantes cadastro 'oficial' com 10 de 10 possiveis solicitantes #001/010: Nome: Nome1001 SobreNome1001 CPF: 123.001.001-02 End: Rua R1001 01 Ap 2 #002/010: Nome: Nome1002 SobreNome1002 CPF: 123.002.002-03 End: Rua R1002 02 Ap 3 #003/010: Nome: Nome1003 SobreNome1003 CPF: 123.003.003-04 End: Rua R1003 03 Ap 4 #004/010: Nome: Nome1004 SobreNome1004 CPF: 123.004.004-05 End: Rua R1004 04 Ap 5 #005/010: Nome: Nome1005 SobreNome1005 CPF: 123.005.005-06 End: Rua R1005 05 Ap 6 #006/010: Nome: Nome1006 SobreNome1006 CPF: 123.006.006-07 End: Rua R1006 06 Ap 7 #007/010: Nome: Nome1007 SobreNome1007 CPF: 123.007.007-08 End: Rua R1007 07 Ap 8 #008/010: Nome: Nome1008 SobreNome1008 CPF: 123.008.008-09 End: Rua R1008 08 Ap 9 #009/010: Nome: Nome1009 SobreNome1009 CPF: 123.009.009-10 End: Rua R1009 09 Ap 10 #010/010: Nome: Nome1010 SobreNome1010 CPF: 123.010.010-01 End: Rua R1010 10 Ap 1 cadastro 'um outro' vazio cadastro 'mais um' vazio Apagando Cadastro com 0/ 10 solicitantes Apagando Cadastro com 0/ 10 solicitantes Apagando Cadastro com 10/ 10 solicitantes Apagando solicitante #1001 Apagando solicitante #1002 Apagando solicitante #1003 Apagando solicitante #1004 Apagando solicitante #1005 Apagando solicitante #1006 Apagando solicitante #1007 Apagando solicitante #1008 Apagando solicitante #1009 Apagando solicitante #1010 Apagando Fila com 0/ 50 solicitacoes E você vê que tudo acontece como previsto. E é muito mais simples que em C. OK, talvez em COBOL fosse bem mais simples escrever os relatórios Mas criou a fila os cadastros, preencheu um, e listou os 3 e apagou tudo.
  6. arfneto

    C Jogo Jokenpo em C

    sugiro programar aos poucos, uma coisa por vez. Pense bem na interface, algo simples porque não muda nada no jogo. Defina os comandos, pode usar uma letra ou simbolo pra cada um pense numa "tela" com umas 4 linhas apenas e vá repetindo na tela a cada ciclo, algo como uma linha com a tela as cartas do jogador e do computador, os pontos e o comando
  7. o que seria isso? não entendi. "direcionar um cadastro de uma pessoa para iniciar outro? Pode explicar de outro modo?
  8. Não, não é negativo. Como parte da iniciativa para evitar inserção de código malicioso --- hacking --- toda área de memória alocada para um programa é inicialmente zerada. Então idade entra com zero e fica assim para todo o sempre. Se prestar atenção ao programa, e ao que o autor disse e ao que expliquei acima, fica claro que o programa dele entrou no loop e apenas mantem menoridade com zero pela razão que você notou. Se idade fosse negativo o programa apenas mostraria os totais e terminaria, já que a condição do while não seria satisfeita...
  9. Se vai ler de um arquivo basta definir um formato. Se vai ler a cada execução deixe isso fora das funções e simplesmente leia um a um e mostre em seguida para ficar mais seguro. Chame as funções com os valores e mostre o resultado e grava no disco. Isso claro sugere uma função double area(double raio, double diametro); Para ter um resultado mais útil talvez devesse pedir o valor mínimo e máximo da espessura e um intervalo, e imprimir assim uma planilha de custos acompanhando a variação da espessura, certo? E isso sugere double peso(double area, double espessura); E as fórmulas das funções você já escreveu. Como a área aparentemente só é usada para calcular o peso talvez seja supérfluo usar duas funções.
  10. E que erro é que "ele dá"? Não entendi. Quanto ao seu problema da menoridade: while (idade >= 0) { Seu programa começa assim. Só que você não inicializou idade. Então como é uma área que acabou de ser recebida do sistema para alocar as suas variáveis está tudo zerado, certo? Inclusive a idade. Quando você entra no loop com idade igual a zero a primeira coisa que acontece é copiar if (idade < menoridade) { menoridade = idade; } já que menoridade é 200 e idade é zero. E aí nunca mais esse valor vai sair de lá. Só sairia com uma idade negativa, mas aí o programa termina porque saí do loop com essa condição. Então não é surpresa que menoridade seja sempre zero...
  11. Na verdade esqueci de deixar a vírgula. É a isso que me refiro: const char* margem[11] = { "", "", " ", " ", " ", " ", " ", " ", " ", " ", " ", }; Você pode deixar a última vírgula. Durante muito tempo não compilava. É uma liberalidade, porque o programador SEMPRE esquecia. E em programas que geravam código fonte era preciso ter esse tratamento especial para a última linha. Por falar em liberalidade, em C é perfeitamente válido inicializar vetores fora de ordem. E mesmo faltando índices. Algo como const char* margem[11] = { [ 4] = " ", [ 5] = " ", [ 6] = " ", [ 7] = " ", [ 8] = " ", [ 1] = "", [ 2] = " ", [ 3] = " ", [ 9] = " ", [10] = " ", }; Serviria sem problemas no programa acima. Veja que a posição 0 não foi inicializada. Em C++ não pode ser assim fora de ordem.
  12. Essa é uma solução mais formal. E elegante. Muito boa porque leva em conta a topologia da coisa: sempre vai imprimir 100 letrinhas em 10 linhas de 10 letras. Conforme muda o contexto imprime o espaço ou o asterisco. E o código reflete isso. Se você considerar o espaço apenas como alinhamento ainda seria formal, marginalmente mais eficiente e mais legível escrever apenas #include "stdio.h" int main() { const char* margem[11] = { "", "", " ", " ", " ", " ", " ", " ", " ", " ", " " }; int i = 0; int asteriscos = 0; printf("(A)\n\n"); for (i = 1; i <= 10; i += 1) { for (asteriscos = 1; asteriscos <= i; asteriscos += 1) printf("*"); printf("\n"); } printf("\n(B)\n\n"); for ( i = 1; i <= 10; i += 1) { for (int asteriscos = 10; asteriscos >= i; asteriscos -= 1) printf("*"); printf("\n"); } printf("\n(C)\n\n"); for (int i = 1; i <= 10; i += 1) { printf("%s", margem[i]); for (int asteriscos = 10; asteriscos >= i; asteriscos -= 1) printf("*"); printf("\n"); } printf("\n(D)\n\n"); for (int i = 1; i <= 10; i += 1) { printf("%s", margem[11-i]); for (int asteriscos = 1; asteriscos <=i; asteriscos += 1) printf("*"); printf("\n"); } return 0; } inserindo as margens onde necessário. Esse imprime exatamente como está no enunciado. Pela gramática da linguagem o if é seguido de um comando que pode ser segundo por um else e outro comando. E a definição de comando é essa: um comando simples termina por um ; ou pode ser um bloco delimitado por { }. Um if como esse abaixo seria um exemplo completo if (i == 0) {} else ; tanto ; quando { } são comandos válidos. Para retirar a necessidade do ; antes do else seria preciso aceitar o else como terminador de comando. Mas aí seria preciso decidir: ou else pode ser aceito como ; em qualquer comando ou seria preciso avaliar APENAS o else dentro do if para aceitar isso. E aí a gramática não seria mais genérica em relação aos comandos. Provavelmente não valeria a pena mudar tanto as coisas. Às vez se aceita alguma coisa assim para ajudar o programador, alguma liberalidade, como deixei aí no exemplo uma vírgula a mais antes da chave na declaração das constantes. Pra que não seja preciso o programador voltar lá se retirar do final da lista alguma coisa. Fica "feio" mas é útil. Mas no caso do else seria talvez muito trabalho porque iria mudar a avaliação de comandos no geral.
  13. A menos que seja visto como um desafio pessoal ou algo imposto, não faz sentido criar um programa para um único desenho. Compilar o programa para gerar algo já é algo esquisito: imagine ter que compilar o código para mudar uma curva no coraçãozinho... A cada curva nova. Quer desenhar um quadrado? Outro programa. Um triângulo? Outro programa. Talvez um programa para desenhar corações ao menos, que aceitasse parâmetros e aprendesse com o tempo. Ou o simples como eu disse: um programa que copia desenhos de um arquivo e aceite alguns parâmetros como cor e intensidade do traço. Que tal um programa plotter? Comandos: baixa a caneta levanta a caneta move a caneta numa direção muda a cor da caneta limpa o desenho imprime termina Original? nada original. Mas desenha qualquer coisa. Afinal um plotter é assim. E programas como o Turtle Graphics (para crianças) que rodava no Apple. Que Apple? o Apple II nos '70. Era assim também. Um plotter tartaruga para crianças desenharem na tela. Na tela verde, claro. E já não era original. Qualquer semelhança com o turtle do phyton é porque é a mesma coisa. Não sei porque o Brazilian Student citado não usou turtle para desenhar o meigo coração, já que basta usar import turtle e começar a desenhar e foi feito para isso afinal. E pode ler de arquivos. E foi feito para crianças. turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) Exemplo para desenhar um quadrado em Desenhando um quadrado com a tartaruga em Phyton
  14. Entendo. Então sabe que imprimiu 3 vezes a mesma coisa. Porque não postou o código? Entenda que cada bloco desses é só uma letra entre parenteses seguida por uma lista de 10 linhas de 10 letrinhas. E cada letrinha pode ser espaço ou asterisco. Só isso. Para imprimir os asteriscos você DEVE usar um printf("*"); para cada um. O resto você pode fazer como quiser. E para ver como fazer é só contar de 1 a 10 para as linhas e dentro das linhas acertar o número de espaços em cada linha, o que varia de um em um. É opcional imprimir os espaços à direita já que ninguém vai ver mesmo . E os espaços a esquerda vão alinhar os asteriscos. Ou aumenta um a cada linha ou diminui um a cada linha, dependendo do padrão. Qual a sua dificuldade?
  15. A inclusão não é automática. Facilita muito a vida do programador, porque você pode se preparar para os limites em uso para a plataforma onde o código está sendo compilado, e assim se pode escrever um código mais genérico. Não por acaso as rotinas da biblioteca padrão usam isso, e assim se você inclui stdlib em seu programa vai ter acesso às contantes em limits.h. E claro que isso vale para qualquer outra biblioteca que por alguma razão inclua limits.h porque assim são os #include Programar sem isso quer dizer que você precisa saber de outro modo o valor disso em cada programa. Coisas simples como usar INT_MAX como um valor padrão para um int que vai guardar um mínimo ou INT_MIN no caso contrário teriam que ser improvisadas de outro modo. limits.h é o simples: Você usa as constantes e o compilador põe o valor. Integer de 16 bits? 32? 64? 36? Tanto faz, por exemplo.
  16. Acho que eu te expliquei isso num post acima: o arquivo lib não vai ter nada exceto uma estrutura vazia para contentar, digamos, você mesmo. Colocar códigos no header é muito comum, por outro lado, quando você usa C++ e templates, porque fica quase impossível separar header e código e você acaba usando apenas o .h. É assim, Mesmo que eu ache que não é. Ou você. E são as tais bibliotecas. Num .h com código. Nunca pensei nisso. Não estou buscando dar uma melhor resposta. Só estou tentando ajudar explicando como funciona isso. Aqui não é o Stack Overflow, ou o discord ... Onde as pessoas escrevem em busca de ranking ou pura polêmica mesmo. Como queira. Eu te expliquei @Mauro Britivaldo. Se acha que mesmo vazia deve ser distribuída, ok: continue fazendo isso em seus projetos. Instrua seu pessoal, seus clientes e seus alunos e o forum.
  17. arv* insere(arv* raiz, arv arvoree) { int i = 0; arv* a; if (i == NULL) { a = (arv*)malloc(sizeof(arv)); strcpy(a->nome, arvoree.nome); strcpy(a->email, arvoree.email); strcpy(a->endereco, arvoree.endereco); strcpy(a->dataAniversario, arvoree.dataAniversario); a->idade = arvoree.idade; a->esq = NULL; a->dir = NULL; Não tive tempo ainda de olhar o seu programa, vou ver daqui 1h ou duas. Uma coisa que posso dizer agora é que essa maneira de escrever é muito arriscada para desenvolver e testar. E lerda. E nada produtiva na hora de usar. Isso também void busca(arv nomeBusca, arv* raiz) { printf("\nInsira o nome de busca:\n"); gets(nomeBusca.nome); if (strcmp(nomeBusca.nome, raiz->nome) == 0) { printf("\nNome: %s\n", raiz->nome); printf("Email: %s\n", raiz->email); printf("Endereco: %s\n", raiz->endereco); printf("Aniversario: %s\n", raiz->dataAniversario); printf("Idade: %i anos\n\n\n", raiz->idade); } else { E declarar assim struct arvore { char nome[100]; char email[100]; char endereco[250]; char dataAniversario[10]; int idade; struct arvore* esq; struct arvore* dir; }; Prefira sempre algo assim por exemplo: struct _carga { char nome[100]; char email[100]; char endereco[250]; char dataAniversario[10]; int idade; }; typedef struct _Carga Carga; struct _arvore { Carga* dados; Arvore* L; Arvore* R; }; typedef struct _arvore Arvore; Arvore* insere(Carga* dados, Arvore* arvore); Arvore* preOrder(Arvore* arvore); Arvore* inOrder(Arvore* arvore); Arvore* postOrder(Arvore* arvore); A razão: a tal struct Carga, que tem os dados, pode ser qualquer coisa. Em geral se declara mesmo como (void*). E você não usa mexe mais nisso a menos que ache um erro. O percurso pode receber um suposto endereço de arvore e ir devolvendo os nós conforme passa e aí você imprime. Você não imprime dentro da rotina de percurso, pelo mesmo motivo: percorrer a árvore é sempre igual. Você pode ter várias delas em seu programa. Você escreve isso, testa, coloca em um arquivo arvore.c e escreve um header arvore.h e nunca mais mexe nisso. Do modo como escreveu, e que é o normal, você resolve no máximo um problema. E demora. adicionado 17 minutos depois @Cristian Leoncini que pretende com essa variável i ? Podia comentar seu código um pouco. Se está contando com ela nas outras chamadas você tem um problema aí... O que era pra ser isso? Você precisa mesmo usar uma árvore para isso? Uma lista parece mais prático. Trata-se de um enunciado?
  18. Entendo que goste de criar polêmicas @Mauro Britivaldo, mas uma biblioteca é exatamente isso: uma fonte de referências. E referências "constantes". Por isso se chamam bibliotecas com o mesmo sentido daquelas cheias de livros de outras eras. Se você criar um limits.c e incluir o limits.h vai gerar um arquivo limits.o de código, vazio mas vai ter alguma estrutura. E ai você provavelmente pode usar o ar ou o lib e criar uma biblioteca .lib ou .o e usar em seus programas, mesmo ela não tendo nenhum dado efetivamente dentro dela exceto o que está no header. Aí você vai achar que é de fato uma biblioteca, por ter um arquivo .lib ou .a associado, só que vazio. Não é a decisão do autor do tópico, ou minha ou sua. Apenas é a biblioteca de constantes limits.h. Muitas vezes a gente escreve isso em projetos: bibliotecas apenas com definições
  19. Não, @Mauro Britivaldo. limits.h é uma biblioteca de constantes e está totalmente contida no header. Talvez não tenha lido o que eu expliquei acima e visto um exemplo do header
  20. De um ponto de vista mais amplo, qualquer header é uma biblioteca, uma fonte de referência. Eis limits.h em minha máquina: // // limits.h // // Copyright (c) Microsoft Corporation. All rights reserved. // // The C Standard Library <limits.h> header. // #pragma once #define _INC_LIMITS #include <vcruntime.h> #pragma warning(push) #pragma warning(disable: _VCRUNTIME_DISABLED_WARNINGS) _CRT_BEGIN_C_HEADER #define CHAR_BIT 8 #define SCHAR_MIN (-128) #define SCHAR_MAX 127 #define UCHAR_MAX 0xff #ifndef _CHAR_UNSIGNED #define CHAR_MIN SCHAR_MIN #define CHAR_MAX SCHAR_MAX #else #define CHAR_MIN 0 #define CHAR_MAX UCHAR_MAX #endif #define MB_LEN_MAX 5 #define SHRT_MIN (-32768) #define SHRT_MAX 32767 #define USHRT_MAX 0xffff #define INT_MIN (-2147483647 - 1) #define INT_MAX 2147483647 #define UINT_MAX 0xffffffff #define LONG_MIN (-2147483647L - 1) #define LONG_MAX 2147483647L #define ULONG_MAX 0xffffffffUL #define LLONG_MAX 9223372036854775807i64 #define LLONG_MIN (-9223372036854775807i64 - 1) #define ULLONG_MAX 0xffffffffffffffffui64 #define _I8_MIN (-127i8 - 1) #define _I8_MAX 127i8 #define _UI8_MAX 0xffui8 #define _I16_MIN (-32767i16 - 1) #define _I16_MAX 32767i16 #define _UI16_MAX 0xffffui16 #define _I32_MIN (-2147483647i32 - 1) #define _I32_MAX 2147483647i32 #define _UI32_MAX 0xffffffffui32 #define _I64_MIN (-9223372036854775807i64 - 1) #define _I64_MAX 9223372036854775807i64 #define _UI64_MAX 0xffffffffffffffffui64 #ifndef SIZE_MAX #ifdef _WIN64 #define SIZE_MAX _UI64_MAX #else #define SIZE_MAX UINT_MAX #endif #endif #if __STDC_WANT_SECURE_LIB__ #ifndef RSIZE_MAX #define RSIZE_MAX (SIZE_MAX >> 1) #endif #endif _CRT_END_C_HEADER #pragma warning(pop) // _VCRUNTIME_DISABLED_WARNINGS Como vê são apenas constantes. No caso da minha máquina basta apontar para o header e apertar F12 e abre direto a definição. Usando uma versão moderna de Visual Studio e Windows. No geral um header é a sua interface com a boblioteca. Lá estão estruturas, constantes e declarações de funções que estão estas sim em alguma biblioteca. E biblioteca é um tipo especial de arquivo, algo como um zip de código. No windows tem em geral a extensão lib e no Linux a extensão a. Porque escrever uma biblioteca? A razão é bem simples: você não tem por exemplo o código fonte de printf(), fopen(), strcmp() e coisas assim. Alguém escreveu isso e está disponível em sua máquina de alguma forma. Você não iria de fato querer compilar isso de novo em todos os seus programas que usam isso afinal. Então tem toda uma coreografia nos sistemas para isso funcionar. E é o que você já sabe: a versão compilada dessas coisas está em arquivos do tipo lib.a. e a especificação está em arquivos do tipo lib.h. Você inclui na hora de compilar o tal #include lib.h em seu programa. E na hora de compilar você ou o seu IDE especifica o local onde estão essas tais bibliotecas, digamos, stdlib.a memory.a e tal. Apenas por exemplo. Não estou dizendo que tenham esses nomes. Mas essa é a lógica. Nos seus programas Imagine que você tenha uma lista de 12 programas de estruturas de dados que usam listas em C. Aí você escreve uma versão bacana de listas com todas as funções normais e bem genéricas e tal. Claro que tem aquele exercício da lista de livros, da playlist, da fila do banco e tal. Mas todos usam lista. Se você for esperto vai logo escrever uma versão bem genérica e incluir a mesma em todos os seus programas. Mas vai compilar toda hora? Não, claro que não. Você pega um arquivo com todas as funções e apenas isso, Sem main() nada disso. Compila e ai usa um programa, tipo LIB no windows ou ar no Linux, que coloca isso numa biblioteca. E cria um arquivo .h com as estruturas e definições e tal. E nunca mais compila essas funções a menos que ache algum erro ou crie uma função nova. Para pesquisar procure por "static library" Veja esse exemplo em C++ se usa Windows. Também funciona em C. Apenas para entender a ideia https://docs.microsoft.com/pt-br/cpp/build/walkthrough-creating-and-using-a-static-library-cpp?view=vs-2019 adicionado 3 minutos depois Ou isso
  21. Essa é uma coleção de constantes. Não tem assim um "funcionamento" e apenas "publica" constantes. Veja no seu compilador o exato conteúdo para sua plataforma.
  22. @jcsomavilla Dois pontos não definem dois vetores, mas seu programa está de acordo com o enunciado inicial: tem a função, a struct, os ponteiros e tal. Mas antes de entregar sugiro consultar quem quer se criou esse enunciado. @Mauro Britivaldo bastante folclórico seu conceito e seu exemplo Note que o trecho que mostrou, até vou reproduzir aqui Não tem um sentido matemático e nem tem essa aspiração. Geogebra se define assim segundo eles próprios em geogebra.org. São ferramentas para aprendizado online. E você pode desenhar seus próprios grafos, E formas geométricas. E vetores. Como você talvez não tenha se importado em ler no desenho que postou vou ressaltar: no caso do desenho que enviou ele fala de vetor e é um comando do pacote e por isso está escrito lá Comando de Vetor e aquele texto só faz sentido porque está falando do comando na ferramenta em si: Comando de vetor e por isso o título. Sim, confiável para aprender online sobre vetores e grafos e geometria e todas as ferramentas que tem lá. Sobre vetores em si, acho que deve se atentar à extensa explicação que @isrnick tentou te dar. Mas citando GeoGEbra Veja que lá mesmo, falando do tal COMANDO VETOR, você pode aprender como desenhar um vetor, escolhendo.... o ponto inicial e o ponto final. Um vetor tem 3 atributos direção sentido módulo. Ou magnitude como prefere chamar @isrnick ou comprimento extensão ou qualquer nome que tenha essa acepção Pois é. "Vetor posição do ponto" seria o que fora do comando vetor da ferramenta vetor do GeoGebra? Posição do ponto envolve um sistema de coordenadas e... coordenadas. Apenas. Pode ser em latitude e longitude, coordenadas polares, coordenadas cartesianas ou o CEP da rua mais o número. "Evidente" seria uma afirmação exagerada. "Evidente para mim" já é adequado... "vetores do ponto B" seria o que na sua visão de matemática? "Um ponto é necessário para definir o vetor posição daquele ponto" é um conceito interessante. Sem o ponto afinal não haveria um ponto e aí não haveria como ter um vetor contendo aquele ponto e ficaríamos então sem o vetor e sem o ponto Talvez devesse considerar a matemática como tal. E o Geogebra como tal. definição de vetor Tenho formação por coincidência em matemática e achei bem curiosa essa noção de "vetor posição de ponto". Veja uma definição para estudantes sobre vetor na primeira página em https://brasilescola.uol.com.br/o-que-e/fisica/o-que-sao-vetores.htm Ou tente Usando o Google mesmo. E busque por algo que reforce a sua ideia.
  23. A solução usual é testar antes de dividir. definição divisão por zero não é uma exceção então você não tem muito o que fazer. Se fosse algo como um índice fora do tamanho de um vetor ou um erro ao alocar memória você poderia usar uma exception, um try/catch, algo assim. Mas divisã por zero é só isso. ficou claro que é uma apresentação
  24. Não faz diferença. Pode usar mesmo uma string, que é um vetor, e colocar as letras lá dentro como te mostrei. Pode usar uma matriz 3x3 claro, mas não vejo vantagem. Pode usar qualquer coisa com 3 estados --- livre, 1 e 2 --- e 9 células e estará bem.

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!