Łączenie tablic w C++ (zadania - pytania)

0

To jest zadanie na 2 laborka z infy jestem na AiR.
I sprawdzić mi resztę zadań.

ZAD 1: Napisz program który wczyta dwie liczby całkowite, 4 - bajtowe, wyświetli ich iloczyn, różnicę i resztę z ich dzielenia.

KOD: http://wklej.org/id/1482544/

ZAD 2: Napisz program który wczyta jeden znak z klawiatury, a następnie wyświetli go oraz
jego numer w kodzie ASCI.

KOD: http://wklej.org/id/1482545/

PS: Da się jakoś to wyświetlić w systemie szesnastkowym, albo konwertować przez literał?

ZAD 3: Napisz program który wczyta współrzędne x, y dwóch punktów, a następnie wyświetli
odległość między nimi.

KOD: http://wklej.org/id/1482550/

ZAD 4: Napisz program który wczyta od użytkownika imię i nazwisko odpowiednio do tablic
Imie[40] i Nazwisko[40]. Następnie połącz wczytane dwie zmienne do zmiennej obywatel[80], którą następnie wyświetlisz na ekranie.
(możesz wykorzystać funkcję fscanf()).

PS: Zaraz to będę robił, ale jak to zrobić w C++, jest też jakaś podobna funkcja, chodzi mi o to jak łączyć tablice.

2

Nie używaj <conio.h>, <stdio.h> i _getch().

  1. Kto Ci powiedział, że long int ma 4 bajty. Użyj <cstdint> i int32_t.
  2. Dlaczego obleśne rzutowanie? static_cast<int>.
  3. Tutaj powinna być chociaż struktura i funkcja, bo powtarzasz kod. A tak w ogóle to powinna być klasa dla punktu.
  4. Wczytać możesz normalnie za pomocą std::cin. Przy łączeniu zapewne pomogą Ci takie funkcje jak std::strncpy czy std::strncat.
0
Endrju napisał(a):

Nie używaj <conio.h>, <stdio.h> i _getch().

  1. Kto Ci powiedział, że long int ma 4 bajty. Użyj <cstdint> i int32_t.
  2. Dlaczego obleśne rzutowanie? static_cast<int>.
  3. Tutaj powinna być chociaż struktura i funkcja, bo powtarzasz kod. A tak w ogóle to powinna być klasa dla punktu.
  4. Wczytać możesz za pomocą getline z std::cin (to jest link). Przy łączeniu zapewne pomogą Ci takie funkcje jak std::strncpy czy std::strncat.

Chyba niezbyt uważnie czytasz miałem 2 wykłady o zmiennych operatorach etc., nie znam funkcji, klas więc nie wyjeżdżaj mi z takim czymś, bo wykładowca powie, że sobie to z d**y wziąłem, to ma być prosto zapisane, jak najprościej i skorzystać z tego co wiem.

1.Zajrzyj: http://s1.fotowrzut.pl/DUYZVK8P9D/1.jpg - Dlaczego nie mam tego używać?
2. Jak mam to zastosować static_cast<int>?
3.Tak jak pisałem nie mam pojęcia o czym mówisz.
4.Jak?

0
friizi napisał(a):

... i skorzystać z tego co wiem.
To po kiego wyjeżdżasz tu z postami, skoro tego nie wiesz to nie możesz korzystać.

0
_13th_Dragon napisał(a):
friizi napisał(a):

... i skorzystać z tego co wiem.
To po kiego wyjeżdżasz tu z postami, skoro tego nie wiesz to nie możesz korzystać.

O co Wam chodzi ludzie ogarnijcie się trochę. Z jakimi postami? Co?

0

Jak sobie chcesz. Te 3 rozwiązania, choć niepozbawione problemów, są poprawne.

Co do 4 zadania. Potrzebujesz 3 tablic znakowych (czyli typu char): imie[40], nazwisko[40] oraz obywatel[80]. Do dwóch pierwszych wczytujesz za pomocą cin imię oraz nazwisko. Potem musisz skopiować zawartość tych dwóch tablic do tablicy obywatel. Kopiujesz pierwszą za pomocą strncpy, obliczasz gdzie ma być druga za pomocą strlen i w to miejsce kopiujesz drugą tym samym sposobem. Nie zapomnij o tym, że za napisem jest znak \0. To można oczywiście rozwiązać na kilka innych sposobów.

Do czytania:

http://www.cplusplus.com/reference/cstring/strncpy/
http://www.cplusplus.com/reference/cstring/strlen

Edit: z tym getline to przesadziłem.

0
Endrju napisał(a):

