Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Carlos7

Forçar ciclo for a parar

Recommended Posts

Carlos7

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?

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
polska

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 by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites
Carlos7

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.

Share this post


Link to post
Share on other sites
Carlos7

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 by Carlos7

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
Carlos7

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
Carlos7

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 by Carlos7

Share this post


Link to post
Share on other sites
pmg

Aparentemente o que identifica uma classe é counterStruct.classes[ k ], mas, na funcao ClassExists estas a verificar varios counterStruct.classes[ k ].classes[ i ][ j ]

Edited 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!

Share this post


Link to post
Share on other sites
Carlos7

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 by Carlos7

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
Carlos7

Pois, foi o que eu fiz, se o utilizador introduzir 0 volta a pedir numero e assim já não me acontece aquilo.

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.