Ir para conteúdo
Fórum Script Brasil

Felipe Amadio

Membros
  • Total de itens

    49
  • Registro em

  • Última visita

Tudo que Felipe Amadio postou

  1. Felipe Amadio

    Help C++ (JOGO)

    cara, isso que voce ta falando, pra mim, não faz sentido! ao fazer: "alguma_variavel = alguma_funcao(parametros)" voce esta atribuindo um valor, calculado pela funcao "alguma_funcao", à variavel "alguma_variavel"... se voce faz "alguma_variavel = alguma_funcao1(parametros)" e logo em se guida "alguma_variavel = alguma_funcao2(parametros)" é como se voce nem tivesse realizado a primeira atribuicao! no final das contas, a unica coisa armazenada na variavel "alguma_variavel" vai ser o valor retornado pela segunda funcao! Então voce tem que ver ai... as 4 linhas, uma em seguida da outra, vão ter EXATAMENTE o mesmo efeito de somente as duas ultimas linhas... E essa sua "ideia" de juntar tudo numa linha só, realmente não existe! seria como falar "variavel_de_numeros_inteiros = 4 || 5" tipo, a variavel armazena o valor 4 ou 5... qual o sentido disso??
  2. nossa, fiz um tópico enorme ontem, e não salvou...!!! enfim, vou falar resumidamente: int matricula[8]; você aqui ta usando matricula como um vetor! deve usa-la como um int normal, ou, no maximo, como um long int...!! E outro ponto: ao fazer tal atribuição scanf("%c", &turmas[i]->nome); voce ta cometendo um erro, que ainda não deve ter aparecido, mas vai aparecer! como "nome" é um vetor, passar o argumento "&nome" é errado. quando uma variavel ("nome", por exemplo) é declarada como um vetor, se voce usar "nome" no programa, o que você está escrevendo é exatamente igual a "&nome[0]", ou seja, "nome" representa o endereço do primeiro elemento do vetor "nome". Portanto, quando voce passa "nome" prum argumento de scanf, voce deve armazenar um VETOR nesse argumento, e voce está armazenando somente um caractere! então, vai dar erro! o certo seria voce armazenar um vetor ali, e, portanto, deveria digitar "%s" ao invés de "%c", alem do que, não deve ser "&turmas->nome", e sim "turmas->nome" (na verdade, o que eu falo acima vale, com certeza absoluta, sem ser o caso da struct! mas não imagino que mude, deve ser isso mesmo... tente fazer essas modificações e poste os resultados!
  3. Olha, eu faço Engenharia na Usp, la na Poli, e o Dev era o programa recomendado pra gente na nossa disciplina de primeiro ano. De fato, eles recomendavam também o code::blocks! mas, a principio, o dev era instalado em todas as maquinas da faculdade, e, posteriormente, começou a surgir o code::blocks também... Pode baixar o dev! você não deve ter problemas, não... ... se tiver, poste aqui! Mas ambos são programas simples e eu nunca usei muitas funções assim que realmente mudaram minha vida! Em resumo, programar em C, tanto no Dev quanto no code::blocks, pra mim, é praticamente igual a programar no bloco de notas, com exceção das cores e da identação, que ajudam a enxergar melhor onde temos declarações de variaveis, comentarios, loops, ifs, e etc... E tem os compiladores de cada um, mas eles tem a opção (ambos!) de se usar compiladores externos, então caso você esteja experienciando problemas de compilação, e esteja precisando de um compilador especifico, tanto no dev quando no code::blocks você pode baixar esse seu compilador e mandar ele usar, sem problemas! abaixa o dev e usa. se achar ruim, tenta o code::blocks, mas duvido que isso ocorra!
  4. O problema da matricula eu vi logo de cara: char matricula[8]; Matricula é pra ser um INT, não? e não precisa ser um vetor! um mero INT daria conta do serviço! (a não ser que você tenha mais de, se não me engano, 1milhao400mil alunos, dai você precisaria de um LONG INT...!) Então, muda na declaracao, pra: int matricula; ou long int matricula; dai, eminentemente, tem que arrumar na "captação" da matricula: scanf("%c", &turmas[i]->matricula); tem que por com %d. E, na impressão, você já considerou como sendo int!! rintf("\n\nMatricula: %d\n", turmas[i]->matricula); Então não precisa mudar nada... Agora, quanto o final do programa, não sei... não achei nenhum erro, de cara... precisaria saber exatamente o que ta acontecendo! Sei la, coloca um "else" na "imprime aprovados", pra ele imprimir tambem os não aprovados, só que de maneira diferente, algo assim: else { printf("aluno não aprovado\n"); imprime(n,turmas,i); } só pra diferenciar dos não aprovados e testar, efetivamente, a funcao "imprime" E.. .quanto a imprimir a média dos aprovados... bom, não achei em nenhum lugar do código algo que imprimisse a média! Só achei a função "imprime", que imprime nome, matricula e turma, não? Ve ai se não ta faltando algo... E, só um detalhe, mas você está atribuindo, no seu programa principal, duas vezes um mesmo aluno na posicao turmas[1]... Você está chamando duas vezes a funçao "preenche" com os mesmos argumentos! Da uma arrumada nisso tb... E faça estes testes que eu disse, e poste exatamente o que a função está imprimindo, ou se ela não imprime nada, nem com o "else" que eu sugeri...
  5. Então, na verdade, acho que eu estava esbarrando em outro tipo de erro... Como meu documento estava se limitando a 64-65mi linhas, e por ser um numero meio "chave", sei la, achei que pudesse ser algum problema de compilador, como eu disse... Acontece que o erro real está na forma como eu checo se o arquivo chegou no fim! Inicialmente, meus arquivos continham ; e \n depois de cada dada, e atualmente só tem \n, e eu estava verificando um caractere a mais, de forma que quando o numero a ser analisado era de apenas 1 algarismo, esse numero era pulado, e o arquivo de saida ficava com uma linha a menos... O grande problema foi a coincidencia! o primeiro e único arquivo que eu usei que continha valores de apenas um algarismo, era este, com 69 mil linhas, e achei que era uma limitação do programa, ou algo assim, mas não! Era erro de programação! Então, peço desculpas, desconsiderem o tópico, e podem feixá-lo/deletá-lo! Muito obrigado de todo jeito!!
  6. Não sei dizer especificamente para o windows 7. Não sei se algum programa é mais rápido ou literalmente melhor. Muita gente sempre disse muito bem pra mim do Code::Blocks, mas eu acabei sempre usando o Dev C/C++. Outro dia fui baixar o Code::Blocks e simplesmente não conseguia compilar nenhum programa! Parece que ele tem a auti-identação mais simples e efetiva do que o Dev, mas eu já me acostumei com o Dev e... confesso, eu não gosto muito da auto-identação do dev, não! Então, prefiro desativar a auto identação e idento o programa eu mesmo! isso não da muito trabalho, e, no final das contas, fica tudo bem simples! (identar é organizar visualmente um programa! em resumo, vou postar primeiro um pequeno codigo sem identação, e um outro com identação:) sem identação: for(i=0;i<i_max;i++) { for(j=0;j<j_max;j++) { if (i<j) printf("%d", i+j); else printf("%d", i-j); } } com identação: for(i=0;i<i_max;i++) { for(j=0;j<j_max;j++) { if (i<j) printf("%d", i+j); else printf("%d", i-j); } } Enfim, eu só usei até hj esses dois programas, e acho eles praticamente iguais! (não fosse o detalhe deu não ter conseguido compilar co o code::blocks - talvez eu baixei uma versão sem compilador! - eu estaria usando ele! mas estou usando o dev)
  7. Seguinte, coisas bizarras acontecem em C, e estou presenciando uma delas! Me parece um erro do compilador, e como eu não entendo NADA de compilador, deve ser por isso que não consigo resolver o problema: Como já postei algumas vezes aqui, tenho um programa que obtem dados de um arquivo externo, e vai fazendo contas, cada vez pegando um novo dado do arquivo externo, e imprimindo as contas em ou utro arquivo externo. Estive trabalhando com dados em torno de 58mil linhas (cada linha tem um dado, que é um valor), e não tinha problemas. Eu gerava n arquivos (digitados pelo usuario) contendo essas 58mil linhas ou até um pouco menos, umas 2 mil a menos (uma constante definida pelas contas do programa). E até aí, meu programa estava perfeito! O problema é que meu chefe resolveu usar uns dados que possuem 66931 linhas (pra ser exato!) e comecei a ter problemas: -meus arquivos de saída, todos eles, estão com algo em torno de 65mil linhas, só! as outras não estão aparecendo! (nesse caso, não há as +ou- 2 mi linhas não escritas... são algo em terno de 20 ou 30 linhas a menos, só, e ele está me dando mais de 1500 linhas a menos!!! Não consegui entender aonde estava o problema, então resolvi testar alternativas para ver se o problema se resolvia, e cheguei à alternativa mais bizarra de todas!!! como forma de testar a impressão do arquivo, numa inicialização inicial, aonde somente o arquivo era lido, resolvi imprimir cada dado lido num outro arquivo de saida, para ver o que dava. A principio, o mesmo problema: somente umas 65k linhas eram impressas. Depois, resolvi DELETAR O RESTO DO PROGRAMA! simplesmente deixei o meu programa com a inicialização que descrevi acima, e, para minha surpresa, funcionou!!!!! Voltei a colocar o resto do programa, e deu erro novamente! e em nenhum ponto eu reedito o arquivo no resto do programa, então, explicitamente: se meu codigo está grande, ou completo, não imprime todas as linhas, com um codigo pequeno, imprime todas as linhas! aí vai o codigo enxuto, somente com a inicializacao: #include <stdio.h> #include <stdlib.h> #include <math.h> #define _FILE_OFFSET_BITS =64 int main() { int i, j, filtro, mult, controle, div; int minactivefloat, volume, estoque, debito, maxactivefloat, passoactivefloat, activefloat; long vol1, vol2; double financeiro, Pestoque, Festoque, volmedia, volacumulado; double preco1, preco2, pct; char *strgp, *strgv1, *strgv2, *strgr, *str, *strcontrole, buf[100]; char c1; FILE *p1, *v1, *p2, *v2, *pcto, *cont; i=0; volume = 0; financeiro = 0; Festoque = 0; Pestoque = 0; volacumulado = 0; strgp = "preço.txt"; strgv1 = "vol.txt"; strgv2 = "vol2.txt"; strgr = "result.csv"; //Ajusta os separadores de decimal p1 = fopen(strgp,"r+"); fseek(p1,0,SEEK_END); fprintf(p1,"*"); fseek(p1,0,SEEK_SET); while (c1!='*') { fscanf(p1,"%c",&c1); if (c1 == ',') { fseek(p1, -1, SEEK_CUR); fprintf(p1,"."); fseek(p1, 1, SEEK_CUR); } } v1 = fopen(strgv1,"r+"); fseek(v1,0,SEEK_END); fprintf(v1,"*"); fseek(v1,0,SEEK_SET); while (c1!='*') { fscanf(v1,"%c",&c1); if (c1 == ',') { fseek(v1, -1, SEEK_CUR); fprintf(v1,"."); fseek(v1, 1, SEEK_CUR); } } fclose(v1); fclose(p1); //fim //--------------------------- p1 = fopen(strgp,"r"); p2 = fopen(strgp,"r"); //Calcula a média v1 = fopen(strgv1,"r"); c1 = '0'; i=0; strcontrole = "controle.txt"; cont = fopen(strcontrole,"w"); while (c1!='*') { fscanf(v1,"%ld", &vol1); fprintf(cont,"%ld\n", vol1); volacumulado = volacumulado + vol1; i++; fscanf(v1,"%c", &c1); if (c1!='\n') { fscanf(v1,"%c", &c1); fseek(v1, -2, SEEK_CUR); } else fseek(v1, -1, SEEK_CUR); } volmedia = volacumulado/i; printf("\nVolume Total = %lf\nNumero de Linhas = %ld\nMedia = %lf\n\n", volacumulado, i, volmedia); fclose(v1); //fim return 0; }
  8. Voce sabe trabalhar com Struct...? e com listas encadeadas? struct são estruturas. Voce pode criar uma struct contendo varias informações: struct paciente{ int id; int prioridade; struct paciente *prox; struct paciente *ant; }; e o que é isso? simples, existe a variável INT, que armazena uma coisa só, um inteiro. Existe uma variavel char, que armazena uma coisa só, um caracter (não estou levando em consideração vetores!!! que são, na verdade, varias variaveis, e não uma só) E, a partir do comando criado, passa a existir uma variavel paciente, que não armazena uma coisa só! armazena varias informações! Sinceramente, não vou gastar muito tempo te explicando como funciona uma sctruct ou uma lista encadeada! Leia isso daqui: http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html listas encadeadas são muito poderosas, pois voce pode adicionar um elemento no meio da lista, ou retirar um elemento do meio dela! dessa forma, voce pode facilmente trabalhar com este seu programa... De uma lida neste texto, e acredito que com essa implementação, as ideias irão clarear um pouco pra voce! Qualquer duvida, poste novamente..!
  9. Felipe Amadio

    Help em C++

    Certo, só pra entender, no caso do usuário dizer que quer numeros de 1 a 5, a saída vai ser essa: 1,1 1,11 1,111 1,1111 1,11111 2,2 2,22 2,222 2,2222 2,22222 3,3 3,33 3,333 3,3333 3,33333 4,4 4,44 4,444 4,4444 4,44444 5,5 5,55 5,555 5,5555 5,55555 ?? ou tudo que vier depois da virgula são 1's? assim: 1,1 1,11 1,111 1,1111 1,11111 2,1 2,11 2,111 2,1111 2,11111 ... ? enfim, isso é só para entendimento Agora, indo à programação, você já programa em C? começou a escrever algo? esbarrou em quais problemas? Uma forma de gerar os numeros decimais seria ter num loop uma variável auxiliar, "dec", e o numero "i", que irá conter o numero que atualmente está sendo processado (por exemplo, 2) Cria-se um vetor bem extenso, e, pegando o meu exemplo, entre as posições 5 e 9, teremos: 2,2 2,22 2,222 2,2222 2,22222 Para fazer isso, faca um pequeno loop aonde o valor de dec comeca em 0,1 e multiplica-se esse valor, a cada iteração, por 0,1. Dessa forma, em cada iteração, dec valerá: 0,1 0,01 0,001 0,0001 0,00001 Fazendo, inicialmente, o valor do vetor na posição 5 valer 2 e depois, entrando neste loop que eu disse desta forma: ini = ini +5; temp = i; dec = 0.1; for(j=0; j<5; j++) { vetor[ini+j] = temp + dec*i dec = dec * 0,1 temp = vetor[ini+j] } i++ Explicando um pouco: "ini" vale a posição inicial deste "grupo" de valores (no meu caso, o grupo do numero 1 tem como posição inicial 0, o grupo do numero 2 tem posiçao inicial 5, e assim por diante - por isso eu já atualizei o valor de ini, que antes valeria 0 e agora vale 5) dec, como eu já disse, é responsavel por aumentar o numero de algarismos depois da virgula temp ira conter o ultimo numero montado. Para montar 2.2, precisamos adicionar 2 + 0.2, então temos que ter 2 no temp (primeiro caso). Para montar o 2.22, temos que ter 2.2 + 0.02, então, temos que term 2.2 no temp (que é o valor montado anteriormente - vetor[ini+j-1] Enfim, acredito que isso já vai te dar a base (ou mais do que isso!!!) pra montar o seu programa. Duvido que voce continue com dificuldades, mas, caso ainda as tenha, poste aqui!
  10. Primeiramente, na declaração das funções, voce usa double FRacio24Q(int matriz[][20], double *quad); Se não me engano, você deveria usar "matriz[20][]", especificando somente o numero de linhas, e não o de colunas, não? Mas, enfim, dificilmente isso é o que está resultando no erro que você está tendo Agora quanto ao seu erro, voce sabe exatamente o que está ocorrendo? A principio, me parece correto o código (pelo menos os incrementos de cont3, que vai ser o indice do seu vetor) Tente colocar algo como for(i=0; i<24; i++) prinft("%f", quad[i]); pra descobrir o que está sendo armazenado no seu vetor, e se alguma posição não foi preenchida (desse modo, contendo o valor 0 utilizado na inicialização do vetor que voce mesmo fez)
  11. Seguinte, eu tenho um programa que aplica diversas fórmulas a um vetor de dados... Esse vetor de dados é extremamente grande, então eu vou lendo ele aos poucos, de um arquivo .txt, e vou fazendo as contas, e imprimindo os resultados em um outro .txt Essas contas tem uma variável envolvida, que irá ter uns 5 valores diferentes, então, como resultado, eu vou ter 5 vetores. Esses 5 vetores eu gostaria de armazenar em um arquivo .csv, pra exportar pro excel, e fazer virar uma matriz. Mas daí vem o meu problema, depois de realizar o primeiro conjunto de contas, meu arquivo .csv deverá ter tal aparencia: 50;\n 30;\n 23;\n 43;\n ... (os ";" antes de cada \n, ao longo do programa todo, são opcionais! ainda não sei se eles vão facilitar no codigo!) dai, ao final do segundo conjunto de contas, meu .csv deverá ser algo assim: 50;54;\n 30;32;\n 23;26;\n 43;40;\n ... e ao final da terceira: 50;54;51;\n 30;32;33;\n 23;26;20;\n 43;40;49;\n ... Bom, dai como eu pensei em fazer isso, usando a funcao FSEEK. Ao final de cada bateria de contas, eu posiciono o cursor no inicio do programa (FSEEK(p1, 0 SEEK_SET), dai entro num loop para ler caracteres até chegar num '\n', volto 1 caracter, e imprimo o novo numero, seguido de um ";" (ou o ";" vem antes do numero! tanto faz). Dai, mais uma vez, continuo até achar outro '\n', volto 1 caracter, imprimo um novo numero, e assim vou! O problema que eu estou esbarrando é o seguinte: explicitamete, o meu fprintf não esta inserindo os valores, ele está sobrescrevendo valores! ao executar essa ideia, ele não meramente adiciona os numeros! Eu já tentei, na verdade, de diversas formas, e interrompi o programa no meio, pra ver o que está acontecendo, e sempre quando um novo fprintf ocorre, um numero não é meramente inserido, ele sobrescreve sempre alguma coisa (como um outro numero, ou ele é escrito em cima de um '\n'...) Enfim, eu precisaria de uma funçao que INSERE um numero, sem sobrescrever de jeito nenhum! ou arrnjar um jeito de escrever com fprintf sem que sobrescreva alguns valores ali presentes!
  12. Felipe Amadio

    Help em C++

    Pera, não entendi nada! explica ai melhor... Quais são as entradas do usuário? Qualquer numero, inclusive não inteiro, entre 1 e 10? E essas combinações com 5 casas depois da virgula, o que vai vir antes da virgula? Voce quer que os numeros que ocupem essas 5 casas sejam aleatórios!? Da uns exemplos de entradas do usuário e o que você quer que tenha como saida! (Po, vamo se esforçar um pouco mais pra colocar umas perguntas mais claras! poupa o tempo de todo mundo!!)
  13. Nâo sei como funciona em C++, mas em C o que eu faço para imprimir esses caracteres é "enganar" o computador: Eu falo pra ele imprimir uma variavel que, por definição, é um caracter, e atribuo a esse caracter diversos valores inteiros, que seriam os codigos equivalentes, em inteiros, para cada codigo. por exemplo: int i; for (i=0; i<500; i++) printf( "O inteiro %d equivale ao caracter %c", i, i); quando eu peco para imprimir um %d, ele entendo como um inteiro, e imprime o proprio valor de i (para que eu saiba qual valor usar depois!) e ao utilizar o %c ele entende como um caracter, e irá me imprimir a correspondencia valida. isso eu uso para descobrir qual inteiro equivale ao caracter que eu quero! uma vez com o inteiro equivalente em mãos, é só usar o %c aonde você quiser... (não sei se ajudou, uma vez que você perguntou o codigo em C++, mas deve ter maneiras similares de fazer isso que eu disse, só que eu C++)
  14. Hum... muito obrigado!! Eu já sabia dessa história de pedir para imprimir numero com o numero de casas decimais definidas, mas, como disse no inicio do programa, eu gostaria de saber a precisão, mesmo, de cada tipo de variável, de modo que sua resposta ajudou muito! para ilustrar para todos, resolvi meu problema (que era o de não ter precisao ao calcular log(preco1/preco2)), da seguinte maneira: Eu exportava meus dados para um arquivo .txt Ao invés de dar um fprintf com %lf, fiz com %.16lf e a minha precisão aumentou consideravelmente!!! e agora, mais alguns detalhes, a titulo de curiosidade: Usar o %.16lf e o %.16f me parece ser a mesmíssima coisa! tem alguma diferença...??? E, quanto ao seu LONG DOUBLE, nunca ouvi falar disso! como funciona? como é feito a declaração e como faço as chamadas de printf e scanf? da mesma forma que com o double? com %f mesmo?
  15. Só pra corrigir um erro que eu disse aqui: ao se digitar: printf("%5d", int); o programa ira escrever o numero "int" ocupando 5 caracteres! (ou mais, caso o numero precise), mas ele não irá preencher com zeros, e sim com espaços! por exemplo, se int= 20, no meu exemplo com %5d, ele irá imprimir " 20", com 3 espacos antes! agora se o numero for um float, por definicao, ele imprimira 6 casas decimais. caso eu digite printf("%5.1f", float); com float = 20 ele ira imprimir " 20.0" dois espacos, 20, o ponto, e 0, totalizando 5 caracteres se você colocar printf("%5f", float); com float = 20, como por definicao ele imprime 6 casas decimais, só ai já teriamos 7 caracteres (as 6 casa e o ponto), então ele desconsidera o seu "pedido" de expressar o numero em 5 caracteres
  16. Não entendi.... - o que você quis dizer com "criar estruturas dinamicamente" ? Você quer alterar os campos presentes dentro de uma estrutura, pois você não sabe quantos campos dentro da estrutura voce vai precisar, ou você já tem a estrutura pronta, de formato e campos definidos, e meramente não sabe quantas elementos com essa mesma estrutura voce vai precisar? se for o primeiro caso, até onde eu sei, não é possível! voce define como será uma estrutura no inicio, e ela não pode mais ser alterada! se for o segundo caso, acredito que meramente pegando do usuário quantas "structs" ele vai querer, e fazendo um loop que rode exatamente o numero de estruturas necessárias, e nesse for fazendo chamada a um malloc, acredito que resolve o problema (se tudo isso pareceu grego, poste qual parte não entendeu que eu explico melhor) eu trabalho, na verdade, só com C... não entendo muito de C++, mas acredito que nesses pontos as linguagens são semelhantes, então não devo ter falado besteira!
  17. Eu nunca trabalhei com textbox, mas caso eu fosse fazer essa verificação eu faria algo seguinte: - receber, inicialmente, o numero de algarismos do numero a ser digitado - receber cada caracter individualmente, e verificar se ele é um algarismo - armazenar cada numero em um vetor - montar o numero, baseado em potencias de 10 ai vai, mais ou menos, como ficaria scanf("%d", numeroalgarismos); for(i=0;i<numeroalgarismos;i++) { scanf("%c", c); // c é uma variavel CHAR para armazenar os caracteres inseridos if (0<=(c-48) && (c-48)<=9) //isso garante que c é um numero! mais adiante eu explico o por que do (c-48) numero[i] = c-48; else printf("O caractere digitado não é um algarismo!!"); } j=0; numero1 = 0; for(i=numeroalgarismos-1;i>=0;i++) { numero1 = numero1 + numero[j] * pow(10,i); // j é uma variavel pra percorrer o vetor, enquanto i vai ser a potencia de 10 pela qual sera multiplicada cada algarismo, pra formar o numero da maneira certa! j++; } Escrevi esse codigo em 5min, e não verifiquei, devem ter erros, com certeza! o intuito é passar a ideia e mais ou menos como eu realizaria esta ideia A historia de subtrair 48 de c é bem simples, cada caracter do teclado tem um numero associado. O numero "0" é u mcaracter representado pelo numero 48. Quando armazenos "0" em uma variavel tipo char, ela na verdade armazena o numero 48, e ao pedir para imprimir esse char como um inteiro, ele ira imprimir esse numero, 48! os outros algarismos, "1", "2", "3"... estão todos sequenciais depois do 48! de modo que 49 representa o 1, e assim por diante. Dessa forma, podemos facilmente pegar um algarismo que é um char e transformar ele em um int, podendo até usa-lo em uma conta (como eu de fato fiz, ao atribuir numero = c-48)
  18. o valor das variaves esta correto, pois 2.0 = 2.0000000 e 6.5 = 6.5000000 portanto, não há um erro no programa... O que acontece é que, por definicao, o printf vai te dar um numero fixo de casas deciamais, alem do minimo numero possivel de casas não decimais! por exemplo: 0000001 = 1 mas quando você manda imprimir "1" ele não imprime os zeros que vem antes! por definicao, se esse 1 ai for de uma variavel int, ele tambem não vai imprimir nenhuma casa decimal! pra você explicitar quantas casas antes e depois da virgula você quer quando executa um comando printf, você deve fazer o seguinte printf(" %5d", i); //nesse caso, ele ira imprimir um int com 5 algarismos, se i vale 200, então sera impresso 00200 printf(" %.4f", f); //aqui, ele ira imprimir um float com quantos algarismos forem necessarios antes da virgula, e somente 4 casas decimais em resumo, funciona assim: printf(" %A.Bf", f); aonde: A- algarismos que você quer que tenha antes da virgula B- algarismos que você quer que tenha depois da virgula na ausencia de A ou B ele mantem como o padrão (que depende do valor inserido e do tipo de variavel) no seu caso, então: printf("%.2f", f); deve dar o resultado esperadp! ok!
  19. Pra começar, eu trabalho em C (não C++) Eu fiz um programa que no meio dele deve calcular LN(preco1/preco2). e minha saida para isso foi essa: fprintf(saida1,"%lf ", log(preco1/preco2) ); porém, caso eu mude o "%lf" por %f, o resultado fica exatamente igual, e, na minha opinião, com uma precisão muito baixa! somente 5 casas decimais (a 6a é aproximada), e nesse meu caso, que eu calculo um ln, é muito importante uma precisão de algo em torno de 8 ou 9 casas decimais (até por que, esse valor retornado vai ser uma porcentagem, então só nessa "operação" de usar como porcentagem, eu já perco mais duas casas decimais, e acabo tendo uma precisão horrível de apenas 3 casas decimais...!! (obs: tanto preco1 quanto preco2 estão declarados como double) achei estranho, e resolvi criar um programa que compare float e double, e daí que vi que a coisa ficou ruim! ai vai o programa que eu fiz: float f; double d; f = 0.12345678901234567890; d = 0.12345678901234567890; printf("f = %f %lf\n\n", f, f); printf("d = %f %lf\n\n", d, d); e as saidas me retornaram valores EXATAMENTE identicos! com 5 casas decimais, e a 6a casa aproximada! Portanto, pra que serve o Double, sendo que ele ocupa o dobro de bits do float e, em teoria, ele não me fornece mais casas decimais?? Outra coisa, muda algo usar, em qualquer ponto do codigo, seja em scanf ou printf, %lf ou invés de %f? E, por fim, e o mais importante a titulo de resolver o meu problema de verdade, e não só as minhas duvidas e curiosidades: Alguém tem ideia de como eu fazer o meu LOG(preco1/preco2) aparecer com mais casas decimais...?? (tentei um migue, fazer log(pow(preco1,100)/pow(preco2,100)), o que já me daria o valor em porcentagem, mas não deu certo, a precisao ficou igual a se eu fizesse 100*log(preco1/preco2) - numericamente eu sei que é igual, mas achei que poderia enganar o pc fazendo ele me dar mais precisão, mas não funcionou...
  20. Vou tentar ver qual das duas soluções funciona melhor... Eu não criei este código, foi meu chefe. Ele criou uma macro em Excel e eu só traduzi para C. Quanto à ideia de alocar com malloc, existe algum problema explicitou deu realizar o malloc 300mil vezes..? e acredito que eu não daria free até o final da execução do programa (preciso ver se eu preciso, de fato, de todo o documento carregado, ou se eu posso lê-lo aos poucos) E, também no malloc, tem como eu fazer uma alocação com malloc de modo a poder trabalhar, ainda, com vetores? ou alocar com malloc impolica, necessáriamente, em utilizar listas encadeadas...? (digo isso pois eu trabalho com 2 indices diferentes neste programa, e não sei se eu tenho "saltos", indo, por exemplo, do indice 100 mil de volta pro indice 1 - numa lista encadeada, eu deveria percorrer todos os elementos até chegar no indice 1, e num vetor, não!) E, caso seja possível ler aos poucos o arquivo, eu sei que existe, mas não sei como trabalhar com cursores! Como eu tenho 2 indices no meu vetor, pra ir lendo do arquivo aos poucos, eu precisaria de 2 cursores no meu arquivo. Alguém tem ai algum material bom de cursores ou tem algum jeito simples de explicar...?
  21. O principio de uma fila é o FIFO - First In, First Out, que seria "O primeiro que entra é o primeiro que sai" logo, você monta uma fila enorme, de pessoas, e a primeira a ser retirada da fila (no caso, a ser atendida pelo banco) é a primeira pessoa que entrou na fila para se trabalhar com filas a melhor coisas é se usar listas encadeadas, pois se você usar vetores, vai ter que "liberar" o inicio do vetor, e num determinado momento vai estar usando, por exemplo, o vetor do 10º ao 20º elemento, e isso não é sintaticamente inteligente. Já a pilha o princpio é outro, é o FILO - First In, Last Out, que seria "O primeiro que entra é o ultimo que sai" (ou também LIFO - Last In, Firs Out, "o ultimo que entra é o primeiro que sai") que seria uma pilha de revistas, mesmo! pensa numa caixa, que você joga as revistas nela, e tem 50 revistas na caixa. se alguém pegar uma revista, vai pegar sempre a mais de cima da pilha, que foi a ultima a ser adicionada, e a primeira revista a ser adicionada, certamente vai ser a ultima a ser retirada! pra trabalhar com pilhas a utilização de vetores é suficiente, uma vez que você sempre ira mecher na ultima posição: se você adiciona uma revista na pilha, você ocupa a ultima posição do vetor, e coloca seu indicador pra frente; se alguém retira uma revista da pilha você libera a ultima posicao do vetor, e coloca seu indicador pra tras são implementacoes simples, você não deve ter dificuldade de executa-las ou de entende-las. De todo modo, existe MUITO material na internet sobre pilhas e filas, caso não tenha sido sificiente (tipo wikipedia... ou google! não seja preguiçoso, procure!)
  22. Seguinte, estou criando um programa em C que analisa dados financeiros de negocios da bolsa. Com 2 anos de dados, tenho aqui, no meu caso, 300 mil linhas de um arquivo, e gostaria de armazena-las em 3 vetores (cada linha tem 3 colunas, por isso 3 vetores) Pra ter uma folga, no caso deu precisar de 2 anos e meio ou 3 anos, resolvi declarar meus vetores com 500mil posições, assim: #include <stdio.h> #include <stdlib.h> #include <math.h> #define NMAX 500000 int main() { int vol[NMAX]; double preço[NMAX], porcento[NMAX]; Ao compilar, o programa compila, numa boa, e depois ao rodar o programa, tenho uma falha! da aquele classico "o programa 'teste.exe' parou de funcionar". Reduzindo o valor de NMAX, eu cheguei num momento com a seguinte situação: Se eu criasse 1 vetor INT, com 300mil posições, não dava problema 1 vetor com 350mil posições, dava problema 2 vetores, cada um com 150 mil posições, não dava problema 3 vetores, cada um com 100 mil posições, não dava problema 3 vetores, cada um com 100 mil posições e 1 vetor com 50 mil posições, dava problema! Em resumo, meu programa estava com dificuldade de alocar uma quantidade muito grande de posições para os vetores (quando eu utilizo float ou double no lugar de int, o "NMAX" maximo que eu poderia usar, sem dar problemas, era evidentemente menor, uma vez que floats e doubles ocupam mais espacoes do que ints!) Não sei se isso deveria acontecer, eu estou com memória disponível de 40Gb no meu computador, então acho pouco provável de ser esse o problema. (não sei nem se isso poderia ter a ver com o HD) Talvez isso seja alguma configuração do compilador, ou algo a ver com a minha memória RAM, não sei. Precisaria rodar o programa em algum outro computador, pra ver o que aconteceria! Mas, a principio, alguém tem noção de qual é o problema e qual seria a solução?
  23. http://www.vivaolinux.com.br/artigo/Manipu...em-C-(parte-1)/ Essa pagina tem varias partes, no final do texto tem um "Proxima parte". Vai lendo, é facil de se entender.
  24. Não analisei o resto do código, mas ai não deveria ser for(int j=0, j < 3; j++) ??
×
×
  • Criar Novo...