Ir para o conteúdo
  • 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

Mensagens Recomendadas

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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..

Editado 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

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
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.

Editado por Carlos7

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por Carlos7

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ]

Editado 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

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.