Ir ao conteúdo
  • Cadastre-se

arfneto

Membro Pleno
  • Posts

    6.252
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. "significam esses argumentos"... São ponteiros e sempre que possível const porque assim o compilador pode otimizar essas coisas já que uma vez escritos não vão ser mudados e saber isso é importante na hora de alocar memória. FILE* é o ponteiro para um arquivo quando vai se usar um...arquivo. Stream é um arquivo, como é o caso de stdin, stdount e stderr, os 3 arquivos sempre disponíveis para um programa em C, 0 1 e 2. Não TEM que ser const char* mas o fato de poder ser é importante.
  2. Você está indo por um caminho muito complicado para fazer isso. Sugiro pensar mais nos dados e o caminho das informações. ar1 arq2 arq3 e arq4 talvez não sejam nomes significativos para os arquivos. Use nomes significativos. O mais seguro pra você fazer é ler os arquivos na carga do programa e carregar o que tiver no disco. Todos eles. São vetores apenas afinal. Não misture entrada e saída com as estruturas em si. Só vai te atrasar. Depois de carregados os valores dos arquivos você controla tudo com simples índices para os vetores de estruturas. Ao final grava tudo. Se é um programa sério, você cria um arquivo intermediário onde você registra tudo que vai acontecendo. Tem gente que chama de log, de journal, sei lá. O objetivo é que se cair a força ou o programa cancelar você poder recuperar tudo. Escreva se tem interesse nisso. Vou ver seu programa depois
  3. Você precisa de um serviço para fazer isso. Um .BAT depende de um ambiente qua não vai existir sem uma sessão aberta. Não vai rodar sem um usuário ativo. Acho que precisa programar como um serviço ou usar algo que "envolva" seu programa para rodar como serviço. Tem umas ferramentas que fazem isso eu acho, run as a service. Já usei algo assim para rodar um servidor de mídia como serviço, mas não me lembro do programa.
  4. Sim. Você pode "transferir" a licença para outra máquina. No caso do OEM não, porque quem pagou por ela foi o fabricante. Ela vai junto com a máquina. E pode ser invalidada mesmo assim, se você trocar a CPU ou a placa-mãe.
  5. O USB estar como primário não muda nada nesse caso. Se está assim e você tem algo com boot numa porta USB vai carregar normalmente A identificação de CD/DVD não tem a ver com SATA e sim com o tipo de dispositivo. Você mudar no BIOS --- sim, BIOS é masculino como em Sistema Básico de Entrada e Saída que é o que significa a abreviatura --- e incluir o DVD na sequência de boot não muda nada. O sistema vai tentar achar algo assim para boot e não vai ter nenhum. Os discos SATA tanto o SSD quanto o HD vão estar na lista de discos e lá você tem uma opção de escolher por qual deles vai carregar o sistema. Se tiver quatro discos vai er lá 4 opções em Boot Sequence ou Boot Order ou sei lá. Cada fabricante usa uma nomenclatura. Portáteis em geral tem uma tecla que acessa isso, Boot Options e aparece na tela na hora do boot. F2 acho que nos Dell. F7 em outros ou F10. E lá aparece a lista dos discos. Mais prático que usar o setup. Qual a marca de sua máquina? No entanto em geral o que eu uso em máquinas assim, mesmo quando são discos com windows, é usar uma partição pequena e instalar o grub, o gerenciador de boot do linux. Acho que sabe que ele mostra um menu de sistemas para carregar e vão aparecer as instalações de Windows e Linux num menu e tal. Tem um timeout e umas opções. A configuração que eu uso é a que carrega sempre o último sistema usado, acho que no Ubuntu você configura GRUB_DEFAULT=true e coloca uma linha savedefault em todas as entradas de sistema na configuração em /boot/grub2/grub.cfg que você queira salvar. A instalação do grub em geral acha e cria uma entrada para todas as partições com Windows ou Linux nos seus discos e a lógica é que se eu estou usando Ubuntu e reinicio a máquina ela entra com Ubuntu de novo. Se era Windows volta com Windows. E se eu quero mudar o menu do grub fica na tela pelo tempo que eu determinei e é só usar as setas e trocar. E depois que eu trocar ela salva o nome do último porque todas as entradas tem o tal savedefault. Escreva se não entendeu do que estou falando.
  6. Sério? Entre com dois números: 100.000 e 100.001 vai falhar Entre com dois números: -2 e -3 vai falhar Eu te disse duas maneiras de resolver. Esta usando um #include "conio.h" para poder usar uma função dos anos 80 getch() que é a mesma coisa que fgetc(0) e não pode usar um #include "limits.h" para usar as constantes de que te falei e ficar seguro de vai funcionar? Ou mesmo ler o primeiro valor fora do loop, que é algo bem trivial --- eu acho. E não inicializou num, mesmo eu te mostrando que está errado? Então... está certo. adicionado 17 minutos depois if (num > 0) { if (num % 2 == 0) { pares++; } else { impares++; }soma = soma + num; }if (num == 0) { maiornum = num; menornum = num; num++; } else if (num == -1) { break; //Adicionando uma pausa no -1 para que o programa não use //-1 como menor numero digitado } else if (num > maiornum) { maiornum = num; } else if (num < menornum) { menornum = num; } Vendo melhor o programa, esse trecho está muito, mas muito confuso para um programa tão simples. A quantidade de if e else aí impressiona. E aquela "pausa" no meio apenas mostra que a leitura está sendo feita no lugar errado... Uma condição definitiva e que tem um resumo final deve ser testada no fim e não no começo do loop...
  7. scanf("%d", &n); scanf("%d", &n); printf("%4d%4d\n", n, n); Esse trecho é interessante. Qual o propósito de ler duas vezes a mesma variável? n = n; Esse trecho é mais interessante: Qual o propósito de atribuir o valor de n....... a n ? Uma maneira bem simples de fazer isso é simplesmente um loop: você pega um outro int e enquanto o original for maior que zero você dive por 10 w multiplica o outro por 10 e soma a unidade desse. Simples assim: original resultado 321 0 unidade: 1 10* 0 + 1 = 1 divide por 10 (divisao de int trunca o valor) 32 unidade 2 10*1 + 2 = 12 divide por 10 3 10*12 + 3 = 123 Quanto à segunda parte Esse enunciado é bobinho. Podiam ter escrito melhor. Uma função sempre ter retorno. E não tem nada a ver uma coisa com a outra. Uma função pode ou não ter argumentos passados por valor ou referência (ou os dois) e mesmo assim retornar algo. Passar por referência é o que faz no scanf() por exemplo, no seu programa. O & comercial prefixando a variável transfere o endereço. Do outro lado um parâmetro do tipo *int vai receber o tal endereço. Imagino que tenha claro visto isso na aula. E o operador * é usado para pegar o valor apontado pela variável... Exemplo Eis uma função assim int coisa(int*, int); Essa função coisa() recebe um ponteiro para int e um int. E retorna um int. Se ela for escrita assim: int coisa(int* um, int outro) { *um = *um + 3; return (*um + outro); }; Ela vai retornar um valor igual ao dobro do primeiro mais o segundo. E na volta da chamada terá dobrado o valor do primeiro... Assim esse trecho int valor = 12; printf("valor antes de chamar coisa() = %d\n", valor); printf("coisa() retornou = %d\n", coisa(&valor, valor)); printf("valor depois de chamar coisa() = %d\n", valor); mostra valor antes de chamar coisa() = 12 coisa() retornou = 36 valor depois de chamar coisa() = 24 Isto é só um exemplo. Nunca chame funções assim dentro de um print(). É pedir por problemas. Isso é o que precisa para resolver as duas partes, eu acho
  8. Você acabou de declarou num e não deu nenhum valor, e já testa no loop para ver se é diferente de -1. Não é uma boa prática. Coloque valores explícitos em todos os casos. e menornum? Tentou testar usando números negativos?... Aposto que não. Nesses casos, que são muito comuns, você tem duas opções: pode começar por ler um valor FORA do loop e esse vai ser o menor e o maior, certo? Afinal será também o único, o mais verde, o menos colorido, qualquer coisa, já que será o único. E a partir daí entra no loop até ler -1. Se o cara digitar -1 de cara está então tudo certo. Ou pode usar constantes que estão disponíveis para isso em limits.h. INT_MAX é o maior inteiro e INT_MIN é o menor então claro que int maiornum = INT_MIN; int menornum = INT_MAX; resolvem seu problema se colocados na declaração dessas variáveis...
  9. Para um novo problema poste um novo tópico e com um título significativo. Assim pode ajudar mais alguém.Eu não tinha visto... De um conjunto inicial de números lidos, só precisa de 4 valores total de primos maiores que 1000. Um int maior número digitado. Um int menor número digitado. Um int média aritmética dos primos. Um float, imagino Para calcular a média dos primos vai precisar também saber quantos leu, além de claro somar um por um. int total_primos = 0; int total_primos_grandes = 0; int maior = 0; int menor = 0; int soma = 0; Bastam essas variáveis. Não precisa de vetor ou de saber os números que passaram. Apenas leia os valores e mantenha atualizadas as variáveis. Ao final pode calcular a média direto no comando que imprime. Não precisa. Mas não pode usar nada que não tenha "aprendido " oficialmente?
  10. Seu enunciado diz que é pra parar quando a potência for zero. Já está resolvido. Pode ler a potência primeiro para não obrigar o cara a digitar um nome a toa quando quer terminar... deverá ser solicitado de cada veículo: o seu nome (Sim! Colecionador costuma dar nomes aos seus carros!), a sua potência (HP) e o seu preço de mercado. Sabe-se que será interrompida da solicitação de dados quando for digitado uma potência (HP) igual a zero. O enunciado não diz a ordem então leia primeiro a potencia...
  11. Está bem. vou ver se encontro algo adicionado 53 minutos depois void busca(arv nomeBusca, arv* raiz) { printf("\nInsira o nome de busca:\n"); fgets(nomeBusca.nome, 50, stdin); 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 { printf("\n\nPessoa nao encontrada\n\n"); }; // if() busca(nomeBusca, raiz->esq); busca(nomeBusca, raiz->dir); }; // busca() Essa acima é sua função de busca. Vamos imaginar que uma função de percurso percorre a árvore toda, certo? InOrder, PreOrder, PostOrder, Por Nível, qualquer um. Você escreveu 3 e imagino que tenha testado. Pergunta Porque a função de busca não é igualzinho a uma das 3 de percurso, por exemplo a InOrder? Tente achar na função acima onde ela retorna se não acha o cara... Quanto chegar nas folhas sabe quanto vai valer raiz->esq e raiz->dir? Vai valer zero e cancelar seu programa. É assim com as árvores. void busca(arv nomeBusca, arv* raiz) { printf("\nInsira o nome de busca:\n"); fgets(nomeBusca.nome, 50, stdin); if (strcmp(nomeBusca.nome, raiz->nome) == 0) Leu as coisas que te recomendei no meu primeiro post? Assim não está bom. Não misture leitura de valores ou impressão nas rotinas que manipulam a estrutura de dados. Sempre dá m#$%a. Não é esperto. E nesse caso muito menos: se busca começa lendo um valor você não pode testar busca com valores conhecidos para testar seu programa. E como busca() começa lendo e você chama busca() recusrivamente sabe o que vai acontecer? Sim, sabe porque já viu: vai ler de novo.... declare busca assim arv* busca(arv* nomeBusca, arv* raiz); Recebe um endereço e devolve um endereço, ou NULL se não encontrar o cara. Essa não é uma maneira boa de declarar arvores. Eu te mostrei uma maneira melhor no primeiro post. A maneira oficial, Devia ter alterado. É mais esperto. Uma opção, de novo: struct _arvore { _Folha* raiz; int niveis; char* nome; }; typedef struct _arvore _Arvore; Repare que a árvore tem um nome e um número de níveis que você usa em certos casos. E tem uma "folha" que é a raiz. Só isso. Uma folha struct _folha { _Carga* dados; char saldo; struct _folha* L; struct _folha* P; struct _folha* R; }; typedef struct _folha _Folha; Na folha é que estão os ponteiros. Porque? É mais fácil de programar. Tem o ponteiro para o "pai" que pode acelerar muito certas coisas na hora de navegar. Mas você não precisa usar. E tem um tal saldo que é o que a gente usa no caso de tentar balancear a árvore, como aquelas AVL citadas no enunciado. Claro que também não precisa usar. E os dados? Pois é: cada folha tem um ponteiro para os dados. Assim você pode usar a mesma árvore para qualquer coisa. É por isso que a gente usa computadores e programa algoritmos afinal: para usar depois.. Veja um possível registro de dados: struct _carga { char nome[100]; char email[100]; char endereco[250]; char dataAniversario[11]; int idade; }; typedef struct _carga _Carga; Sim, o do seu programa. Mas se na semana que vem seu professor vier com o clássico exercício da playlist ou aquele da biblioteca ou aquele da nota fiscal, você usa A MESMA ARVORE e não precisa nem compilar essa parte... As mesmas funções de busca, de percurso... A gente só programa essas estruturas uma vez. Listas, Pilhas, Arvores, Mapas, Dicionários, o que seja. Tanto que em geral essas coisas estão na biblioteca padrão. Todas. Em java, em Python em C++... Você só programa de novo se não servirem ou se achar um erro
  12. Melhor! Bem melhor! Alguém aqui do forum, acho que @devair1010 tinha me dito no ano passado que isso era de uma universidade do sul, mas eu não me lembrava mais. Sobre o seu programa: double x1,x2,delta; cin >> a >> b >> c; x1 = (((-b) + sqrt((pow(b,2) - 4*a*c)))/(2*a)); x2 = (((-b) - sqrt((pow(b,2) - 4*a*c)))/(2*a)); // Imprime os resultados if(delta >= 0){ cout<<fixed; cout.precision(5); cout << "R1 = " << x1 << Onde está aquela parte em que você calcula o valor de delta? Outro palpite, para você não perder tempo com esse tipo de programa em que você tem algum tipo de exemplo: Recortar e Colar. Veja // 1 a = 10.0, b = 20.1, c = 5.1; cout << "[a,b,c] = [" << a << ", " << b << ", " << c << "] (res= -0.29788, -1.71212)" << endl; // 2 a = 0, b = 20.0, c = 5.0; cout << "[a,b,c] = [" << a << ", " << b << ", " << c << "] (impossivel)" << endl; // 3 a = 10.3, b = 203.0, c = 5.0; cout << "[a,b,c] = [" << a << ", " << b << ", " << c << "] (res= -0.02466, -19.68408)" << endl; // 4 a = 10.0, b = 3.0, c = 5.0; cout << "[a,b,c] = [" << a << ", " << b << ", " << c << "] (impossivel)" << endl; Esses são os quatro testes do enunciado. Coloque isso antes de tudo e não seja paciente a ponto de ficar digitando para testar. Quando funcionar você comenta essa parte e envia o código. Mais simples. adicionado 16 minutos depois Espero que tenha entendido o que eu expliquei sobre usar os valores do enunciado antes de tudo. É algo que economiza muito tempo de quem está aprendendo. Ou talvez competindo. A fórmula que você está usando é um quociente e o denominador é (2a). Onde você testou para ver se isso é zero? Não testou. Claro que os caras vão testar e vai dar erro certo? Eles ainda foram legais e mostraram isso no exemplo do enunciado e nem assim você testou. Foi mal. Seu programa: Claro que se o cara digitar 0 seu programa já era. Não precisamos nem saber o que ele tenta calcular: Olha o 2*a depois da barra ... Isso quer dizer divisão por zero. Veja uma possibilidade. É o seu programa na verdade. Só digitei sobre o texto #include <iostream> #include <math.h> using namespace std; int main() { double a, b, c; double x1, x2, delta; //cin >> a >> b >> c; //a = 10.0, b = 20.1, c = 5.1; //cout << "[a,b,c] = [" << a << // ", " << b << // ", " << c << // "] (res= -0.29788, -1.71212)" << endl; //a = 0, b = 20.0, c = 5.0; //cout << "[a,b,c] = [" << a << // ", " << b << // ", " << c << // "] (impossivel)" << endl; a = 10.3, b = 203.0, c = 5.0; cout << "[a,b,c] = [" << a << ", " << b << ", " << c << "] (res= -0.02466, -19.68408)" << endl; //a = 10.0, b = 3.0, c = 5.0; //cout << "[a,b,c] = [" << a << // ", " << b << // ", " << c << // "] (impossivel)" << endl; // a formula termina em um quociente: 2 * a if (a == 0) { cout << "Impossivel calcular" << endl; return 0; }; // if delta = (b * b) - (4 * a * c); if (delta < 0) { cout << "Impossivel calcular" << endl; return 0; }; // if x1 = (-b + sqrt(delta)) / (2 * a); x2 = (-b - sqrt(delta)) / (2 * a); cout << fixed; cout.precision(5); cout << "R1 = " << x1 << "\n" << "R2 = " << x2 << endl; return 0; }
  13. Entendeu as coisas que te expliquei, em especial sobre a função insere()? Alterou o programa? Como está agora?
  14. Exemplo de Entrada: 1 4 1 2 4 5 9 6 7 8 9 0 0 Exemplo de Saída: 3 5 Tudo começa pelo exemplo errado. Era para ser Exemplo de Entrada: 1 4 1 2 4 5 9 6 7 8 9 0 0 Exemplo de Saída: 3 5 Só isso. São grupos de 2 linhas e a primeira tem o início e o final da sequência, números inclusivos a julgar pela saída. O intervalo é 1. O enunciado não está também muito bom. Então a primeira sequência seria 1234 e a segunda 56789. Para achar o número que está faltando --- e o enunciado deixa claro que só falta um --- basta ler os valores em um loop. Acho que dá pra imaginar que se a diferença entre um número e o anterior não for 1 você achou o número faltante: é o que você esperava ler. Era pra ser 5 veio 6 então... faltou o 5 Leu 0 termina. Nada mais. Um loop, um if.
  15. Podia mesmo postar o endereço do site ou ao menos a questão aqui para quem quer ajudar e não tem noção do que seja uri.
  16. Imagino que na solução que descartou conseguisse ao menos ler os conjuntos de 3 valores cada. caso 1: apenas vá contando os veículos e somando os preços em um totalizador. Como calcular a média? Ao final divida a soma pelo número de carros caso 2: já contou os veículos para poder calcular a média no caso anterior. Apenas conte cada carro que tem potencia > 200HP. Como calcular a porcentagem? Apenas divida o total contado pelo total geral e multiplique por... 100 caso 3: salve o nome do carro mais potente enquanto for lendo. Como mostrar? simplesmente imprima o valor ao final
  17. Talvez tenha. Fazia tempo que eu não lia nada sobre isso, acho que o formato "754" está bem estabelecido. Mas tem um exemplo aqui: http://www.edwardbosworth.com/My3121Textbook_HTM/MyText3121_Ch17_V02.htm Talvez tenha alguma biblioteca de conversão, veja em http://developer.ibm.com pode ser um bom começo. Mas o formato está bem documentado e não é complicado.
  18. Não, não poderia. Você declarou isso como int então é um valor integral, sem decimais. A divisão vai truncar o valor. Não pensou em testar? Algo como mostrar o resultado? int a = 268; printf("268, 268/100 %d %d\n", a, a / 100); Que mostraria 268, 268/100 268 2 Só uma linha afinal. if (centena == 2 || 4 || 6 || 8) { ... Aqui você tem um problema. Computadores não entendem contexto. Você não pode escrever isso. Ou melhor, pode mas não expressa o que você quer testar... if ( (centena == 2) || (centena == 4) || (centena == 6) || (centena == 8) ) {}; Isso é o que você quer testar. Não pode omitir a condição. adicionado 15 minutos depois if (centena == 2 || 4 || 6 || 8) { printf ("CENTENA PAR"); } Talvez seja o caso de explicar o que está escrito acima. O que está escrito para o compilador C. É uma questão de prova comum em C e operadores afinal. Em C 0 é falso. Qualquer outra coisa é verdadeira. if(2) é verdadeiro, if(4), qualquer coisa menos if(0) é verdadeiro. A expressão acima tem DOIS operadores: == e || == é avaliado antes de || 2, 4 ,6 e 8 são como eu disse verdadeiro if ( (centena == 2) || 4 || 6 || 8 ) printf ("CENTENA PAR"); Assim é como vai ser avaliado. Sempre use parenteses. Se centena for 2 a primeira expressão vai ser true. Mas como 4 é verdadeiro basta isso para (a OU b OU c OU d) ser verdade, certo? Então essa expressão é sempre verdadeira. O compilador deve ter dado um aviso que você não considerou... Veja o que diz no meu compilador: Pois é: constante não nula || constante não nula é sempre uma constante não nula...
  19. pode ser que só eu esteja lendo assim, mas se trata de dois pontos e um vetor no espaço. O primeiro ponto a ponta da flecha. O segundo a posição da maçã. O vetor a direção do tiro. Lembro extensa e folclórica discussão dias atrás neste forum tentando estabelecer que um vetor é definido por 3 coisas: módulo, direção e sentido.Pois é: o vetor indica a direção do tiro, que nesse caso é considerado retinho. E o sentido nesse caso é importante porque o cara tem que atirar na direção da maçã... Não adianta apontar certo mas para o lado errado. O módulo não importa. O cara vai acertar a maçã se os pontos A e M estiverem alinhados com o vetor D. Como se espera. Aqui entre nós a flecha tem mesmo cara de vetor com até uma ponta indicando o sentido. Ou não? Mas são pontos no espaço. Imagino que R3 indique isso.... Claro que no plano dá na mesma. y = ax + b é uma reta no plano Se ela contem dois pontos de D contem A contem M Então A maçã já era.
  20. Não acha que devia ter postado isso antes? Entendeu o programa que te enviei? Há décadas o padrão para isso é o IEEE754. Veja uma descrição em https://docs.microsoft.com/pt-br/cpp/build/ieee-floating-point-representation?view=vs-2019 por exemplo A FC05 é o valor que quer. Apenas encontre a especificação para o float IBM 4 e converta. Nada tem a ver com Little Endian Big Endian exceto que vai ter claro que inverter os bytes como mostra o programa que te enviei. Se entendeu o programa viu que simplesmente ele grava esse valor de duas maneiras e lê de volta. E depois lê o trecho do seu arquivo onde estão os dados.
  21. Pode evoluir um pouco mais, certo? mostre os valores que está lendo. É mais seguro use prompts para orientar a leitura das notas comece com valores fixos e faça as contas todas, antes de ficar lendo. Isso só via te atrasar
  22. que tal resolver ao menos um dos casos, ainda que com valores fixos?
  23. Que está fazendo esse programa? Não lê nada não mostra nada não verifica se algum número é primo não tenta ver qual o maior ou menor não calcula a média Como iniciante, escolha algo e tente fazer, como ler e mostrar os valores e ao final mostrar o maior. Vai se sentir melhor

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!