Carlos7 Posted January 5, 2013 at 10:47 PM Report #489828 Posted January 5, 2013 at 10:47 PM Imaginemos que eu tenho um ciclo for a correr a procura de uma certa condição, por exemplo ate encontrar o numero 1, existe alguma forma de quando encontrar o numero 1, ele não continuar a execução do ciclo for e retornar a posição onde esse numero 1 foi encontrado?
pmg Posted January 5, 2013 at 10:50 PM Report #489830 Posted January 5, 2013 at 10:50 PM for (posicao = 0; array[posicao] != 1; posicao++) /* nada */; Para o mesmo efeito eu prefiro while posicao = 0; while (array[posicao] != 1) posicao++; Atencao: no codigo acima corre-se o risco de posicao andar para alem do limite do array ... What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
polska Posted January 5, 2013 at 10:51 PM Report #489831 Posted January 5, 2013 at 10:51 PM (edited) Podes alternativamente usar o break; if(vector[posicao] == 1) { printf("%d", posicao); break; } Caso estejas a fazer essa pesquisa numa função, basta fazeres return da posição.. Edited January 5, 2013 at 10:54 PM by polska Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
Carlos7 Posted January 5, 2013 at 10:53 PM Author Report #489833 Posted January 5, 2013 at 10:53 PM Eu estou a fazer return da posição mas no entanto ele continua a percorrer o ciclo até ao fim e por isso está constantemente a retornar diferentes valores.
HappyHippyHippo Posted January 5, 2013 at 10:56 PM Report #489835 Posted January 5, 2013 at 10:56 PM apresenta o código IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos7 Posted January 5, 2013 at 10:57 PM Author Report #489836 Posted January 5, 2013 at 10:57 PM (edited) Isto não deve estar mesmo nada bem unsigned int verifyIfClassExists(CounterStruct counterStruct, const unsigned int numberToFind) { unsigned int i,j,k; for (k = 0; k < counterStruct.counterClasses; k++) { for (i = 0; i < WEEKROWS; i++) { for (j = 0; j < WEEKCOLUMNS; j++) { if (counterStruct.classes[k].classes[i][j].idOfClass == numberToFind) { return k; } else { return -1; } } } } } Isto supostamente e para percorrer matrizes dentro de um vector até encontrar aquele id de aula. Edited January 5, 2013 at 10:58 PM by Carlos7
pmg Posted January 5, 2013 at 11:02 PM Report #489838 Posted January 5, 2013 at 11:02 PM Vamos la a ver ... k é zero, i é zero, j é zero o if vai verificar counterStruct.classes[k].classes[j].idOfClass ... ou faz return 0 (o k) ou faz return -1 e o ciclo nao continua. Deves querer por o return -1 fora do ciclo 🙂 What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
HappyHippyHippo Posted January 5, 2013 at 11:03 PM Report #489839 Posted January 5, 2013 at 11:03 PM antes do mais, já verificaste os erros do compilador ? agora, assumindo que counterStruct.counterClasses, WEEKROWS e WEEKCOLUMNS são maiores que zero, a função ou retorna k ou -1, nenhuma iteração dos ciclos é efectuada sequer IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos7 Posted January 5, 2013 at 11:08 PM Author Report #489840 Posted January 5, 2013 at 11:08 PM Não tem erros no compilador, já passei o return -1 para fora do ciclo e está a funcionar parcialmente. Tenho 2 aulas com ID 1 e 2 respectivamente. Se procurar aula com ID 3,4,5,6 etc funciona bem e diz que não existe, no entanto se procurar pelo ID 0 ele diz que existe e mostra-me os dados da aula com ID 1
HappyHippyHippo Posted January 5, 2013 at 11:11 PM Report #489842 Posted January 5, 2013 at 11:11 PM Não tem erros no compilador antes da alteração é impossível, tinhas uma função em que era possível chegar ao fim de execução sem valor de retorno. Tenho 2 aulas com ID 1 e 2 respectivamente. Se procurar aula com ID 3,4,5,6 etc funciona bem e diz que não existe, no entanto se procurar pelo ID 0 ele diz que existe e mostra-me os dados da aula com ID 1 confirma os id's que tens nas aulas. e que aula te dá se pedires pelos id 1 e pelo id 2 ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted January 5, 2013 at 11:15 PM Report #489843 Posted January 5, 2013 at 11:15 PM Palpita-me que é o erro de pensar que os arrays em C comecam no indice 1. O primeiro elemento de um array, em C, é o elemento com indice 0! Mete aqui a definicao da tua estrutura de dados (o CounterStruct e tudo o que la tem dentro). Aquilo aparenta ter mais classes do que necessario ... What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
Carlos7 Posted January 5, 2013 at 11:16 PM Author Report #489844 Posted January 5, 2013 at 11:16 PM (edited) Se pedir o id 1 e o id 2 da-me as aulas correctas, no entanto se pedir pelo id 0 ele da-me a primeira aula que tenho. unsigned int verifyIfClassExists(CounterStruct counterStruct, const unsigned int numberToFind) { unsigned int i,j,k; for (k = 0; k < counterStruct.counterClasses; k++) { for (i = 0; i < WEEKROWS; i++) { for (j = 0; j < WEEKCOLUMNS; j++) { if (counterStruct.classes[k].classes[i][j].idOfClass == numberToFind) { return k; } } } } return -1; } CounterStruct removeClass(CounterStruct counterStruct) { clearScreen(); unsigned int idOfClassToRemove; unsigned int i; printf("What class do you want to remove? Enter ID of class:\n"); idOfClassToRemove = getAndValidateInt(); i = verifyIfClassExists(counterStruct, idOfClassToRemove); if (i != -1) { for (i; i < counterStruct.counterClasses; i++) { counterStruct.classes[i] = counterStruct.classes[i+1]; } printf("Operation Succeeded!\n"); counterStruct.counterClasses--; } else { printf("Class not found!\n"); } return counterStruct; } Neste momento tenho estas duas funções e estou a usar a verificar para depois poder eliminar a aula que quiser, se eu puser para eliminar a 1, ele correctamente elimina a 1, se puser para eliminar a 2 ele correctamente elimina a dois, se puser para eliminar a 3,4,5,6 etc ele correctamente diz que não existe. No entanto se puser para eliminar a 0 (aula essa que não existe) ele elimina-me a 1 e fico só com a dois, depois volto a pedir para eliminar a 0 e ele elimina-me a 2 (porque esta passou para a primeira posição). Ou seja, se pedir a 0, ele elimina-me sempre a aula da primeira posição. Edited January 5, 2013 at 11:16 PM by Carlos7
pmg Posted January 5, 2013 at 11:25 PM Report #489845 Posted January 5, 2013 at 11:25 PM (edited) Aparentemente o que identifica uma classe é counterStruct.classes[ k ], mas, na funcao ClassExists estas a verificar varios counterStruct.classes[ k ].classes[ i ][ j ] Edited January 5, 2013 at 11:27 PM by pmg What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
Carlos7 Posted January 5, 2013 at 11:30 PM Author Report #489846 Posted January 5, 2013 at 11:30 PM (edited) Mas a unica forma de eu verificar se o tal id de aula existe e com counterStruct.classes[ k ].classes[ i ][ j ].idaula , porque se meter so counterStruct.classes[ k ].idaula nao da porque eu dentro desse array classes[k], tenho uma matriz classes[j] e essa matriz e que contem o campo id de aula Edited January 5, 2013 at 11:31 PM by Carlos7
pmg Posted January 5, 2013 at 11:34 PM Report #489847 Posted January 5, 2013 at 11:34 PM Aha! E qual é a diferenca entre a aula 0 e a ausencia de aula num determinado periodo? Sugestao: ao pedires um numero de aula verifica se é positivo e maior que 0. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
Carlos7 Posted January 5, 2013 at 11:38 PM Author Report #489848 Posted January 5, 2013 at 11:38 PM Pois, foi o que eu fiz, se o utilizador introduzir 0 volta a pedir numero e assim já não me acontece aquilo.
pmg Posted January 5, 2013 at 11:41 PM Report #489849 Posted January 5, 2013 at 11:41 PM Para concluir. O teu problema é o valor 0 ter dois significados: ausencia de aula e numero de aula. Enquanto for assim nunca vais resolver a questao. Se queres que 0 seja apenas um numero de aula, tens de arranjar outro valor (talvez -1???) para significar a ausencia de aula. Nao te esquecas de meter esse valor nos elementos dos arrays. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
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