Jak sobie chcesz. Te 3 rozwiązania, choć niepozbawione problemów, są poprawne.

Co do 4 zadania. Potrzebujesz 3 tablic znakowych (czyli typu char): imie[40], nazwisko[40] oraz obywatel[80]. Do dwóch pierwszych wczytujesz za pomocą cin.getline() imię oraz nazwisko. Potem musisz skopiować zawartość tych dwóch tablic do tablicy obywatel. Kopiujesz pierwszą za pomocą strncpy, obliczasz gdzie ma być druga za pomocą strlen i w to miejsce kopiujesz drugą tym samym sposobem. Nie zapomnij o tym, że za napisem jest znak \0. To można oczywiście rozwiązać na kilka innych sposobów.

Do czytania:

http://www.cplusplus.com/reference/istream/istream/getline/
http://www.cplusplus.com/reference/cstring/strncpy/
http://www.cplusplus.com/reference/cstring/strlen

Ja tak to zrobiłem: http://wklej.org/id/1482787/ -> ale to nie spełnia warunków zadania, bo nie mam zdefiniowanego char obywatel[80];

Mógłbyś napisać jednak ten kod, bo nawet gdy czytam dokumentację nie mam pojęcia w jaki sposób użyć tych funkcji, chodzi mi o te argumenty w nawiasach. A tak analizując kod, na pewno załapię.

1

No dobrze, popatrz.

Od początku. Plik zaczniemy tak, wiemy mniej więcej co będzie potrzebne w dalszej częsci programu:

#include <iostream> // Bedziemy wczytywac i wypisywac.
#include <cstring> // Bedziemy potrzebowac wspomnianych w poscie wyzej funkcji.

using namespace std; // Zeby bylo prosciej.

W srodku main zrobimy te tablice i wczytamy wartosci. Możemy normalnie wczytać za pomocą cin:

char imie[40]; // Definicja tablicy 40 znakow, zawartosc jest nieokreslona.
cin >> imie; // Wczytujemy slowo ze standardowego wejscia, to nie jest bezpieczne, ale nie komplikujmy.

To 40 można by zapisać jako stałą, no ale pewnie nie chcesz komplikować. Drugą daną wczytujemy dokładnie tak samo.

Teraz czas na łączenie. Chcemy użyć strcpy (zrezygnowałem z strncpy żeby było prościej):

char *strcpy(char *destination, const char *source);

Strasznie dużo parametrów, ale od tego jest dokumentacja: podajemy tablicę docelową i źródłową, to wszystko:

strcpy(obywatel, imie); // Po prostu kopiujemy jedna tablice do drugiej.

Teraz trzeba skopiować resztę za tym co już skopiowaliśmy. W tym celu musimy obliczyć długość napisu w imie. Do tego użyjemy strlen. O tyle znaków musimy się przesunąć w tablicy obywatel:

strcpy(obywatel + strlen(imie), nazwisko); // Kopiujemy druga tablice zaczynajac w miejscu zakonczenia poprzedniej tablicy.

Żeby zrozumieć skąd to dodawanie musisz wiedzieć o tym, że podczas przekazywania do funkcji nazwa tablicy jest konwertowana do wskaźnika na pierwszy elelement i o tym, co to jest arytmetka wskaźników. Kod wyżej to C++ z tym, że to jednak bardziej C. W C++ do robienia takich rzeczy używa się std::string, żeby nie trzeba było myśleć o wspomnianych wyżej dziwactwach. Niestety prawie nigdzie nie uczą C++.

W zadaniu nie ma mowy o spacji, wiec dla Jan Kowalski wyjdzie JanKowalski. Nie wiem, czy tak ma być, ale to bez znaczenia, bo idea jest taka sama.

0

Ok dzięki. A mam kilka pytań:

  1. W tej funckji strncpy() musiałem jednak dopisać jako 3 argument rozmiar, konkretnie nie wiem czego, ale wydaje mi się, że tej tablicy z której kopiuję.

  2. Masz jakiś pomysł jak dodać tą spację, myślałem o zdefiniowaniu: char spacja[2]=" "; ale zaś jak wpisuję strncpy(obywatel +strlen(imie), spacja+nazwisko) - wyskakuje jakiś błąd.

@Edit
Załatwiłem to tak: http://wklej.to/lZMI9 -> Ale to chyba niezbyt wygodne, da się łatwiej?

  1. Dlaczego nie korzystać z tych conio.h i _getch()??

  2. Z jakiej książki radziłbyś mi korzystać do nauki C++ i C, bo oba języki chyba będę musiał umieć równocześnie?

  3. Mógłbyś wytłumaczyć mi jak użyć tej funkcji fscanf(), bo pewnie na laborkach będzie nam kazał skorzystać z tej funkcji?

  4. Mam jeszcze 2 zadania:

