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ć
Metodą wprowadzania.
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ć.
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
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ą)
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.
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.
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".
@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/
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:)
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