Strona 1 z 4

Początki z Iostream

: 08 czerwca 2007, 10:54
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.

: 08 czerwca 2007, 12:03
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

: 08 czerwca 2007, 12:49
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

: 08 czerwca 2007, 13:07
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/

: 13 czerwca 2007, 11:43
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;
}

: 14 czerwca 2007, 00:27
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.

: 14 czerwca 2007, 00:32
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...

: 15 czerwca 2007, 21:20
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

: 15 czerwca 2007, 22:31
autor: ponton
Aha, kolejny, co rozumy pozjadał...

: 15 czerwca 2007, 23:06
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.