Ir para conteúdo
Fórum Script Brasil

== Douplus ==

Membros
  • Total de itens

    203
  • Registro em

  • Última visita

Tudo que == Douplus == postou

  1. Isso acontece porque você esqueceu de passar por referência as variáveis para o scanf() na função abrir_conta(): // ... printf("Valor do cheque especial: "); scanf("%lf", v[*pn].cheque); printf("Saldo inicial: "); scanf("%lf", v[*pn].saldo); // ... Mude para: // ... printf("Valor do cheque especial: "); scanf("%lf", &(v[*pn].cheque)); printf("Saldo inicial: "); scanf("%lf", &(v[*pn].saldo)); // ... Mude também na função consultar(): printf("Saldo da conta: %.2lf\n", v[i].conta); para: printf("Saldo da conta: %.2lf\n", v[i].saldo);
  2. == Douplus ==

    Concatenacao

    Com todo prazer! A lógica é a seguinte: dividir o número em questão por dois até que ele seja igual a zero e juntar os restos em ordem inversa. Segue um exemplo: #include <stdio.h> #include <string.h> int main(void) { int i = 7; unsigned char num = 0x0F, vetor[9] = "00000000"; if (!num) { printf("0"); return 0; } while (num) { vetor[i--] = num % 2 + '0'; num /= 2; } strcpy(vetor, (vetor + i + 1)); printf("%s\n", vetor); return 0; }
  3. O programa já está quase totalmente especificado, restou para você o exercício da parte massante. Pense assim: 1-) O problema me dá informações, informações são armazenadas em variáveis, portanto: int agencia, conta, senha, saldo, cheque_esp; char *titular; /* Ou ainda em estrutura, se souber usar, facilitará bastante: */ typedef struct conta { int senha, saldo, chequeEsp; char *titular; } Conta; /* Depois em main crie um array onde o número do elemento corresponderá ao número da conta */ // ... int main(void) { Conta conta[max_de_contas]; // ... } /* Ou então use um array para ponteiros e para deletar uma conta mude o valor de conta[num_da_conta] para NULL: // ... Conta *conta[max_de_contas]; // ... 2-) O enunciado especifica várias ações, ações podem ser traduzidas como funções perfeitamente nesse caso, portanto vá definindo as funções: /* abrir uma nova conta */ conta *criarConta(void); // Dados perguntados na função. /* consultar o saldo de uma contra */ int retornaSaldo(Conta * conta); /* fazer um saque */ void saque(Conta *conta); // O valor é perguntado na função. /* fazer um depósito */ void deposito(Conta *conta); // O valor é perguntado na função. /* encerrar uma conta */ void deletarConta(Conta **agencia); /* calcular o saldo médio de todas as contas */ int saldoMedio(Conta **agencia); /* calcular o valor total em depósito em uma agência */ int valorTotal(Conta **agencia); /* ler dados de arquivo */ void lerArquivo(Conta **, char *nomeDoArquivo); /* gravar dados em arquivo */ void gravarDados(Conta **, char *nomeDoArquivo); 3-) Fazer main() fica mais fácil: int main(void) { Conta *conta[max_de_contas]; char entrada; FILE sysFile = fopen("sysfile.dat", "r"); // Abre o arquivo de sistêma /* Não há nenhuma conta a princípio */ memset(conta, NULL, max_de_contas); while ( !feof(sysFile)) { /* Busca contas existentes no arquivo */ } /* Lê arquivo do sistema para procurar contas */ // [EDITADO 2] /* Pede o login */ /* Autentica usuário */ //[/EDITADO 2] do { /* Limpa a tela (não é realmente preciso) */ /* Mostra o menu */ /* entrada = decisão do usuário */ switch (entrada) { /* Verifica o que foi pedido e chama a função correspontente */ }; } while (toupper(entrada) != 'S'); // Pressupondo que 'S' seja o comando para sair } /* Encerra o programa. */ Bingo! [EDITADO] - Só uma observação, você pode chamar Conta ** de Agência. Talvez compense usar um typedef. [EDITADO 2] - Crie um sistema de login em main!
  4. O código uma vez compilado não é alterado na execução, aliás, ele se perde no executável. C não é uma linguagem interpretada, ou de script, portanto se você quer que seu programa se comporte de maneira diferente de acordo com uma equação dada (por exemplo) você precisará, como disse o Durub, um interpretador de expressão, ou recompilar o código pra cada expressão que você tiver em mente. Um bom método pra facilitar a "recompilação" é o uso do #define para macros ou constantes. No seu caso você poderia fazer algo do gênero: #define EXPRESSAO(x) x + 2 Depois apenas mude a expressão em questão. Mas se você estiver procurando um meio de interpretar dentro de seu programa uma expressão dada, por exemplo, colocar a expressão em postfix acho que é a melhor opção para se trabalhar. Por exemplo: 2 + 5 * (3 - 1) ficaria: 2 5 3 1 - * + método de resolução: + / \ 2 * / \ 5 - / \ 3 1
  5. int gerar() { int i,j,z,r,numero,chaves[12],mod[12], tab_hash[17] = { 0 }; /* inicializar o gerador de números aleatórios */ /* com time(NULL) */ numero=rand() % 8201; printf("Numeros Gerados\n"); for (i=0; i<12; i++){ chaves[i] = rand() % 6200 + 2000; printf("%d ", chaves[i]); } //-------------------------------------------------- printf("\n\n\tMod dos numeros gerados\n\n"); for(i=0;i<12;i++){ mod[i] = chaves[i] % 17; printf(" %d ",mod[i]); } //-------------------------------------------------- printf("\n\n\tTabela Hash\n\n"); for (i = 0; i < 12; i++) tab_hash[mod[i]] = chaves[i]; for (i = 0; i < 17; i++) printf(" %d ", tab_hash[i]); printf("\n"); } [EDITADO] Ah, e crie uma lista encadeada para tratar as duplicatas se elas te incomodam, acho que é o meio mais prático.
  6. Olá denovo, Thiago. No seu código do gerador de jogos da Sena eu havia reparado em algo que acabou sendo uma solução prática. Entretanto, vendo esse seu código me parece que você esqueceu que todo vetor começano elemento 0 e não no 1. Portanto: int vetor[3]; criará um vetor de inteiros con três elementos, sendo eles: vetor[0] vetor[1] vetor[2] ao tenta acessar vetor[3] você estará acessando uma parte da memória que não está alocada para o vetor e isso pode ser perigoso, embora em alguns casos seja muito útil e legal para brincar com a memória. Seu código aqui: for(i = 1; i <= 3; i++) { for(j = 1; j <= 3; j++) { matriz[i][j] =' '; //esvazia os vetores. verifica[i][j]=' '; } } e aqui: for(jogada = 1; jogada <= 9; jogada++) { printf("\n"); for(i = 1; i <= 3; i++) { for(j = 1; j <= 3; j++) { Estão fazendo isso. Para arrumar seu código de maneira prática, mude: char matriz[3][3] para: char matriz[4][4] Compilei e funcionou direitinho. Até mais!
  7. Boa noite, Thiago, e bem vindo ao fórum. Dei uma olhadela no seu código... De repente, me lembrei de pilhas! Heh. Eu pensei mas não testei, na minha cabeça funciona. Veja o que acha. Vamos direto no exemplo: /* DEFINIÇÃO DA PILHA */ struct stack_node { int num; int times; stack_node *next; }; typedef stack_node *Stack; /* FIM DA DEFINIÇÃO DA PILHA */ /* FUNÇÕES DA PILHA */ // Inicializa a pilha com NULL void init(Stack stk) { stk = NULL; } // Insere um elemento no topo da pilha void push(Stack, int val, int repetitions); // Retira um elemento do topo da pilha void pop(Stack, int val*, int repetition*); // Retorna 1 se a pilha está vazia short isEmpty(Stack stk) { return (stk) ? 1 : 0; } /*FIM DAS FUNÇÕES DA PILHA */ int main(void) { ... Stack stk; // Instancia uma pilha cujo topo armazenará o número com mais repetições init(stk); // Inicializa a pilha ... ... // Começo do loop: for (i = 1; i <= 60; i++) { int val, rep; // Variáveis auxiliares -> valor, repetições Stack tmpstk; // Declara uma pilha no escopo do loop init(tmpstk); // tmpstk = NULL if (!isEmpty(stk)) { while (cont_vezes[i] <= stk->times) { // Se nº de repetições for maior que o último maior: pop(stk, &val, &rep); push(&tmpstk, val); // Desempilha e guarda na outra pilha (ordem inversa). } while (!isEmpty(tmpstk)) { pop(tmpstk(&val, &rep)); push(stk, val, rep); // Reempilha } if (cont_vezes[i] > stk->times) // Se nº de repetições for menor que o último maior: push(stk, i, cont_vezes[i]); // Guarda em cima. } else // Se a pilha estiver vazia, isto é: numero 1 push(stk, i, cont_vezes[i]); // Coloca o 1 } //FIm do loop. //Mostra os valores printf("\nValores: "); while (!isEmpty(stk)) ptintf("%d ", pop(stk)); return 0; } Funciona assim, pegando seu exemplo: temos o loop, nele são inserindo os valores na pilha, suponha só os numeros que você usou como exemplo e vamos analisar que acontece: PUSH-> insere [1(numero), 50(repetição)] no topo (15 < 50) // Número 2 POP-> retira [1,50] do topo e põe na pilha temporária PUSH-> insere [2, 15] no topo PUSH-> insere [1, 50] no topo (30 < 50) // Número 10 POP-> retira[1, 50] do topo (30 > 15) PUSH-> insere[10, 30] no topo PUSH-> insere[1, 50] no topo .HISTÓRICO DA PILHA: [1, 50] [1, 50] [10,30] [10,30] VAZIO [1, 50] VAZIO [2, 15] [2, 15] [2, 15] [2, 15] [2, 15] Desempilha quando o úmero de repetições for maior ou igual ao que está sendo testado até que este se torne maior que o do topo. Reempilha os valores retirados. P. S.: Na linha while (cont_vezes[i] <= stk->times) { // Se nº de repetições for maior que o último maior: a condição é "<=" para que se haja dois valores com o mesmo numero de repetições sejam empilhados em ordem, de maneira que o valor mais acima seja o menor.
  8. == Douplus ==

    8-puzzle em c

    Como não entro aqui faz um tempo, só ví seu tópico hoje. Não sei se ainda está em tempo, espero que tenha conseguido resolver. De qualquer modo, dei uma completada no código, estou com muito sono e está muito tardepara explicar os acrécimos, mas dei uma leve comentada no código. #include <iostream> using std::cout; #include <windows.h> // Não sei porque a próxima linha deu certo no Dev-C++, juro que não sei, descobri por acaso. extern "C" { int getch(void); } void gotoxy(int lin, int col) { HANDLE hOut; COORD Position; hOut = GetStdHandle(STD_OUTPUT_HANDLE); Position.X = col; Position.Y = lin; SetConsoleCursorPosition(hOut,Position); } void desenha_caixa() { cout.flush(); gotoxy(0,0); cout<<"Quebra-cabeca";cout.flush(); gotoxy(4,2); cout<<"\332\304\304\304\302\304\304\304\302\304\304\304\277";cout.flush(); gotoxy(5,2); cout<<"\263 \263 \263 \263";cout.flush(); gotoxy(6,2); cout<<"\303\304\304\304\305\304\304\304\305\304\304\304\264";cout.flush(); gotoxy(7,2); cout<<"\263 \263 \263 \263";cout.flush(); gotoxy(8,2); cout<<"\303\304\304\304\305\304\304\304\305\304\304\304\264";cout.flush(); gotoxy(9,2); cout<<"\263 \263 \263 \263";cout.flush(); gotoxy(10,2); cout<<"\300\304\304\304\301\304\304\304\301\304\304\304\331";cout.flush(); } void coloca_val(char mat[][3]) { for (int l = 0; l < 3; l++) for (int c = 0; c < 3; c++) { gotoxy (5+l*2,4+4*c); printf ("%c",mat[l][c]); } } int verifica (char tentativa[][3],char objetivo[][3]) { int i,j; for (i=0;i<3;i++) for (j=0;j<3;j++) if (tentativa[i][j]!=objetivo[i][j]) return 0; return 1; } /* Função que procura a posição do numero requisitado na matriz, retorna false se não encontrou, se encontrou copia os valores para col e lin*/ bool procura_numero(char puzzle[][3], char val, int &col, int &lin) { for (col = 0; col < 3; col++) for (lin = 0; lin < 3; lin++) if (puzzle[col][lin] == val) return true; return false; } bool move (char tenta[][3]) { char valor; int i,j,c,l,; gotoxy(11,1); cout<<"\nValor a ser movido:";cout.flush(); valor = getch(); if (valor == 's' || valor == 'S') // 's' ou 'S' sai do programa. exit(0); if ((valor < '0') && (valor > '9')) // Se a entrada for inválida não faz nada return 0; if (!(procura_numero(tenta, valor, c, l))) // Passa c e l por referência return false; if ((c < 2) && (tenta[c + 1][l] == ' ')) { // Checa se pode ir para frente. tenta[c + 1][l] = tenta[c][l]; tenta[c][l] = ' '; return true; } if ((c > 0) && (tenta[c - 1][l] == ' ')) { // Checa se pode ir para trás. tenta[c - 1][l] = tenta[c][l]; tenta[c][l] = ' '; return true; } if ((l > 0) && (tenta[c][l - 1] == ' ')) { // Checa se pode ir para cima. tenta[c][l - 1] = tenta[c][l]; tenta[c][l] = ' '; return true; } if ((l < 2) && (tenta[c][l + 1] == ' ')) { // Checa se pode ir para baixo. tenta[c][l + 1] = tenta[c][l]; tenta[c][l] = ' '; return true; } return false; // Se o movimento for inválido não faz nada. } int main() { char certa[3][3]= { { '1', '2', '3' }, { '4', '5', '6' }, { '7', '8', ' ' } }; // Espaço para facilitar a saída char err[3][3]= { { '4', '1', '3' }, { '7', '2', '5' }, { '8', '6', ' ' } }; // ... O mesmo aqui printf ("Para sair digite S"); while (!verifica (err,certa)) { desenha_caixa(); coloca_val(err); move(err); } gotoxy(12,5); cout<<"Parabens!\n";cout.flush(); return 0; } Detalhe: A linha extern "C" { int getch(void); } funcionou por mero acaso, estava criando uma versão de getch em Assembly porque o Dev-C++ não possui uma. Eu criei a função e exportei, mas esqueci de compilar com o arquivo objeto da função e funcionou :wacko: , daí descobri que não precisa dela. Não entendi... [EDITADO] De quaquer jeito, se você precisar de uma versão de getch, essa foi a que fiz: int getch(void) { char chkkbstatus[5] = {0xB4, 0x00, 0xCD, 0x16, 0xC3 }, (*funcptr)(void) = reinterpret_cast<char(*)(void)>(reinterpret_cast<int>(chkkbstatus)); return ((*funcptr)()); } Dá erro na execução se compilado no Dev-C++, mas no DJGPP funciona bem. Até mais!
  9. == Douplus ==

    Brincadeira!

    Olá freqüentadores do Forum C, C+ ! As vezes me flagro estudando algumas coisinhas sobre como funcionam, em níveis mais baixos, os programinhas que eu compilo, isso é, depois que eles deixam de ser códigos-fonte e passam a funcionar mágicamente. Acontece que nunca tenho com quem conversar sobre esse tipo de coisa e contar o que eu aprendo. Pois bem, decidi fazer isso agora e através de uma brincadeira, heheh... Brincadeira Vamos começar com um simples código fonte em C: //malcriado.c #include <windows.h> int WINAPI WinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArg, int nFunsterStil) { MessageBox(NULL, "E a brincadeira começa...", "MalCriado", MB_OK); MessageBox(NULL, "Babaca!", "Hunpf", MB_OK); return 0; } É isso mesmo, um programa que insulta o usuário, heheheheheheheh... Vamos ensinar-lhe bons modos! :) Proposta Ensinar boas maneiras ao programa mal criado por mim! Compilar este programinha e fuçar a API do Windows e o MSDN para criar um outro programa em C/C++ que altere o insulto para um elogio ou uma palavra / frase agradável em tempo de execução. Vão tentando que um dia postrei a minha solução, vou ver como a brincadeira corre e marcar um dia para colocar a minha solução. Enquanto isso peço para quem descubrir postar a solução encontrada aqui. Dicas 1- O programa malcriado cria duas Message Boxes, a primeira é para dar tempo de o usuário rodar o programa que fez que injeterá a nova palavra no processo. 2- http://msdn.microsoft.com/en-us/library/ms684847(VS.85).aspx 3- Você vai precisar de um debugger ou um editor ou algo que te dê o endereço da mensagem no processo. Boa sorte! [EDITADO] Se vocês acharem melhor me manarem as soluções por mensagem ou por e-mail para que não perca a graça após o primeiro conseguir é uma boa idéia, dessa maneira vou editando o tópico para adicionar o nome dos membros que já conseguiram. Mas não sei, me digam o que acham melhor por favor.
  10. Tente também: int *y[5]; y[0]= x;
  11. Só me diz uma coisa, os dados de velocidade apresentados no final do exercício devem coincidir com os resultados do programa a ser feito?
  12. Eu gosto de macros :) #include <stdio.h> #define DIFFERENCE(x, y) (x > y) ? (x - y) : (y - x) int main(void) { int n1, n2, dif; printf("Entre com dois inteiros: "); scanf("%d%d", &n1, &n2); dif = DIFFERENCE(n1, n2); if (!dif) printf("\a\tEles não podem ser iguais =)"); else printf("\tA diferenca e: %d", dif); return 0; }
  13. Boa tarde! Fabiofill, o que você quer é que o programa reconheça os valores ou que eles fiquem legíveis com um editor de texto? A questão é: o valor numérico de um caractere geralmente difere do valor que ele corresponde, logo: 2 != '2' . O fato é que a representação de '2' - como caractere tem seu valor numérico específico, em ASCII é 50. Gravando simplesmente o valor 2 em um arquivo, ao abrir com um editor você lerá o caractere correspondente a 2 em ASCII (nesse caso o quadrado). Para gravar um caractere você não necessita de escrita binária, logo a função fprintf funciona perfeitamente. Contudo, você já sabe como gravar dados em um arquivo, cabe a você decidir se o leitor será o usuário ou o computador. Até a próxima!
  14. Boa noite. Fabiofill, você não deve tratar o número como se fosse uma string nesse caso. Portanto recomendo que use escrita e leitura binária ("wb" e "rb") com as funções fread e fwrite; cheque o uso dessas funções em http://www.cppreference.com/stdio/fwrite.html ou em outro site, este é um site bom de referência que eu recomendo, mas tem também o http://www.cplusplus.com . Esse problema eu resolvi pra você #include <stdio.h> #include <stdlib.h> int main(void) { int num_coin; FILE *coin = fopen("arq.txt", "wb"); if (coin == NULL) { perror("Erro abrindo banco de fichas para escrita."); exit(1); } scanf("%d", &num_coin); fwrite(&num_coin, sizeof(int), 1, coin); /* cheque no site de referência os parâmetros */ fclose(coin); coin = fopen("arq.txt", "rb"); if (coin == NULL) { perror("Erro abrindo banco de fichas para leitura."); exit(1); } num_coin = 999; /* Só para garantir que o valor será realmente lido do arquivo. */ fread(&num_coin, sizeof(int), 1, coin); printf("Dado lido: %d\n", num_coin); return 0; }
  15. Certifique-se de quem em nenhuma ocasião ocorra que (1+exp(-in)) seja igual a zero. Até mais!
  16. == Douplus ==

    Sucessor

    Minha maneira: #include <stdio.h> int main(void) { int input; scanf("%d", &input); printf("%d\n", (input + 1) % 61); return 0; } Abraços!
  17. == Douplus ==

    Problema C++

    Boa noite, Keldon. Embora os construtores CD tenham valores default para seus argumentos, o compilador C++ não está conseguindo interpretar para qual dos argumentos deve ser passado o valor que você determinou. Quando se usa argumentos default, os mais improváveis de se passar devem estar no final da lista, seguindo uma ordem de importância. No seu caso, o parâmetro double de CD::CD é o segundo, provavelmente você o está chamando de maneira semelhante a esta: CD(double_value); O compilador procurará o construtor CD::CD(double), porque no seu construtor o parâmetro double é o segundo e não o primeiro.
  18. Loguei dessa vez... Bom, repare na sua função saida(): saida() { printf("\n"); printf("\n"); printf("O resultado entre A eB = %f",r); printf("\n"); fflush(stdin); getche; } getche é simplesmente um handle para a função, use a sintaxe adequada para chamar funções: (...) getche(); Outra coisa, note que nas funções: rotsoma, rotsubtracao, rotmultiplicacao e rotdivisao você invoca saida(). no laço switch de main() o programa chama as rotinas de operações e invoca saida() novamente. Acho que é isso, até a próxima!
  19. == Douplus ==

    ==null

    Boa tarde, Felipe Pode-se observar que o loop trabalha com uma lista e seu objetivo é mostrar uma identificação (nome?) de cada passageiro. Se esta for a intenção, pode haver alguns erros na implementação. O primeiro pode ser adimitir que o primeiro elemento da lista possa ser nulo. Pode-se testar a condição antes da primeira execução do código: while ((corrente->seg)== NULL) { printf( "%s", corrente->passageiro); corrente = corrente->seg; } O segundo erro pode ser a própria condição do laço, while ((corrente->seg)== NULL); a condição deve ser verdadeira quando o ponteiro da lista estiver apontando para um elemento setado e não um nulo. O loop infinito ou erro de segmentação que pode estar ocorrendo é caso o primeiro elemento ser nulo e se tentar exibir seus dados (erro de segmentação), e "corrente" de tal modo é sempre nulo, o que causa a repetição infinita. Acertando a condição o código fica: while ((corrente->seg)!= NULL) { printf( "%s", corrente->passageiro); corrente = corrente->seg; }
  20. Desculpe Mariana, mas está certinho. Verifique se você não esqueceu de incluir algum header. Quanto ao vetor em ordem inversa de armazenamento, use um laço for inicializando i = 14 que o vai decrementando. printf("\n Ordem inversa: "); for (i = 14; i >= 0; i--) printf("%d ", vet[i]);
  21. == Douplus ==

    Lista Dinâmica

    Olá Shinzo8, O problema no seu código está justamente nos comandos printf() que estão mostrando ambos o primeiro valor da lista. Creio que faltou uma função para retirada desse valores, como esta: int retira_lista(nodo **N, int dado) { nodo *prev, *curr, *aux; if (*N == NULL) // Se vazia... return 0; // retorna 0 else { // Senão: prev = *N; curr = (*N)->prox; while (curr != NULL && curr->dado != dado) { // Elemento == dado prev = curr; // Senão vai pro próximo curr = curr->prox; } if (curr != NULL) // Se encontrou aux = curr; curr = prev; // Exclui o elemento free(aux); // Libera espaço na memória return dado; // Volta o dado encontrado } return 0; // Senão volta 0. } As chamadas a printf() ficariam: printf("Primeiro dado %d", retira_lista(&lista, valor)); printf("Segundo dado %d", retira_lista(&lista, valor1)); Falou!
  22. Muito bem observado Decio. Os operadores << e >>, são usados para reslizar as operações SHL(Shift Left) e SHR(Shift Right), elas são sobrecarregadas nas bibliotecas de C++ para trabalharem com objetos ostream e istream. Até mais!
  23. Só uma observação: Ao declarar uma variável int, você estará alocando um grande espaço de memória, no caso do GCC: 32 bits. Isso é muito mais do que você precisa, se seu objetico é usar somente um único bit, e setá-lo como zero ou um. Recomendo que você use uma variável de tamanho menor, um short int por exemplo, você ocupará apenas 2 bytes se compilar no GCC. VOcê até poderia trabalhar com chars que ocupam somente 1 byte da memória, mas é meio chato trabalhar com valores numéricos em variáveis char no C++. Realmente, eu não sei se seria possível alocar somente um único bit em um programa C++, se alguém souber, por favor poste aqui. Obrigado.
  24. Bem, é um método de ordenação que me parece familiar, parece o Bubble Sort(se não for), não tenho como conferir no momento. Mas, concentremo-nos em analisar o código: #include <iostream> #include <iomanip> using namespace std; // Sem comentários... Na função principal, temos as declarações das variáveis, e finalmente o que nos interessa: for ( i = 0; i < arraySize; i++ ) // Mostra o array cout<< setw(4) << a[i]; // na ordem original. for ( int pass = 0; pass < arraySize -1; pass ++ ) // Loop que // repetirá 8 // vezes. for ( i = 0; i < arraySize - 1; i++ ) // Em cada repetição // indicada pelo loop // loop anterior, // haverá 8 // repetições. if ( a[ i ] > a[ i + 1 ] ) // Compara o valor da posição { // original com o valor da //próxima posição do array. // Se for maior, inverte os valores, dexando o valor menor na // posição indicada por a[i], e o valor maior na posição //indicada por a[i+1]. hold = a[ i ]; a[ i ] = a[ i + 1 ]; a[ i + 1 ] = hold; } Nosso array a, tem os elementos: "2, 6 ,4 ,8 ,10, 12, 89, 68, 45, 37", trabalharemos somente com: "arraysize = 4", "a[arraysize] = {2, 6, 4, 8, 1}". Escolhi esses valores para fazer uma melhor representação. Represenando: Primeira repetição: compara: 2, 6; 2 < 6; Então não faça nada. Compara 6, 4; 6 > 4; Então: hold = 6; a[i] = a[i+1]; // 4 a[i+1] = hold; // 6 ---PAUSA--- Nosso array está: 2, 4, 6, 8 e 1. Prosseguindo... Compara 6, 8; 6 < 8; Não faça nada. Compara 8, 1; 8 > 1; Então: hold = a[i]; // 8 a[i] = a[i+1]; // 1 a[i+1] = hold; // 8 Nosso array: 2, 4, 6, 1 e 8. ontinuando: SEGUNDA REPETIÇÃO: 2 < 4, não faça nada. 4 < 6, não faça nada. 6 > 1. Substituindo: a[i] = 1; a[i+1] = 6 6 < 8, não faça nada. Nosso array( a ): 2, 4, 1, 6 e 8. Bem, acho que já deu para ter uma idéia, o primeiro loop repetirá mais 2 vezes, quando o valor "1" finalmente chegar à primeira posição do array, é um método um pouco demorado, mas eficaz, como você perceberá ao executar o programa. OBS.: Editei o post porque os comentéarios ficaram desorganizados nas linhas, quando você está montando o post não aparenta nenhuma desoganização, mas quando você posta.. OBS².: Editei denovo. O visualizar também engana a gente ;-) Até mais!
  25. Bem, não sei direito qual é o seu caso, mas existem metodos de ordenação de vetores, um dos mais conhecidos é o bubble sort, este consiste em comparar um elemento com o próximo, se o primeiro for maior que o segundo, os valores são trocados de posição. faz isso para cada par de elementos sendo um vizinho do outro, até percorrer todos os elementos. Repete todo o processo deixando o último elemento de fora, repete de novo deixando o último elemento de fora, até não sobrar mais elementos no array para se fazer comparação. Exemplo: Supondo que um array de 6 elemtentos tenha os valores 1, 6, 4, 5, 3, e 2, nessa ordem. Compara 1 com 6, com 6 é maior não muda nada de posição. Compara 6 com 4, espere, 6 é maior do que 4, substitui: 1, 6, 4, 5, 3, 2 para 1, 4, 6, 5, 3, 2 Compara 6 com 5, 6 é maior que cinco, após a substituição temos: 1, 4, 5, 6, 3, 2 Compara 6 com 3, 6 é maior do que 3, substitui: 1, 4, 5, 3, 6, 2 6 é maior que 2, então: 1, 4, 5, 3, 2, 6 Bom, o 6 é o maior dos elementos, agora vamos ver qual é o maior dos cinco restantes: 1, 4, 5, 3, 2 4 é maior do que 1, então não faz nada. 4 é menor do que 5, então não faz nada. 5 é maior do que 3, substitui: 1, 4, 3, 5, 2 5 é maior do que 2, substitui: 1, 4, 3, 2, 5 O segundo maior número é cinco, então repete todo o processo e deixa o 5 de fora. Bem, acho que já deu para entender, se quiser um exemplo de função em C++ para isso, é só avisar. Até mais!
×
×
  • Criar Novo...