Ir ao conteúdo
  • Cadastre-se

arfneto

Membro Pleno
  • Posts

    6.212
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. 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.
  2. 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.
  3. 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?
  4. 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
  5. 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
  6. 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
  7. 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.
  8. @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.
  9. 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
  10. 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.
  11. Em geral os números são as primeiras palavras a serem programadas nas bibliotecas de speech rec. E "sim", "não", "OK" e CANCELA ... Então talvez fosse mais simples usar os números mesmo... Não entendo que ligação possa ter entre o modo como um comando é reconhecido e a implementação. No final tudo vai acabar em [posicao]. Se estiver livre ocupa. Se venceu acabou. E a cor é a cor da vez. Ou não?
  12. Está um pouco longe de funcionar ainda. O compilador não entende contexto. Você precisa repetir a condição completa em cada teste com @devair1010 mostrou acima. Recomendo sempre usar parenteses e não confiar na memória da precedência de operadores. Mais seguro e mais claro. Para testar as combinações de vitória com um jogo assim simples, talvez você mais fácil você simplesmente salvar as combinações vencedoras. O grupo todo. E testar de uma vez. Nem sei como fazer isso. Qualquer estrutura serve. Imagine uma string com letras e 'R' para vermelho, 'G' para verde e '.' para livre e um vetor de strings com as combinações vendedoras, por exemplo. Como tanto faz qual a cor para alguém vencer, coisas como combinações de vitória led 123 /456 /789 /147/ 258 podem ser expressas por const char endGame[5][10] = { // combinacoes de fim de jogo " XXX......", " ...XXX...", " ......XXX", " X..X..X..", " .X..X..X.", }; Dois vetores para o jogo é talvez exagero. Talvez algo associado à representação acima fosse mais fácil de entender e por consequência programar...
  13. if (idade<=10) printf ("O %s devera pagar R$30,00",nome); else if ((idade>10) && (idade<=29)) printf ("O %s devera pagar R$60,00",nome); else if ((idade>29) && (idade<=45)) printf ("O %s devera pagar R$120,00",nome); No trecho acima você vê que está propagando uma redundância em todos os testes. Qual chance de uma idade que não é <- 29 ser > 29? Total. Ela não tem opção. Não precisava testar 2 duas condições a cada vez. O limite inferior já foi testado. E fica difícil, mesmo num programa tão pequeno, descobrir que ele tem 6 pontos de saída. Essa não é uma boa prática. main() é uma função, e ao retornar encerra seu programa. O normal. Então você podia ter escrito algo assim if (idade < 10) { printf("O %s devera pagar R$30,00", nome); return; }; if (idade <= 29) { printf("O %s devera pagar R$60,00", nome); return; }; if (idade <= 45) { printf("O %s devera pagar R$120,00", nome); return; }; if (idade <= 59) { printf("O %s devera pagar R$150,00", nome); return; } if (idade <= 65) { printf("O %s devera pagar R$250,00", nome); return; }; printf("O %s devera pagar R$400,00", nome); return; Que talvez concorde que é muito mais legível. Ao encontrar o fim de uma função retorne explicitamente. É mais simples e seguro. E nesse caso nem teria tido o problema com o teste de <10 que te custou umas horas. Outro ponto: essas { } que ficaram a mais no meio do programa às vezes não são assim inofensivas. Em C++ por exemplo elas encerram o tempo de vida (scope) de todas as variáveis que estejam declaradas dentro do bloco { } e isso se você não fez de propósito pode ser desastroso em seu programa
  14. sao duas partes bem distintas. consegue escrever a segunda ou a primeira apenas? Como por exemplo apenas criar o arquivo com umas linhas a toa?
  15. mas qual seria o problema? adicionado 0 minutos depois o problema que esta tendo para resolver isso... tem um programa que crie os vetores? consegue escrever um que cria um arquivo?
  16. algum detalhe sobre qual o problema?
  17. sao servicos eletronicos, bibliotecas virtuais que a escola assina e da acesso aos alunos. voce tambem pode assinar por sua conta. servicos como esse https://www.oreilly.com/ que é o melhor do mundo talvez. pode assinar um trial de graca eu acho
  18. apenas troque o 13 por default não tem acesso a um, manual? um site? Seu curso não tem (assina) uma biblioteca virtual? Muitas escolas tem isso case 11 : mes=11; printf ("O mes selecionado foi Novembro"); break; case 12 : mes=12; printf ("O mes selecionado foi Dezembro"); break; case 13 : printf ("O mes selecionado nao existe"); break; default: // outros casos break; // so isso em https://www.tutorialspoint.com/cprogramming/switch_statement_in_c.htm por exemplo
  19. não há um ponteiro para o endereço 35. veja a planilha acima no caso em 35 ESTÁ um ponteiro. Veja a coluna C da planilha acima e vai ter um exemplo
  20. certamente. E porque não escrever claramente o que é o que no desenho? Espaço havia. Não é preciso abreviar tanto. O cara podia ser mais caprichoso no enunciado. Legendas por exemplo adicionado 1 minuto depois E não faz diferença se está em hexadecimal, octal ou binário ou qualquer outra base para a questão adicionado 9 minutos depois Algo assim serviria: p é um ponteiro para int, está alocado em 0x150 e o conteúdo é 0x800 e lá está 0x1500
  21. Se o enunciado esteja correto Então a resposta (errada) tem que ser A ou C porque são mutuamente exclusivas. A julgar pelo desenho, que não é assim muito formal: não tem legendas claras sobre o que é o que estar dentro de um retângulo ou fora dele não 'assim uma definição terminar por H não é assim uma definição... Mas sugere que no endereço 35H está um ponteiro p o valor de p é 150H ou seja p aponta para 150H em 150H está o valor 1500 que é o valor apontado por p e assim A está errada
  22. O operador de comparação é '==' e não '='. Esse último é reservado para atribuição...
  23. Não entendi o que quer dizer. Seu curso tem um livro-texto? uma apostila? Um manual? O comando em questão, switch() tem uma cláusula default: com esse propósito. Apenas troque o 13: por default:
  24. ajudaria se tivesse mostrado o programa...

Sobre o Clube do Hardware

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

Direitos autorais

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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!