Pocz

Potrzebujesz pomocy z C, C++, perl, python, itp.
Speaktrap!
Posty: 22
Rejestracja: 03 marca 2007, 18:20
Lokalizacja: Hejzakurpami

Początki z Iostream

Post autor: Speaktrap! »

Po pewnym czasie korzystania z linuxa pomyślałem sobie, że naucze się wreszcie programować w C++.

No i znalazłem w internecie, że podstawową biblioteką do pisania wiadomości w terminalu jest Iostream. Zainstalowałem paczkę dev i wio.

Co by tu nie powiedzieć działa - ale nie tak jak chcę:

Kod: Zaznacz cały

#include <iostream>
 
 int main()
 {
   std::cout << "Podaj swoje imie:\n>";
   char imie[50];
   std::cin >> imie;
   while (imie != "baran") {
     std::cout << "Imie, baranie jeden!\n>";
     std::cin >> imie;
   }
 }
Tak więc rzecz w tym, że nawet jak wpiszesz "baran" to się nie zamyka. Gdyby zmienić != na == to z kolei cały czas się zamyka.

Wogóle, ktoś zna dobry tutorial? Bo ja tylko jakieś FAQ (chyba dla bardziej zaawansowanych) znalazłem i wywnioskowałem parę rzeczy.
jang
Beginner
Posty: 208
Rejestracja: 26 stycznia 2007, 14:38

Post autor: jang »

Witam
Na C++ się nie znam więc Ci nie odpowiem dlaczego baran nie działa ale zaglądnij tutaj :
http://debian.linux.pl/viewtopic.php?p=16280#16280
może coś znajdziesz, a poza tym :
http://www.google.com/search?client=ope ... 8&oe=utf-8

Pozdrawiam
Kaka'
Senior Member
Posty: 3018
Rejestracja: 30 lipca 2006, 13:17
Lokalizacja: Kartuzy

Post autor: Kaka' »

char, AFAIK, pomieści tylko jedną literę, przykład:

Kod: Zaznacz cały

int main()
{
        cout << "Podaj swoję imie: \n";
        char imie;
        cin >> imie;
        cout << imie << "\n";
}
Czyli:

Kod: Zaznacz cały

kaka@debian:/tmp$ ./baran2
Podaj swoję imie:
Damian
D
kaka@debian:/tmp$
Czyli, kombinuj dalej :P
ponton
Beginner
Posty: 406
Rejestracja: 24 stycznia 2007, 01:40
Lokalizacja: Kalisz/Wroc³aw

Post autor: ponton »

Tu masz błąd:

Kod: Zaznacz cały

 while (imie != "baran") 
Chodzi o to, że chcesz porównać tablice, a tak naprawdę porównujesz adresy. W C jest funkcja do porównywania napisów: strcmp. Ale w C++ jest już klasa std::string. Poprawny kod (nie kompilowałem):

Kod: Zaznacz cały

#include <iostream> 
  
using namespace std;  // zeby nie trzeba bylo pisac std::  za kazdym razem

 int main() 
 { 
   cout << "Podaj swoje imie\n>"; 
   string imie; // typ string..
   cin >> imie; 
   while (imie != "baran") { // .. ktory juz mozna tak porownac (bo ma przeladowany operator porownania)
     cout << "Imie, baranie jeden!\n>"; 
     cin >> imie; 
   } 
 }
Zobacz też ten kurs: http://www.intercon.pl/~sektor/cbx/
chyl-o
Junior Member
Posty: 621
Rejestracja: 24 maja 2006, 21:06
Lokalizacja: Lublin

Post autor: chyl-o »

ponton, w roli scislosci operator nie jest przeladowany tylko przeciazony.

Poza tym chcecie zeby uzytkownik wykonujacy program podal zamiast swojego imienia slowo "baran" ?? ;) Na to wyglada...

// edit:

do tego w sytuacji gdy ktos ma imie dwuczlonowe( np.: baran adam ) to nie zadziala prawidlowo.

