Skocz do zawartości
Zaloguj się, aby obserwować  
Gość Matmaxalez

[C] Wybór w wyborze, innego wyboru

Polecane posty

Gość mSurf.eu

Cześć,

 

W jaki sposób mogę zrobić while w while. Trochę ciężko mi to wytłumaczyć.

 

A więc chcę zrobić coś w tym stylu (jako przykład):

 

Z jakiego województwa pochodzisz?
- Mazowsze, wciśnij 1
- Podlaskie, wciśnij 2
itp itd.




Potem, gdy np. użytkownik wybierze 2 (podlaskie) to znowu wybiera:

Jaki powiat?
-Białystocki, wciśnij 1
-Moniecki, wciśnij 2
itp itd.

 

Potem to już chyba mi pójdzie łatwo i sprawnie gdy będę widział jak zrobić te jedne w drugim.

Mogę prosić o wytłumaczenie, część kodu lub wskazówkę jak to szukać w internecie (np. jakie słowa wpisywać w wyszukiwarce...)

 

Pozdrawiam

 

 

 

Kody które napisałem to coś takiego:

 

main()
{

float x,y;
int wybor;
int term;


term = 1;

while (term==1)
{
printf("Z jakiego województwa pochodzisz?\n");
printf("Mazowsze - wciśnij 1\n")
printf("Podlasie - wciśnij2\n")
scanf("%f", &x);

break;


 

Potem w jaki sposób zrobić, żeby dodać

printf("Z jakiego powiatu pochodzisz?\n");
printf("Białostockiego - wciśnij 1\n")
printf("Monieckiego - wciśnij2\n")
scanf("%f", &x);

 

I powiedzmy że user wybierze moniecki

 

printf("Z jakiej gminy pochodzisz?\n");
printf("Monki - wciśnij 1\n")
printf("Knyszyn- wciśnij2\n")
scanf("%f", &x);

 

Jak to wszystko połączyć. Mozna zrobić while, potem switch-case, ale ze switch-case jak zrobić jak zrobić kolejne while

Edytowano przez mSurf.eu (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Może źle zrozumiałem ale raczej zbędny ten while wywołanie scanf przecież spowoduje zatrzymanie programu do momentu odpowiedzi. Druga rzecz to zmienne x,y nie powinny być typu float (tak wynika z tego kodu).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość mSurf.eu

Dostałem przykładowy kod od nauczycielki, w taki posób napisany działa, i mamy używając m.in. tego kodu zrobić ten cały program.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Nie wiem czy dokładnie o to chodzi ale może Ci się przyda. (współczuję takiej nauczycielki...)

#include <stdio.h>
int main (int argc, char *argv[]){
int x,y,wybor=1;
while(wybor==1) {
	printf ("Z jakiego woj pochodzisz ?\n");
	printf ("Lodzkie | wcisnij 1\n");
	printf ("Mazowieckie | wcisnij 2\n");
	scanf ("%d",&x);
	switch (x){
		case 1:
			printf("Wybrales lodzkie\n");
			printf("Z jakiego miasta pochodzisz?\n");
			printf("Lodz | wcisnij 1\n");
			printf("Inne |wcisnij 2\n");
			scanf("%d",&y);
			break;
		case 2:
			printf("Wybrales mazowieckie\n");
			printf("Z jakiego miasta pochodzisz?\n");
			printf("W-wa | wcisnij 1\n");
			printf("Inne maz |wcisnij 2\n");
			scanf("%d",&y);
			break;
		default:
			break;
	}
	if (x==1){
		switch (y){
			case 1:
				printf ("wybrales lodz\n");
				wybor++;
				break;
			case 2:
				printf ("wybrales inne lodzkie\n");
				wybor++;
				break;
			default:
				wybor++;
				break;
		}
	}
	else {
		switch (y){
			case 1:
			printf ("wybrales W-wa\n");
			wybor++;
			break;
			case 2:
				printf ("wybrales inne mazowieckie\n");
				break;
				wybor++;
			default:
				wybor++;
				break;
		}
	}
}
return 0;
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok nudziło mi się trochę, masz pętle while, ale w rekurencji:

 

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MAX_NAME_LENGTH 128

typedef struct node
{
int id;
char name[MAX_NAME_LENGTH];
struct list* child;
struct node* next;
} node;

typedef struct list
{
node* head;
node* tail;
int id;
char name[MAX_NAME_LENGTH];
} list;

typedef struct geo
{
list* provinces;
} geo;

list* list_create(char name[])
{
list* temp = (list*)malloc(sizeof(list));
temp->head = temp->tail = NULL;
temp->id = 0;
strncpy(temp->name, name, sizeof(temp->name));
return temp;
}

node* list_append(list* parent, char name[], list* child)
{
node* item = (node*)malloc(sizeof(node));
item->id = ++parent->id;
strncpy(item->name, name, sizeof(item->name));
item->child = child;
item->next = NULL;
if(parent->head == NULL)
{
 parent->head = item;
 parent->tail = item;
}
else
{
 parent->tail->next = item;
 parent->tail = item;
}
return item;
}

node* list_find_by_id(list* items, int id)
{
node* item = items->head;
while(item != NULL)
{
 if(item->id == id) return item;
 item = item->next;
}
return NULL;
}

geo* geo_init()
{
list* districts = NULL;
list* municipalities = NULL;
node* province = NULL;
node* district = NULL;
char districts_question[] = "Z jakiego powiatu pochodzisz";
char municipalities_question[] = "Z jakiej gminy pochodzisz";

geo* temp = (geo*)malloc(sizeof(geo));
//Najlepiej zrobic import np. z CSV - nazwy sie pewnie nie zgadzaja dalej
temp->provinces = list_create("Z jakiego wojewodztwa pochodzisz");

//Mazowsze
districts = list_create(districts_question);
province = list_append(temp->provinces, "Mazowsze", districts);

municipalities = list_create(municipalities_question);
district = list_append(province->child, "Radom", municipalities);
list_append(district->child, "Warka", NULL);
list_append(district->child, "Przysucha", NULL);

municipalities = list_create(municipalities_question);
district = list_append(province->child, "Siedleckie", municipalities);
list_append(district->child, "Mordy", NULL);
list_append(district->child, "Garwolin", NULL);

//Podlasie
districts = list_create(districts_question);
province = list_append(temp->provinces, "Podlasie", districts);

municipalities = list_create(municipalities_question);
district = list_append(province->child, "Suwalski", municipalities);
list_append(district->child, "Raczki", NULL);

municipalities = list_create(municipalities_question);
district = list_append(province->child, "Grajewski", municipalities);
list_append(district->child, "Grajewo", NULL);
list_append(district->child, "Szczuczyn", NULL);

return temp;
}

void decision(list *items)
{
node* item = items->head;
node* next = NULL;
int id = 0;
if(items == NULL) return;
printf("%s?\n", items->name);
while(item != NULL)
{
 printf("%d) %s\n", item->id, item->name);

 item = item->next;
}
scanf("%d", &id);

next = list_find_by_id(items, id);
if(next && next->child)
 decision(next->child);
}

int main(int argc, char* argv[])
{
geo* g = geo_init();
decision(g->provinces);
return 0;
}

 

Brakuje tylko usuwania zaalokowanej pamięci, ale nie chce mi się.

Edytowano przez elcct (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość mSurf.eu

Dzięki wszystkim :)

elcct - dzięki ale trochę za bardzo rozbudowane, ona nigdy nie uwieży że ja to napisałem ;P

igor_s - dzięki, się przyda

Wiem że powinienen zmienić nauczycielkę - następnym roku zmieniam szkołę.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość

Ok, znalazlem rozwiazanie :) Podam je jak bede w domu. Kolega mi wytlumaczyl.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość mSurf.eu

A więc zrobiłem switch-case w switch case'u. Kod podaję poniżej, nie da się go skompilować, trzeba błędy poprawić, ale forma jest dobra.

http://wklej.org/id/758710/

 

Błędy nie są w formie switch-case tylko na linii 55-70.

 

Pozdrawiam

Edytowano przez mSurf.eu (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

A więc zrobiłem switch-case w switch case'u. Kod podaję poniżej, nie da się go skompilować, trzeba błędy poprawić, ale forma jest dobra.

http://wklej.org/id/758710/

 

Błędy nie są w formie switch-case tylko na linii 55-70.

 

Pozdrawiam

 

No i takie zadania są straszne, bo w zasadzie nie uczą niczego, a jeśli już to złych rozwiązań

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ble. A o czymś takim, jak FUNKCJE to państwo nie słyszeli?

Obstawiam, że owy kod miał zachęcić właśnie do ich użycia...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość mSurf.eu

Ble. A o czymś takim, jak FUNKCJE to państwo nie słyszeli?

nie

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Po prostu kazdego while() obslugujacego menu (te printf'y, scanf i switch) umiesc w osobnej funkcji.

A w case'ach po prostu je wywoluj. Obstawiam, ze bedzie to czytelniejsze i latwiejsze w pozniejszej rozbudowie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

Zaloguj się, aby obserwować  

×