Ir para conteúdo
Fórum Script Brasil

Felipe Amadio

Membros
  • Total de itens

    49
  • Registro em

  • Última visita

Posts postados por Felipe Amadio

  1. Cara, é bem facil isso...

    não vou escrever em termos de linguagem c, porque tou enferrujado e não trabalho com listas encadeadas faz tempo, mas escrevo em portugues e você traduz pra c, ok?

    loop passando por toda a lista

    declara um *p_ant, e *p_prox, que são um apontadores temporarios

    no primeiro elemento, você não faz nada, só armazena o valor do endereco dele em *p_ant

    e passa pro proximo elemento com p=p->prox

    nos outros elementos,

    armazena o valor do p->prox do elemento atual em *p_prox, o p->prox do elemento atual vira o *p_ant, e passa ao proximo elemento com p = p_prox

    deve funcionar!

  2. Então, não sei exatamente se eu to falando besteira, mas enfim... eu estou precisando criar um Windows Base Application. No meu entendimento, e o que eu quero dizer com isso, seria um programa para se rodar em windows, com interfaces grafica e tudo mais, do jeito mais simples possivel!

    sei la, um programa que você pode criar um arquivo novo, salvar, e abrir, isso no menu

    dai tem algumas abas aonde você tem um botao que lhe permite adicionar informações, e tals...

    No meu caso, seria um programa para gerenciar modelos matemáticos, e cada uma dessas abas que eu disse seria responsável por gerenciar uma etapa do desenvolvimento do modelo matemático, e voce pode abrir, salvar e criar um novo modelo matematico, criando inclusive uma extensao pra ele e tudo mais...

    Então, é possível fazer isso em linguagem C? se não, qual linguagem é aconselhavel...?

    muito obrigado

    (aos moderadores, caso essa pergunta esteja em lugar errado, me desculpem....)

  3. /*laço */

    for (i=0; i<linhas; i++)

    nulo = 1;

    for(j=0; j<colunas; j++)

    {

    if (A[j] =! 0)

    nulo = 0;

    if (nulo==1)

    cont = cont + 1;

    }

    /*laço 2*/

    for (i=0; i<linhas; i++)

    {

    nulo = 1;

    for(j=0; j<colunas; j++)

    if (A[j] =!0)

    nulo = 0;

    if (nulo ==1)

    cont = cont + 1;

    }

    Bom, o problemas está nessa parte...

    não sei se você entendeu o conceito, mas vou mostrar aonde tão os erros:

    no "laço 1" falta a abertura de chaves do primeiro for! do jeito que está, dentro do primeiro for só tem o comando "nulo = 1" e o outro for não está dentro dele! então está eminentemente errado, tem que arrumar e colocar as chaves de abertura e fechamento

    E depois, está certo, o laco 2 está perfeito!

    é só arrumar a posição das chaves do primeiro laço que deve funcionar.

    (pra conferir, pensa na execução do programa:

    no primeiro laco, o primeiro for da conta de analizar todas as linhas, enquanto que o segundo varre as linhas por si só.

    Antes de varrer cada linha, voce diz que nulo = 1, e varre a linha inteira, procurando por elementos não nulos. ->if (a[j] != 0)

    Se depois de varrer uma linha inteira, voce não tiver encontrado nenhum elemento não nulo, voce então incrementa o contador.

    Eu sei que não precisa, e muita gente não usa, mas, pelo menos quando usar os for, eu sugiro colocar as chaves, sempre! pra facilitar o entendimento... mas, enfim, no laço 2 você só usou as chaves onde precisava, e está correto!)

  4. Cara, você não pode fazer isso que voce fez!

    De fazer a soma das 3 primeiras linhas e das 3 primeiras colunas!

    Pois se a matriz tiver 2 linhas, então você está usando elementos não definidos nessa matriz! simplesmente use para "somaInicial" o valor da primeira linha, e isso já basta! as outras somas, de fato, nem estão sendo usadas no seu programa, então sugiro que você não as realize! tire todos esses for que fazem as somas dessas somainicial1, 2, 3, 4, 5! deixe só o primeiro, da "somainicial".

    Depois, voce não está analisando o caso das linhas! você somente verifica se todas as colunas estão consistentes! E voce, apesar de realizar a soma da diagonal principal e da secundaria, voce não está comparando esses valores com somaInicial!

    Quanto ao loop infinito, não sei dizer aonde ele ocorre! como seu programa possui poucos "for's", sugiro que voce espalhe alguns system("pause") pelo seu programa, um em cada for, pelo menos, a antes de cada system("pause") coloque um printf para o programa exibir as variaveis do critério de parada do loop! só pra entender por que não está parando...

  5. Olha, isso que você colocou, "A" tipo não existe!

    Pelo que eu entendi, linha nula seria ter todos os elementos da linha nulos, e "A" tipo... sei la, não faz muito sentido!

    Sugiro, a titulo de curiosidade, que você faca um

    printf("%d", A[i]);
    só pra ver o que aparece! não sei dizer o que isso significa, mas não é o que voce estava querendo dizer! A ideia que eu sugiro aqui, é a mesma que eu coloquei ali no seu outro post. Vou postar um "codigo" explicado em linguagem normal, não em c.
    For (percorrendo todas linhas)
    {
           nulo = 1 // variavel indicadora de passagem que indica, a principio, que todos os elementos da linha ou coluna que eu irei analisar são nulos. 1 = sim
           for (percorrendo todas as colunas - aqui, alem de "j<colunas", pode ter um "j<colunas && nulo = 1")
                if (A[i][j] =! 0)
                    nulo = 0 //aqui, achei um elemento não nulo, e posso parar de percorrer essa linha ( ou coluna)
           if (nulo==1) 
                  cont = cont + 1;  //aqui, apos percorrer uma coluna inteira - nesse caso - e se nulo ainda vale 1, então toda a coluna é nula, e eu posso aumentar o contador de "elementos nulos"
    }
    for (percorrendo todas as colunas)
    {
          nulo = 1
          for (percorrendo todas as linhas)
                  if (A[i][j] =!0)
                         nulo = 0;
           if (nulo ==1)
                 cont = cont + 1;
    }
    E... acho que é isso! imagino que de pra entender... qualquer coisa, pergunta ae! abraço

  6. Cara, tem alguns problemas ai que eu já identifiquei...

    /*laço para somar as linhas*/

    for (i=0; i<linhas; i++)

    for(j=0; j<colunas; j++)

    {

    somaLinhas = somaLinhas + mat1[j];

    somaColunas += somaColunas + mat1[j];

    Eu não conhecia o operando "+=", mas, pelo que eu percebi, seria isso:

    "a = a + b " é igual a " a += b", certo?

    se for isso, acho que ta errada a utilização do +=... !!

    E... nesse caso, percebe, você ta percorrendo a matriz INTEIRA, e armazenando tanto em "somaLinhas" como em "somaColunas" o valor de todos os elementos da matriz somados! e não é isso que você tem que fazer!

    Como TODAS as somas de linhas tem que ser iguais, eu sugeriria algo assim, com "magico" sendo uma variavel indicadora de passagem.

    O pensamento é partir do principio que esse é, sim, um quadrado mágico, e, caso encontrarmos alguma condição que diga o contrario, podemos parar de fazer todas as contas e dizer que o quadrado não é magico!

    portanto, o que eu sugeriria pro caso da "somaLinhas" (e que pra "somaColunas" seria equivalente):

    magico = 1; // 1 = SIM -> estou supondo que o quadrado é magico
    nmagico = 0; //nmagico vai ser o meu "numero magico". Vou supor que a primeira soma da primeira linha é o nmagico. Se for um quadrado magico, minha suposicao não estará errada!
       for(j=0; j<colunas; j++)
            {
                       nmagico = nmagico + mat1[0][j];
             }
    
    for (i=1; i<linhas && magico==1; i++) 
       {
            somaLinhas = 0;
            for(j=0; j<colunas; j++)
            {
                       somaLinhas = somaLinhas + mat1[i][j];
             }
              if (nmagico != somaLinhas)
                     magico = 0; // Aqui, descobri que o quadrado não é magico, e mudo a variavel indicadora de passagem para 0 ( 0 = não )
       }
    Daí, a partir desse ponto, você não precisa mais do primeiro for que eu fiz, pra achar o nmagico. Caso todas as "somaLinha" sejam iguais a "nmagico", você passa pras colunas, faz a soma dos elementos das colunas, no final de cada soma compara com "nmagico", e não se esqueça de zerar "somaColunas" antes de iniciar cada soma! Depois disso, soma a diagonal principal, e... bom, pra diagonal secundaria temos um probleminha! Pra começar, e voltando um pouco, se estamos falando de quadrados, não precisamos de uma variavel "linhas" e outra "colunas", uma vez que esse numero é igual! portanto, apenas pegar um "n" para o quadrado, e usar esse numero como o numero maximo de linhas e de colunas já é o suficiente! Dai, é só percorrer a matriz toda e perguntar
    if (i==j) 
                       somaDP += mat1[i][j]; 
                  
                         if(j=i-2) 
                         somaDS=+mat1[i][j];
    Então, essa segunda condicao ta errada, não? a conficao certa seria
    if (j + i= n) // ou if (j = n-i)

    Não sei de onde você tirou esse "j = i-2", mas enfim, o certo seria isso daí que eu postei!

    E, de resto, voce pode colocar, como adendo, em todas as condições analisadas, um " && magico ==1", pois caso voce ache, em algum ponto do programa, que não é um quadrado mágico, então todas as comparações e contas podem ser deixadas de lado, e na hora de imprimir se é um quadrado magico ou não, basta perguntar "if (magico ==1)"

  7. Bom, se o que você quer é não mostrar a janela nunca, você não devia nem mostrá-la no início do programa... <_<

    mas vamos lá, o que você quer é sumir com a janela, entaum tah ai o codigo:

    ShowWindow(HANDLE_DA_SUA_JANELA,SW_HIDE);
    Facim não é??? agora, se você quer ocultar uma janela pelo título dela, (vamos usar a calculadora como exemplo.), eis o codigo:
    ShowWindow(FindWindow(NULL,"Calculadora"),SW_HIDE);
    E tem gente que gosta de fazer assim também:
    HWND janela = FindWindow(NULL,"Calculadora");
    if (janela>0) ShowWindow(janela,SW_HIDE); else printf("Janela não encontrada.");

    Hehe, eu já fiz muita coisa legal com estas funções...

    Abração

    google -> "c ocultar janela" -> http://scriptbrasil.com.br/forum/index.php?showtopic=130707

  8. Humm... entendi... é, a calculadora do windows arredonda, né... então acho que não vai ser util pra essa sua finalidade!

    Meu... tenta ver outras linguagens... eu só programo em c, e tenho quase certeza de que não dá, não!

    da uma buscada nos outros foruns... enfim, é isso ae...

  9. Dúvidas:

    1º Preciso analisar o problema proposto e definir as estruturas de dados estáticas para a sua resolução

    2º Preciso definir as funções necessárias para a implementação dos quatro primeiros comandos definidos no desafio e o “sair”, utilizando as estruturas de dados com alocação estática de memória definida na Etapa 1.

    3º Preciso fazer um programa que leia um arquivo de entrada, execute todos os comandos presentes nesse arquivo e gere um arquivo de saída, no formato definido anteriormente no desafio.

    Obs: Sou iniciante em programação

    Cara, essas duvidas foi você realmente quem redigiu? Sendo iniciante em programação?

    Enfim, você não pensou nada no problema? não definiu nada?

    Po, aposto que muitos que vão ler este tópicos terão varias ideias, mas o principal é você tê-las! Não acho justo e nem acho que faça sentido você colocar um problema, não abordar nenhuma solução pra ele, e ficar esperando!

    Eu tenho sim algumas ideias de como realizar isso, mas acho que quem tem que ter as ideias é voce!

    Então, eu vou dar algumas ideias. Voce deve ter uma estrutura que represente cada posição, e vai retirando e adicionando elementos em cada estrutura, de acordo com os coomandos. Sugiro 2 coisas para voce usar como estruturas

    -Vetores (na verdade, como serão N vetores, então pode ser uma matriz, inicialmente de 25 x 25 posições, já que 25 é o tamnaho maximo)

    -Listas Encadeadas. Voce sabe o que são listas encadeadas? já ouviu falar? sabe como funciona? De uma procurada, são estruturas bem poderosas, que permitem uma manipulação muito mais "livre" do que vetores ou matrizes.

  10. Cara, não, isso daí é bizarro demais! hehehehehehehe

    Não sei dizer exatamente até onde vai uma variavel "unsigned long int", que acho que seria a maior variável de todas, mas com 1 bilhão de numeros, é bem claro que c não chega lá!

    O VALOR de um long int chega ai na casa de alguns bilhões, mas é o valor! e não um bilhao de numeros!!

    Eu fiz pela calculadora do windows, na vigésima interação, cheguei ao seguinte valor:

    6,7411401254990734022690651047042 * 10^315652 !

    Pra fazer qualquer iteração acima disso, a calculadora do windows ta demorando alguns minutos...! se eu chegar além disso, eu aviso!

    [EDIT]

    Aí, 23 iteração, demorou 10 min, parei por aqui, preciso trabalhar! hahahahahha

    2,0650635398358879243991194945817 * 10^1.262.611

    já com 1 milhão de digitos! com 30 iterações, deve chegar na casa do trilhão!

  11. Agora copiei o codigo e, pela primeira vez, rodei ele!

    heheheheheh

    A coisa é o seguinte, voce precisa zerar as variaveis cada vez que você termina de achar um decimal!

    A variavel "aux" você ta zerando logo antes do loop que usa ela... a variavel temp, não!!!

    o loop 2 e o 3 usam a variavel temp, então, ou no final do loop dos decimais, ou logo antes do loop 2, coloque um

    temp = 0;

    isso funciona!

    (estranho é que ele não ta parando quando o resto vale 0! sempre quando chega na 10a casa decimal! mas enfim, isso não é realmente um problema! é só falar que o seu programa tem uma precisão pre-estabelecida!

    voce pode até pedir pro usuario digitar a precisao que ele quer, antes de tudo... dai você manda o con_decimais ir até o cont_decimais_maximo, que é o valor que o usuario entrou!

  12. Então, as atualizações que eu fiz ali são justamente pra dar conta!

    essas são as contas que cada loop deve fazer, no caso de 1 / 8:

    loop1: 1/8 = 0

    loop2: 0*8 = 0

    loop3: 1%8 = 1

    loop4: 10*1 = 10

    loop5: 10/8 = 1

    loop2: 1*8 = 8 (esse 1, que muda sempre, é decimal achado anteriormente! no caso, é o seu c)

    loop3: 10%8 = 2 (esse 10 é o resto da divisao anterior, multiplicado por 10! no seu programa, é o aux)

    loop4: 10*2 = 20

    loop5: 20/8 = 2

    daí, por isso eu citei as seguinte atualizações:

    inteiro = c;

    n1 = aux;

    tendeu?

  13. Vamos la, de novo!

    O intuito, agora, é a criação de um loop pra ir realizando um decimal após o outro, até que o resto da divisão seja zero, e daí terminamos o numero!

    for(cont=0;n2<=n1;cont++) Loop1: Esse primeiro for calcula a parte inteira

    {

    n2=n2+nc;

    }

    inteiro=cont;

    for(a=0;a<inteiro;a++) Loop2: Esse for faz (dividendo * quociente), pra achar o resto da divisão, então aqui já deveria estar dentro do loop que irá calcular todos os decimais!

    {

    temp=temp+nc;

    }

    for(resto=0;temp!=n1;resto++) Loop3: Aqui nós encontramos o resto da divisao

    {

    temp=temp+1;

    }

    aux=0;

    for(b=0;b<10;b++) Loop4: E aqui fazemos 10*resto, preparando para esse ser o proximo divisor.

    {

    aux=aux+resto;

    }

    Loop5: acha o valor do decimal em questao

    n2=nc;

    for(c=0;n2<=aux;c++)

    {

    n2=n2+nc;

    }

    printf("Resultado: %d,%d",inteiro,c);

    getch();

    return 0;

    }

    Bom, vamos lá:

    Loop1: acha a parte inteira

    LOOP GRANDE (está faltando): esse loop vai achar todos os decimais! nele voce coloca como condição pra ele parar quando o ultimo resto for zero! ou então pra ele parar depois de rodar 10 vezes, ou algo assim. Pois, no caso de uma dizima, ele não vai parar nunca, e isso não é desejado! então coloca algo tipo uma variavel de controle, ou um numero maximo de iteracoes

    dentro do loop grande, teremos os loops 2, 3, 4 e 5!

    Voce só precisa verificar e atualizar as variaveis pra ficar nesse loop de decimais sem problemas...

    então, ficaria algo assim:

    declaracoes de variavel + daclaracao de "cont_decimais"
    aquisição dos dados do usuario
    loop1
    cont_decimais = 0;
    while(resto!=0 || cont_decimais <10)
    {
    loop2
    loop3
    loop4
    loop5
    inteiro = c;
    n1 = aux;
    cont_decimais ++;
    }
    Acho que essas são as duas atualizações necessárias pro seu programa entrar nesse loop e rodar, tudo certo! tenta ai, mas agora deve dar certo! Então, na hora de imprimir o numero, sugiro que, logo apos achar a parte inteira, você de um
    printf("%d,"inteiro);
    A partir dai, coloca no final do loop um
    printf("%d"c;

    E, a medida que ele for achando os decimais, ele vai imprimindo, e imprimindo...

  14. vou responder no seu código, mais ou menos, ta?

    só pra começar, de novo, você não substituiu os %i por %d! isso pode ser essencial! substitua! inteiros são lidos e escritos com %d, e não com %i !!

    int resto; Po, legal, você criou a variavel "resto", mas... me parece que você não usou ela! use, vai ficar mais facil pra eu entender e também pra quem quer que vá corrigir isso!

    int temp;

    int i;

    int d1;

    d1=0;

    temp=0;

    cont=0;

    r=0;

    printf("Qual o primeiro numero: ");

    scanf("%i",&n1);

    printf("Qual o segundo numero: ");

    scanf("%i",&n2);

    nc=n2;

    for(cont=0;n2<=n1;cont++)

    {

    n2=n2+nc;

    }

    r=cont; Aqui é onde achamos o resultado inteiro, certo? então sugiro, aqui, voce ter uma variável que chame "pte_int" e atribui o valor de r a ela

    for(int a=0;a<r;a++) Declarar variaveis no codigo não é legal, apesar de funcionar! sugiro que declare esse a no inicio

    {

    temp=temp+nc ;

    }

    for(i=0;temp!=n1;i++)

    {

    temp=temp+1;

    }

    Bom, aqui temos um ponto em que fizemos a primeiro operacao "resto da divisao", e esse resto está armazenado na variável i !

    Depois desse ponto, o que precisamos fazer é multiplicar este resto por 10, e continuar o processo, que não foi o que você fez! mas, veremos...

    int c;

    c=temp;

    for(int b=0;b<=8;b++)

    {

    c=c+temp;

    }

    Ok, entendi, você só se confundiu! Aqui é a multiplicaçcao por 10, certo? de fato, ao final deste loop, c vai conter 10* o valor de temp. Agora 2 pontos:

    primeiro: ta muito feio o jeito que você escreveu! coloca que c=0, dai de b=0 até b<10, e no loop, c = c + temp. E daí outro ponto, temp, aqui, vale n1! e não o resto da divisao! o resto da divisao, como eu disse, esta armazenado em i ! (você entendeu essa historia de calcular o resto da divisao? entenda bem, que fica mais facil!) Logo, aqui teria que ser feita a conta 10*(resto da divisao), e não é o que está acontecendo!

    for(int d=0;nc<=c;d++)

    {

    d1=d1+d;

    }

    Bom, aqui o negocio ficou confuso!

    1- de onde você tirou d1? pra que ele serve? o que ele armazena?

    2- no loop você atualiza somente o valor de d1, e, indiretamente, o valor de d. Sua condição de parada envolve nc e c, de modo que evidentemente este loop é infinito!

    printf("Resultado: %i,",r);

    getch();

    return 0;

    }

  15. pra começar, você deve usar %d para inteiros, e não %i! não sei nem como isso rodou!

    depois, na impressão, você ta imprimindo

    printf("Resultado: %i,%i",cont);

    você ta imprimendo antes da virgula o cont, e depois da virgula algo não definido! repare! você colocou dois %i e somente uma variavel!

    logo, o proprio computador ta "escolhendo" qual variavel imprimir, e parece que no seu caso, ele imprimiu primeiro cont, que valia 1, depois a virgula, que ta ali expressa no seu printf, e depois um numero aleatorio, que deve ter sido o 5118880!!

  16. Bom, qual parte voce não sabe fazer?

    E, como, exatamente, voce quer que apareça a hora na tela toda do pc? com uma "text box"? ou no proprio "prompt" que aparece quando voce executa um .exe?

    se você quer que apareça na tela preta, já desiste... a tela preta do prompt nunca ocupa a tela inteira do computador, ela tem um tamanho maximo definido, então com ela nunca daria certo...

    Agora com uma caixa de texto que aparece, pode ser que seja possível, mas acho que ainda assim você esbarraria em problemas de diferentes configurações de video!

    uma msg box de 800 X 600 ocuparia muito bem um monitor com essa mesma configuração, mas ficaria bem pequeno em um monitor de 1024 X 768.

    Talvez, se é isso o que voce quer, surja um novo problema que é o de capturar, via C, a configuração atual de video que o usuario está usando, e, a partir dai, fazer uma caixa de texto com esse tamanho, e fazer a impressão do horario baseado nisso também!

    Sinceramente, vejo algumas dificuldades! Pra que, exatamente, voce precisa disso?

  17. como já disse, não manjo muito de compilador! Acho que você deve postar algum novo tópico pra solucionar isso...

    O meu costuma funcionar direto, a partir da instalação...

    pra você ter uma noção, eu instalei o code::Blocks, não consegui compilar, e nem tentei, desinstalei e instalei o Dev! dai consegui compilar de cara e mandei um abraço pro code::Blocks!

    mas, enfim, certeza que tem gente ai que sabe...!

    Vai em ferramentas -> opcoes de compilador.

    Posta num tópico as configuracoes que tão ali, roda o compilador, e escreve no tópico exatamente o que diz o erro, logo logo aparece alguém que manja pra te ajudar!

  18. É como eu disse, uma vez que você já sabe fazer % e /, é só usar o primeiro post que eu falei!

    é um passo pros inteiros, e mais um passo pra cada decimal, aonde o passo é:

    dividendo / divisor = quociente (numero que vai ser "extraído" desse passo. É o numero que você vai aproveitar de cada passo)

    resto da divisao do dividendo pelo divisor = resto

    preparacao pro proximo passo -> novo dividendo = 10* resto

    Com números:

    passo 1

    1/8 = 0

    1%8 = 1

    novo dividendo = 10*1 = 10

    passo 2

    10/8 = 1

    10%8 = 2

    novo dividendo = 10*2 = 20

    passo 3

    20/8 = 2

    20%8 = 4

    novo dividendo = 10*4 = 40

    passo 4

    40/8 = 5

    40%8 = 0 (FIM DO PROGRAMA!)

    E o resultado, tá em negrito: 0,125

    Agora, com relação ao compilador, ptz... eu não manjo muito, não!

    Sugiro, inclusive, que você faça outro post, porque perguntar nesse acho que não vai adiantar muito

  19. Cara, da uma exemplificada melhor em qual ajuda você quer!

    Eu poderia te dar aqui os códigos dos programas que você falou, mas acredito que não seja esse o intúito!!

    Você ta comproblema na lógica da coisa? Saberia fazer isso em outra linguagem?

    Ou seu problema é na linguagem C? você não sabe como criar a função? Nâo sabe declarar ou trabalhar com array? Tem dificuldades para obter dados do usário e imprimir na tela?

  20. Ok, então vou explicar melhor, desculpa ai se foi muito confuso!

    O intúito aqui é realizar a operação %, certo?

    Pois então, temos o Dividendo (número a ser dividido), o Divisor (numero que divide) e o Quociente (resultado) além do resto!

    Dividendo e Divisor são dados. O Quociente você já achou uma forma de fazer. O problema então é achar o resto!

    Vamos pegar o segundo caso ali que eu citei, aonde a divisão é 20 / 8.

    20 / 8, como seu método deve chegar, dá 2!

    Então, minha metodologia pra achar o resto da divisão, é a seguinte (supondo que o valor 2, que é o resultado da divisao, está armazenado na variavel "quociente", que "temp" é uma variavel temporaria, e nc é o numero que divide, no nosso caso, é o 8):

    resto = 0;
    temp = 0
    
    for(i=0; i<quociente; i++)
    temp = temp + nc;
    Neste ponto, teremos em temp o numero (nc*quociente), que não é o nosso divisor! é ligeiramente menor! esse numero difere do nosso divisor pelo resto! (no nosso exemplo, de 20/8, nc vale 8, e quociente vale 2, então (nc * quociente) = 16! que é o que temos armazenado em temp) Dai, pra achar o resto:
    for(i=0; temp!=dividendo; i++)
    temp = temp + 1

    Aqui, o que acontece: a cada loop, temp recebe um icremento de 1. Então, ao final de 4 loops, teremos que temp, que valia 16, agora vale 20, e nós sairemos do for!

    E, na variável i, teremos armazenado exatamente o número 4, que é o resto da divisão de 20 por 8!!

    Então, minha frase ficou bem confusa, mesmo...

    " você faz um loop pra ele armazenar numa variavel temporária 0 vezes o numero 8, e vai somando, num contador, de 1 em 1, até voce chegar no 1, e dessa forma você vai ter o resto da divisão de 1 por 8, que é 1!"....

    Deveria ser:

    " você faz um loop pra ele armazenar numa variavel temporária "QUOCIENTE" vezes o numero 8(DIVISOR), e vai somando, num contador, de 1 em 1, até voce chegar no "DIVIDENDO", e dessa forma você vai ter o resto da divisão de 1 por 8, que é 1!"....

  21. intendi perfeitamente o que voce quer, só não sei se isso existe!

    o problema ta ali, na criação de uma função que recebe um numero indeterminado de parametros...

    existe uma variave que chama ARGV que armazena todos os parametros passados pra uma função. (argument vector)

    Essa variavel é um vetor, de modo que cada parametro fica armazenada em um vetor da funcao... só não me lembro exatamente o nome da função e onde/como eu utilizei ela!

    da uma procurada... entra na internet e ve algo sobre esse ARGV. Se tiver algum jeito de fazer o que voce está pedindo, acredito que necessariamente vai ser usando esta variável!

    (EDIT: ptz, acabei de dar uma olhada, parace que o ARGV serve só para o programa main! teria que achar algo similar para funções normais... agora não sei, tem que procurar!!)

  22. Bom, ok, isso dificulta um pouco, mas a minha ideia acredito que ainda possa ser usada!

    no meu "programa" que eu te passei, eu uso 3 coisas: /, % e *

    o * é facil não usar, todas as vezes eu multipliquei por 10, então é só somar 10 vezes o mesmo numero!

    o / fica facil também, voce mesmo já descobriu como fazer!

    o nosso problema seria, então, replicar o operador %.

    Mas acho que você não vai ter muito problema... no seu caso, após uma divisão simples, é só fazer um loop somando r-1 vezes o valor nc (esse menos ai pode usar, né???). depois, vai somando de 1 em 1 um contador até os numeros ficarem iguais, e pronto, nesse seu contador vai estar armazenado o resto da divisão!

    tendo as operações por si só conhecidas, cria uma função pra cada uma delas, e é só aplicar a minha ideia!

    entendeu?

    ó, resumidão:

    dividir, como eu disse, você já sabe, não?

    então, pro nosso teste, temos, como eu disse, 1 / 8.

    Com a sua divisão ele vai dar esse resultado como sendo 0 (se a sua divisao estiver certa!)

    depois, você faz um loop pra ele armazenar numa variavel temporaria 0 vezes o numero 8, e vai somando, num contador, de 1 em 1, até voce chegar no 1, e dessa forma você vai ter o resto da divisão de 1 por 8, que é 1!

    então a parte dos inteiros já está feita, e começamos a parte decimal.

    Num loop, faça somar 10 vezes o resto da divisão (no nosso caso, seria 10 * 1, e teríamos 10)

    dai, com a sua propria divisão, dividiremos 10 por 8, chegando ao resultado 1. Esse vai ser o primeiro decimal!!

    Agora, para achar o resto da divisão: como eu disse acima, some r vezes (no caso, 1) o valor 8, e vá somando um contador até os numeros serem iguais, até voce chegar no 10! no caso, 8 + 2 = 10, então o contador vai ter o valor 2 (que é o resto da divisão de 10 por 8!!)

    proximo decimal, é só repetir o processo! vou falar passo a passo, mais rapido:

    pega o ultimo resto da divisao, que é 2, e multiplica por 10, no loop, tendo 20

    divide 20 por 8 e temos o proximo decimal, que é 2!!

    o proximo resto da divisao: soma r vezes (que é 2) o numero 8, chegando em 16. soma de 1 em 1 um contador, até 20, e temos 4, que é o resto da divisão

    proximo decimal:

    10* o resto da divisao, no loop, da 40

    40 dividido por 8 da 5, que é o ultimo decimal!

    faz r vezes (no caso, 5) 8 e vai somando de um em um num contador até chegar em 40. nesse caso, o contador vale zero, e pode parar o programa!

    (como eu disse, isso tudo funcionará perfeitamente num caso com divisões exatas... sem considerar dizimas e numeros irracionas)

  23. Cara, pensando aqui, um jeito de você se obter os decimais é multiplicar o numero que vai ser difivido por potencias de 10!

    Não sei se você já vai ter a precisão pre-determinada de quantas casa você tem que ter! se for esse o caso, acho que fica facil

    Pra comecar, caso voce não conheça, o operador % chama "resto da divisao por". Então:

    10%1 = 0 (o resto da divisão de 10 por 1 é zero)

    10%8 = 2 (o resto da divisão de 10 por 8 é 2)

    e assim vai...

    Bom, fazendo um exemplinho, temos 1 / 8 = 0,125

    Por exemplo, com 3 casas decimais, primeiro você divide o um numero pelo outro, normalmente.

    1 / 8 = 0

    1 % 8 = 1

    Dai multiplica o resto da divisao por 10, e depois divide de novo pelo 8.

    10/8 = 1

    10%8 = 2

    Dai pega, de novo, o resto da divisao, multiplica por 10 e divide de novo por 8!

    20/8 = 2

    20%8 = 4

    Mais uma vez, o mesmo processo!

    40/8 = 5

    40%8 = 0

    E pronto! o resultado de 10/8, 20/8 e 40/8 vai te dar os decimais..

    Cara, isso, na verdade, não passa da multiplicação que a gente faz no papel, ensinada pra um computador!

    Para pra pensar, e faz a divisão ai na mão de 1 por 8... o processo vai ser EXATAMENTE esse: divide o numero, pega o resto, multiplica por 10 (o famoso "abaixa o zero!"), divide de novo, pega o resto, multiplica por 10, divide de novo, e assim vai...

    Voce pode ordenar seu programa a parar até que ele encontre um 0 no resto da divisão, no caso do numero ser exato.

    No caso de dízimas periódias, acredito que você tem que fazer um tratamento um pouco mais complexo..

    Bom, ainda faltam alguns detalhes que você vai demorar um pouco, mas deve conseguir fazer, como, por exemplo, como "re-montar" o numero depois, com as casas decimais e tudo mais... mas, enfim, a ideia ta ai!

×
×
  • Criar Novo...