na kolanie pisane rozwiazanie, moze malo eleganckie ale na szybkiego dziala:

Kod: Zaznacz cały

#include <iostream>
#include <string>

using namespace std;

int main()
{
        string name;
        char* imie = new char[100];
        cout << "Podaj imie" << endl;
        cin.getline( imie, 100 );
        cout << imie << endl;
        name = static_cast<string>(imie);
        while( name == "baran" )
        {
                cout << "Imie baranie" << endl;
                cin.getline( imie, 100 );
                name = static_cast<string>(imie);
        }
        delete imie;
}
mlyczek
Junior Member
Posty: 979
Rejestracja: 02 sierpnia 2006, 19:17

Post autor: mlyczek »

Debian pisze:while( name == "baran" )
a nie powinno być:

Kod: Zaznacz cały

while( name != "baran" )
? bo jak by było ==, to prosiłby o imię tak długo jak długo wpisujesz baran.
chyl-o
Junior Member
Posty: 621
Rejestracja: 24 maja 2006, 21:06
Lokalizacja: Lublin

Post autor: chyl-o »

mlyczek pisze:Debian napisał/a:
while( name == "baran" )


a nie powinno być:
Kod:
while( name != "baran" )
? bo jak by było ==, to prosiłby o imię tak długo jak długo wpisujesz baran.
A to o to nie chodzi? Jak dla mnie to bez sensu czekac az uzytkownik poda swoje imie jako baran ;-)

No ale jesli to ma tak byc to ten warunek oczywiscie mozna zmienic...
legion
Posty: 23
Rejestracja: 18 lutego 2007, 01:40

Post autor: legion »

Przestańcie mnie rozśmieszać i mieszać w głowie początkującemu gównianymi poradami...

Kaka' - masz rację: char mieści 1 znak
ponton - to jest błąd... nigdy nie robi się using namespace std, jak już to specyfikuje się używane elementy:

Kod: Zaznacz cały

using std::string
using std::map
...
Debian - twojego kodu nawet nie komentuję, weź go lepiej usuń. widać że C++ nie znasz i nigdy nie znałeś:

Kod: Zaznacz cały

char* imie = new char[100];
name = static_cast<string>(imie);
to są konstrukcje rodem z jakiegoś bejzika na komodorkę albo kulawego C.

Speaktrap! - kod powinien wyglądać tak:

Kod: Zaznacz cały

#include <iostream>
#include <string>

int main()
{
std::cout << "Podaj swoje imie:\n>";
std::string imie;
std::getline(std::cin, imie);

while (imie == "baran") {
std::cout << "Imie, baranie jeden!\n>";
std::getline(std::cin, imie);
}
}
PS. Nie słuchaj się ludzi którzy C++ znają z opowieści i legend. Powodzonka w nauce.

//Edycja:
* używaj tagów code jeśli wstawiasz kod do postu
* odnoś się z szacunkiem do ludzi, którzy pisali i nie oceniaj umiejętności ludzi, których nie znasz po jednym poście
mlyczek
ponton
Beginner
Posty: 406
Rejestracja: 24 stycznia 2007, 01:40
Lokalizacja: Kalisz/Wroc³aw

Post autor: ponton »

Aha, kolejny, co rozumy pozjadał...
legion
Posty: 23
Rejestracja: 18 lutego 2007, 01:40

Post autor: legion »

ponton pisze:Aha, kolejny, co rozumy pozjadał...
Widzisz gdzieś błąd to popraw. Jeśli natomiast czujesz żal że nie potrafisz programować w C++ i zazdrościsz tym którzy potrafią - do nauki a nie głupich komentarzy.

Zresztą wielu jest takich jak ty - każdy chce zaszpanować ale nikt nie potrafi. Więc z łaski - daruj sobie puste posty bo marnujesz tylko miejsce w bazie sql.
ODPOWIEDZ