Zadanie 5:
Napisz program który wczyta kąt w stopniachi wyświetli wartości funkcji trygonometrycznych (sin, cos, tg, ctg) w jednej kolumnie z pokrywającymi się przecinkami, sformatowane do 4 miejsc po przecinku.

Zadanie 6:
Napisz program który wczyta dwie liczby rzeczywiste i wyświetli ich średnią arytmetyczną, geometryczną i harmoniczną, w jednej kolumnie z pokrywającymi się przecinkami, sformatowane do 3 miejsc po przecinku.

Jakieś rady, z czego mam skorzystać, obecnie czytam o bibliotece math.h.
Pozdrawiam:P

1
obywatel[80]={0};
strcat(strcat(strcat(obywatel,imie)," "),nazwisko);
cout<<obywatel<<endl;
0

Z tym getline to przesadziłem, wystarczy Ci cin >>. getline nie zrobi tego tak jak powinno być bo wczyta od razu wszystko. Zmień to.

  1. Bo zmieniłem zdanie i użyłem strcpy. (bez n)
  2. Musisz po prostu wstawić w tablicę obywatel spację po skopiowaniu imie. Nie możesz dodawać za pomocą + tablic znaków - gdybyś mógł po co w ogole byłoby strcpy. Wiemy już jak policzyć gdzie kończy się imie- za tym miejscem wstaw znak spacji ' '.
  3. Bo to jakieś niepotrzebne, nieprzenośne i niestandardowe dziwactwa. Jak okienko znika Ci po zakończeniu programu to uruchamiaj program bezpośrednio z konsoli. Normalne IDE mają opcję niezamykania okienka.
  4. Nie wiem. Najpierw odpowiedz sobie na pytanie, czy chcesz się nauczyć tych języków czy tylko zaliczyć laborkę. C++ to chyba najbardziej skomplikowany język jaki jest w użyciu, nie jest obowiązkowe jego nauczenie się.
0
_13th_Dragon napisał(a):
obywatel[80]={0};
strcat(strcat(strcat(obywatel,imie)," "),nazwisko);
cout<<obywatel<<endl;

Rozumiem, że pierwsza linijka to przypisanie obywatel[0]=0, tak?

A o co chodzi w drugiej linijce z tym strcat()?

Co z tym wczytaniem kąta w stopniach, jest jakaś do tego funkcja?

@Edit

Zadanie 5:
Napisz program który wczyta kąt w stopniachi wyświetli wartości funkcji trygonometrycznych (sin, cos, tg, ctg) w jednej kolumnie z pokrywającymi się przecinkami, sformatowane do 4 miejsc po przecinku.

Do sprawdzenia: http://wklej.org/id/1482852/

Zadanie 6:
Napisz program który wczyta dwie liczby rzeczywiste i wyświetli ich średnią arytmetyczną, geometryczną i harmoniczną, w jednej kolumnie z pokrywającymi się przecinkami, sformatowane do 3 miejsc po przecinku.

Do sprawdzenia: http://wklej.org/id/1482887/

PS: Da się inaczej ustalić, żeby przecinki były w jednym miejscu, bez wyświetlania tych plusów?

0

Funkcje trygonometryczne z <cmath> przyjmują parametry w radianach, nie w stopniach. Musisz skonwertować stopnie na radiany: http://pl.wikipedia.org/wiki/Radian Zupełnie nie potrzebujesz tych zmiennych. Możesz wstawić wywołanie funkcji bezpośrednio w wypisywanie wyników. Jeżeli już używasz zmiennych to nie nazywaj ich a, b, itd. atan to nie jest ctg. ctg(x) = 1/tg(x). (http://pl.wikipedia.org/wiki/Funkcje_trygonometryczne#Definicje)

Ten drugi jest jakiś dziwny, po co te nawiasy klamrowe? Warunek if (a && b > 0) nie jest poprawny. Zapewne chciałeś napisać if (a > 0 && b > 0).

0
friizi napisał(a):

Rozumiem, że pierwsza linijka to przypisanie obywatel[0]=0, tak?
Nie, to:

obywatel[0]='\0';
obywatel[1]='\0';
obywatel[2]='\0';
...
obywatel[79]='\0';
friizi napisał(a):

A o co chodzi w drugiej linijce z tym strcat()?
http://www.cplusplus.com/reference/cstring/strcat/ Możesz użyć jak w przykładzie lub też kaskadowo jak pokazałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1