TGmarks Posted April 12, 2013 at 09:23 PM Report #503029 Posted April 12, 2013 at 09:23 PM Caros amigos, estou a tentar fazer um programa que pede ao utilizador para introduzir palavras para um array, depois fazer o mesmo para um segundo array, e no final terá que procurar a penúltima palavra que foi inserida no segundo array e, caso esta exista no primeiro removê-la. aqui está o código que eu fiz até agora: import java.util.*; /** * Escreva um programa que leia uma série de palavras terminada por “fim” para um array. Posteriormente, o programa deverá ler mais uma série de palavras terminada por “ok”. O programa deverá verificar se a palavra inserida imediatamente antes da palavra “ok” existe no array e se existir deverá removê-la. * * @author Tiago */ public class fimEok { public static void main (String args[]) { String[] palavras, palavras2; palavras = new String[1000]; palavras2 = new String[1000]; System.out.println("Insira uma série de palavras, para terminar inserir fim"); for (int i = 0; i < 1000; i++){ Scanner input = new Scanner (System.in); palavras[i] = input.next(); if (palavras[i].equals("fim")){ System.out.println("Insira outra série de palavras, para terminar inserir ok"); for (int x = 0; x < 1000; x++){ palavras2[x] = input.next(); if (palavras[x].equals("ok")){ //pára de ler array //código para procurar palavra anterior a "ok" e eliminá-la no 1º array System.out.println(palavras[i]); //imprimir o array sem a palavra removida } } } } } } As minhas dúvidas são: 1º como é que eu vou buscar o penultimo valor? pode-se usar por ex. palavras-1 ?? 2º como faço uma procura no array? 3º como se apaga uma entrada no array? Desde já agradeço qualquer ajuda.
HappyHippyHippo Posted April 12, 2013 at 09:26 PM Report #503031 Posted April 12, 2013 at 09:26 PM antes de pensar nesses casos, deverias estruturar melhor a a tua aplicação, teres ciclo dentro de ciclo (quase) nunca é uma boa solução ... e já agora olha bem o número de ciclos que estás a executar IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Jabba Posted April 12, 2013 at 11:19 PM Report #503036 Posted April 12, 2013 at 11:19 PM Deixa-me sugerir que alteres os teus ciclos for por ciclos while. Com esses ciclos vais pedir ao utilizador 1000*1000 palavras e não é isso o pretendido, penso. Com um while podes meter uma segunda condição de paragem, muito mais eficiente neste caso porque evitas os ciclos encadeados. Quanto as dúvidas: 1º palavras[palavras.length-2]; 2º visto que o array não está organizado, terás de o percorrer até encontrares a palavra; 3º num array é díficil... talvez colocar esse elemento a null.
HappyHippyHippo Posted April 13, 2013 at 05:19 AM Report #503046 Posted April 13, 2013 at 05:19 AM 1º palavras[palavras.length-2]; nop. se escreveu a palavra fim/ok antes de char a 1000 palavras então a penúltima palavra não é dada pela essa instrução. é necessário guardar o número de palavras guardadas 3º num array é díficil... talvez colocar esse elemento a null. colocar a null não +e solução pois irá ficar com um "buraco" no array é necessário "mover" as palavras para o seu novo local ou ter um terceiro array somente com as palavras aceites IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
TGmarks Posted April 13, 2013 at 09:28 AM Author Report #503054 Posted April 13, 2013 at 09:28 AM Obrigado, vou seguir as V/ dicas
TGmarks Posted April 16, 2013 at 07:26 PM Author Report #503460 Posted April 16, 2013 at 07:26 PM Viva! Ainda não consegui concluir este programa, pois queria implementar um ciclo while no meu programa, mas não sei como o fazer até porque nunca implementei nenhum. Será que alguém me pode ajudar como é que eu faria para implementar um ciclo while neste caso? Obg ... a minha ideia seria qualquer coisa como while (palavras.!equals("fim") .... mas o ciclo while não funciona assim pois não?
HappyHippyHippo Posted April 16, 2013 at 07:31 PM Report #503462 Posted April 16, 2013 at 07:31 PM o problema não na estrutura do ciclo while, mas na instrução que tens de condição do ciclo: while ((palavras[i].!equals("fim")) // | // este operador está mal // é erro de sintaxe { } para resolver o teu problema com um ciclo while, deverias ter em conta que a palavra fim não faz parte do conjunto de palavras. deverás ler a palavra para um local, confirmar que é válida e se sim, guardar no array correspondente IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Jabba Posted April 16, 2013 at 10:05 PM Report #503492 Posted April 16, 2013 at 10:05 PM Um ciclo while é simples de se entender: enquanto algo (variável booleana) não ocorrer, o seu corpo repetir-se-á. Portanto, o que eu faria era definir uma variável booleana e uma variável de progresso. Iniciar o ciclo, com essa condição E com a condição do i (variável de progresso) ser menor que o tamanho do vector. Se encontrar a palavra fim, a variável booleana toma outro valor (de modo a não reentrar no ciclo). Caso contrário, coloca a palavra no vector e, muito importante, no fim do ciclo incrementar o valor de i. Só tens de ter atenção se o número de palavras inseridas não vai exceder as 1000 😁
TGmarks Posted April 17, 2013 at 04:26 PM Author Report #503663 Posted April 17, 2013 at 04:26 PM Fiz o seguinte código: public class fimEok { public static void main (String args[]) { boolean fim; boolean ok; int i = 0; int x = 0; Scanner input = new Scanner (System.in); String[] palavras = new String[1000]; String[] palavras2 = new String[1000]; System.out.println("Introduza uma série de palavras. Para terminar introduza 'fim'"); while (fim=false || i < 1000){ palavras[i] = input.next(); if (palavras[i].equals("fim")){ fim = true; } i++; } System.out.println("Introduza outra série de palavras. Para terminar introduza 'ok'"); while (ok=false || x < 1000){ palavras2[x] = input.next(); if (palavras2[x].equals("ok")){ ok = true; } x++; } } mas ao introduzir a palavra fim continua sempre a aceitar valores ...
rezanov Posted April 17, 2013 at 07:06 PM Report #503693 Posted April 17, 2013 at 07:06 PM (edited) 1º comparação == atribuição = 2º dentro do while tens duas condições, ora a albebra de boole para o OR diz que verdade OU falso = verdade e falso OU verdade = verdade. Edited April 17, 2013 at 07:06 PM by rezanov
TGmarks Posted April 17, 2013 at 07:29 PM Author Report #503697 Posted April 17, 2013 at 07:29 PM Pois já vi!! tinha que usar o E e não o OU obg
Jabba Posted April 17, 2013 at 09:05 PM Report #503708 Posted April 17, 2013 at 09:05 PM Exacto, deves inicializar o valor das variáveis a false. Depois no while tens de ter atenção porque ao fazeres = estas a atribuir um valor a essa variável e não a comparar. E tal como tinha dito, a condição do while não é uma condição de paragem, é uma condição de avanço. Ou seja, se o que meteres na condição se verificar então entra no ciclo. Daí o operador a ser usado ser o &&.
TGmarks Posted April 18, 2013 at 05:12 PM Author Report #503856 Posted April 18, 2013 at 05:12 PM (edited) Boas, acho que estou no bom caminho para dar este programa por concluído: tenho um ciclo for para correr o primeiro array e comparar a palavra que coloquei antes da instrução "ok", agora para eliminar a palavra repetida, a solução passa por copiar todo o array excepto a palavra repetida para um novo array. Sei que tenho de usar o método arraycopy, mas não sei como este funciona, muito menos como não passar a palavra pretendida mais uma vez tenho que agradecer a V/ ajuda public class fimEok { public static void main (String args[]) { boolean fim = false; boolean ok = false; int i = 0; int x = 0; Scanner input = new Scanner (System.in); String[] palavras = new String[1000]; String[] palavras2 = new String[1000]; System.out.println("Introduza uma série de palavras. Para terminar introduza 'fim'"); while (fim == false && i < 1000){ palavras[i] = input.next(); if (palavras[i].equals("fim")){ fim = true; } i++; } System.out.println("Introduza outra série de palavras. Para terminar introduza 'ok'"); while (ok == false && x < 1000){ palavras2[x] = input.next(); if (palavras2[x].equals("ok")){ ok = true; } x++; } for (i = 0; i < palavras.length; i++){ if (palavras2[x-2].equals(palavras[i])){ System.arraycopy(x, x, input, x, x); //e agora???????? } } } } Edited April 18, 2013 at 05:13 PM by TGmarks
Jabba Posted April 18, 2013 at 06:40 PM Report #503879 Posted April 18, 2013 at 06:40 PM Aqui tens como usar o método ArrayCopy: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#arraycopy(java.lang.Object, int, java.lang.Object, int, int). Rapidamente, System.arraycopy(arrayFrom, indiceNoArrayFrom, ArrayTo, indiceNoArrayTo, numElementosCopiados). Em que arrayFrom é o array inicial, indiceNoArrayFrom é a posição a partir do qual queres copiar, ArrayTo é o array para onde queres copiar, indiceNoArrayTo a posição a partir da qual vais começar a escrever, e numElementosCopiados é o número de elementos que vão ser copiados. Dentro do if, para encontrares a palavra anterior a palavra "ok" no array deveria ser palavras2[palavras2.length-2].
TGmarks Posted April 18, 2013 at 06:49 PM Author Report #503881 Posted April 18, 2013 at 06:49 PM Obrigado, já percebi como se faz a cópia, mas existe a possibilidade de não copiar uma das posições? Porque é para isso que eu iria utilizar outro array... Dentro do if se utilizar palavras2[palavras2.length-2] não irá buscar sempre o valor da posição 998?
Jabba Posted April 18, 2013 at 07:07 PM Report #503886 Posted April 18, 2013 at 07:07 PM (edited) Sim, tens razão desculpa. Podes tentar isto: int[] newArray = new int[i]; //e i porque incrementas sempre o i, mesmo depois de ter chegado o fim System.arraycopy(palavras1, 0, newArray, 0, posDaPalavra ); System.arraycopy(original, posDaPalavra+1, newArray, posDaPalavra, i - posDaPalavra); return n; Edited April 18, 2013 at 07:08 PM by Jabba
HappyHippyHippo Posted April 18, 2013 at 07:37 PM Report #503888 Posted April 18, 2013 at 07:37 PM olhando para o enunciado : O programa deverá verificar se a palavra inserida imediatamente antes da palavra “ok” existe no array e se existir deverá removê-la - é só a palavra antes do "ok" ? - de que array é para remover ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
TGmarks Posted April 18, 2013 at 08:10 PM Author Report #503891 Posted April 18, 2013 at 08:10 PM Sim se a palavra antes do "ok" existir no primeiro array deve ser removida deste
HappyHippyHippo Posted April 18, 2013 at 08:17 PM Report #503893 Posted April 18, 2013 at 08:17 PM código para remover todas as palavras do segundo array do primeiro array import java.util.*; /** * Escreva um programa que leia uma série de palavras terminada por “fim” para * um array. Posteriormente, o programa deverá ler mais uma série de palavras * terminada por “ok”. O programa deverá verificar se a palavra inserida * imediatamente antes da palavra “ok” existe no array e se existir deverá * removê-la. */ public class WordSearch { protected static final int ARRAY_SIZE = 1000; protected static final String FIRST_LIMIT = "fim"; protected static final String SECOND_LIMIT = "ok"; public static void main(String args[]) { Scanner sc = new Scanner(System.in); String word = ""; System.out.println("Insira os elementos da primeira lista ('fim' para terminar) : "); String first[] = new String[ARRAY_SIZE]; int first_size = 0; while (first_size != ARRAY_SIZE && !word.equals(FIRST_LIMIT)) { word = sc.next(); if (!word.equals(FIRST_LIMIT)) { first[first_size] = word; first_size++; } } first = Arrays.copyOf(first, first_size); System.out.println("Insira os elementos da segunda lista ('ok' para terminar) : "); String second[] = new String[ARRAY_SIZE]; int second_size = 0; while (second_size != ARRAY_SIZE && !word.equals(SECOND_LIMIT)) { word = sc.next(); if (!word.equals(SECOND_LIMIT)) { second[second_size] = word; second_size++; } } second = Arrays.copyOf(second, second_size); Arrays.sort(second, new Comparator() { public int compare(Object s1, Object s2) { return ((String) s1).compareTo((String) s2); } }); /* SOLUÇÃO SEM ARRAYCOPY */ String result[] = new String[first.length]; int result_size = 0; for (int i = 0; i < first.length; i++) { if (Arrays.binarySearch(second, first[i]) < 0) { result[result_size] = first[i]; result_size++; } } result = Arrays.copyOf(result, result_size); System.out.println("Elementos não eliminados (SEM ARRAY COPY): "); for (int i = 0; i < result.length; i++) { System.out.print(result[i] + " "); } System.out.println(""); /* SOLUÇÃO COM ARRAYCOPY */ for (int i = 0; i < first.length; i++) { if (Arrays.binarySearch(second, first[i]) >= 0) { if (i < first.length - 2) { System.arraycopy(first, i + 1, first, i, first.length - i - 2); } first = Arrays.copyOf(first, first.length - 2); } } System.out.println("Elementos não eliminados (SEM ARRAY COPY): "); for (int i = 0; i < first.length; i++) { System.out.print(first[i] + " "); } System.out.println(""); } } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
LuisMendes330 Posted April 18, 2013 at 11:33 PM Report #503921 Posted April 18, 2013 at 11:33 PM HappyHippyHippo na parte com arraycopy não ta a funcionar bem. Já agora se puderes podias explicar porque tornas a classe public?porque não private?
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now