Forum Gry Hobby Sprzęt Rozmawiamy Archiwum Regulamin

Forum: c/c++- wprowadzanie zmiennych+nawiasy

30.03.2015 18:42
1
dirnis1
27
Chorąży

c/c++- wprowadzanie zmiennych+nawiasy

cześć wszystkim
mam pewien problem przy pisaniu kodu programu
chcę aby użytkownik wprowadził (w jednej linii) najpierw ilość punktów a następnie współrzędne x i y tych punktów ale zapisane w odpowiedniej formie np dla punktów (5,3), (6,8), (1,2) linia wejścia ma wyglądać tak:
3 ((5,3),(6,8),(1,2))
jaką metodą zrobić wprowadzanie?
gdyby nie te nawiasy to dałbym sobie radę, ale niestety one muszą być

30.03.2015 18:43
2
odpowiedz
zanonimizowany1080091
33
Legend

Metodą wprowadzania.

30.03.2015 18:57
Legion 13
3
odpowiedz
Legion 13
158
The Black Swordsman

Ale po co ci te nawiasy? Jak są potrzebne przy wypisywaniu to tam je użyj. Po co tak formatować linię wejścia? Jak koniecznie chcesz żeby linia wejścia tak wyglądała to nawiasy wypisz w cout. Mam nadzieję że nie chcesz tych nawiasów w zmiennej przechowywać.

30.03.2015 19:01
4
odpowiedz
dirnis1
27
Chorąży

jest mi to potrzebne do napisania projektu, a w tresci zadania jest, że linia wejścia musi wyglądać w ten sposób
to użykownik musi podać w ten sposób dane na wejście a ja muszę jakoś wydobyć z tego zapisu wpsółrzędne i przypisać je do zmiennych

30.03.2015 19:02
5
odpowiedz
Taal
72
Pretorianin

Użyj funkcji scanf z stdio.h.

30.03.2015 19:08
Legion 13
6
odpowiedz
Legion 13
158
The Black Swordsman

Jeżeli to użytkownik podaje cały wiersz, razem nawiasami, to wystarczy wczytać całość do zmiennej typu string (string to tablica char-ów więc możesz po kolei sprawdzać znaki, i ta liczba która jest po '(' jest pierwszą współrzędną a ta po ',' drugą)

30.03.2015 19:53
7
odpowiedz
Likfidator
120
Senator

To nie jest takie proste zadanie, ale jest wiele metod na jego rozwiązanie. Zależy z czego możesz korzystać, bo język C++ ma wbudowane mechanizmy do konwersji char[] na int.

W każdym razie. Zapisz to co wprowadził użytkownik jako łańcuch znaków np. do
char[] tekst;
int ile;
Wówczas sscanf(tekst,"%d",&ile); powinno dać ile par współrzędnych masz do odczytania.

Potem przetwarzasz łańcuch i rozdzielasz go na kilka łańcuchów "(a,b)" i piszesz funkcję, która wyciąga z tego poszczególne współrzędne.

char[] s = "(123,345)";
int a, b;

sscanf(s,"%*c %d %*c %d", &a, &b); to powinno wyciągnąć współrzędne z powyższego nawiasu.

30.03.2015 20:10
8
odpowiedz
Taal
72
Pretorianin

Jeżeli to tylko akademickie zadanie i nie ma w treści nic o niepoprawnym wejściu, to wystarczy takie rozwiązanie:
int count, p0x, p0y, p1x, p1y, p2x, p2y;
scanf("%d ((%d,%d),(%d,%d),(%d,%d))%*c", &count, &p0x, &p0y, &p1x, &p1y, &p2x, &p2y);
Nieco bardziej elegancko i pewnie poprawniej byłoby:
char string[30];
int count, p0x, p0y, p1x, p1y, p2x, p2y;
fgets(string, 30, stdin);
sscanf(string, "%d ((%d,%d),(%d,%d),(%d,%d))", &count, &p0x, &p0y, &p1x, &p1y, &p2x, &p2y);

@Likfidator
Wówczas sscanf(tekst,"%d",&ile); powinno dać ile par współrzędnych masz do odczytania.
Nie powinno. sscanf zwraca liczbę wczytanych zmiennych zgodnych z wzorcem. W podanym przez Ciebie przykładzie zwróci zawsze 0 lub 1.

30.03.2015 21:45
9
odpowiedz
Likfidator
120
Senator

Taal--> Zauważ, że "3" jest parametrem. Poprawne wejście to np. "2((1,2),(3,4))" czy "5((1,2),(3,4),(5,6),(7,8),(9,0))"

Nie powinno. sscanf zwraca liczbę wczytanych zmiennych zgodnych z wzorcem. W podanym przez Ciebie przykładzie zwróci zawsze 0 lub 1.

char s[] = "3((5,3),(6,8),(1,2))";
int ile = 0;
sscanf(s,"%d",&ile);
cout<<endl<<ile<<endl;

Skompilowałem, jest tak jak mówiłem zwraca "3".

30.03.2015 22:51
10
odpowiedz
Taal
72
Pretorianin

@Likfidator
Po pierwsze dzięki za zwrócenie uwagi na znaczenie pierwszego argumentu. Pała dla mnie za czytanie ze zrozumieniem.

Po drugie sscanf zwraca liczbę poprawnie wczytanych zmiennych (tj. 0/1 dla Twojego przykładu), stąd nieporozumienie.

Poprawiony kod:
http://wklej.org/id/1675692/

31.03.2015 01:10
11
odpowiedz
Likfidator
120
Senator

Trochę się nie zrozumieliśmy. Miałem rację co do tego, że sscanf faktycznie wyciągnie "3", aczkolwiek zrobi to przez referencję na zmienną "ile". Miałeś rację odnośnie tego, że zwróci 0 lub 1, bo ta funkcja oprócz przekazywania danych przez zmienne zwraca również liczbę poprawnie wczytanych danych.

Tak na marginesie ile to ja lat już nie widziałem scanf i jej pochodnych na oczy. Nowoczesne programowanie rozleniwia:)

31.03.2015 09:08
Sanchin
12
odpowiedz
Sanchin
206
Orchid Samurai

W obecnych czasach/językach po prostu poleciałbym regexem/Matcherem jakimś. W c++ pewnie też coś podobnego jest, regex match i search. Dopasować pattern do (\d) *\((?:\((\d, *\d)\),?)+\) żeby sprawdzić, czy w ogóle jest w poprawnej postaci, od razu w grupie 1 mamy ilość punktów.
Jeśli jest 1 - w drugiej mamy ten punkt, jeśli więcej - przez podobny regex szukamy punktów dzięki find/findall

Forum: c/c++- wprowadzanie zmiennych+nawiasy