Carlos7 1 Denunciar mensagem Publicado 5 de Janeiro de 2013 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? Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 5 de Janeiro de 2013 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! Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
polska 21 Denunciar mensagem Publicado 5 de Janeiro de 2013 (editado) 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.. Editado 5 de Janeiro de 2013 por polska Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Carlos7 1 Denunciar mensagem Publicado 5 de Janeiro de 2013 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. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1185 Denunciar mensagem Publicado 5 de Janeiro de 2013 apresenta o código IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Carlos7 1 Denunciar mensagem Publicado 5 de Janeiro de 2013 (editado) 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. Editado 5 de Janeiro de 2013 por Carlos7 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 5 de Janeiro de 2013 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! Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1185 Denunciar mensagem Publicado 5 de Janeiro de 2013 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 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Carlos7 1 Denunciar mensagem Publicado 5 de Janeiro de 2013 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 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1185 Denunciar mensagem Publicado 5 de Janeiro de 2013 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 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 5 de Janeiro de 2013 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! Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Carlos7 1 Denunciar mensagem Publicado 5 de Janeiro de 2013 (editado) 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. Editado 5 de Janeiro de 2013 por Carlos7 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 5 de Janeiro de 2013 (editado) Aparentemente o que identifica uma classe é counterStruct.classes[ k ], mas, na funcao ClassExists estas a verificar varios counterStruct.classes[ k ].classes[ i ][ j ] Editado 5 de Janeiro de 2013 por 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! Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Carlos7 1 Denunciar mensagem Publicado 5 de Janeiro de 2013 (editado) 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 Editado 5 de Janeiro de 2013 por Carlos7 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 5 de Janeiro de 2013 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! Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Carlos7 1 Denunciar mensagem Publicado 5 de Janeiro de 2013 Pois, foi o que eu fiz, se o utilizador introduzir 0 volta a pedir numero e assim já não me acontece aquilo. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 5 de Janeiro de 2013 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! Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites