2016-03-21 18 views
0

Stephen Prata'nın "C++ Primer Plus 6. Baskısını" kullanarak C++'yı öğrenmeye çalışıyorum. 5. bölümdeki alıştırmalardan biri, bir sayının adını ve yılını tutan dinamik bir yapı oluşturmamı istiyor. Tüm bu bilgiler kullanıcı tarafından girilecektir Sorularım:C++ Yapıların Dinamik Dizisi Kullanıcı Girişi

1) Yapıdaki bir char dizisi yerine bir string nesnesi kullanabilir miyim? Eğer öyleyse, nasıl anlatabilir misiniz?

2) Kullanıcının birden fazla sözcük içeren bir ad girmesini nasıl sağlayabilirim? Get(), getline() vb. Kullanmaya çalışıyorum ama işe yaramayacağım.

) Basit bir program olduğunu biliyorum, ancak kod nasıl geliştirilebilir?

Önceden teşekkür ederiz.

struct automobile 
{ 
    std::string name; 
    int year; 
}; 

2) How can I enable the user to input a name that consists of more than one word? I've been trying to use get(), getline() etc. but I just can't make it work.

kullanın std::getline():

cout << "Please enter the make: "; 
std::getline(std::cin,car[n].name); cout << endl; 

3) I know it is a simple programme but in what way could the code be improved?

#include<iostream> 
using namespace std; 

const int ArSize = 20; 

struct automobile 
{ 
    char name[ArSize]; 
    int year; 
}; 

int main() 
{ 
cout << "How many cars do you wish to catalogue?\n"; 
int number; 
cin >> number; 

automobile * car = new automobile[number]; 
int n = 0; 

while (n < number) 
{ 
    cout << "Car #" << n+1 << ":\n"; 
    cout << "Please enter the make: "; 
    cin >> car[n].name; cout << endl; 

    cout << "Please enter the year: "; 
    cin >> car[n].year; cout << endl; 
    n++; 
} 

    cout << "Here is your collection:\n"; 

int m = 0; 
while (m < number) 
{ 
    cout << car[m].year << " " << car[m].name << endl; 
    m++; 
} 
delete [] car; 
return 0; 
} 
+0

1. Muhtemelen bunu kullanabilirsiniz, ancak büyük olasılıkla tüm STD/STL malzemelerinde başka bir ders olacaktır. 2. Neden birden fazla kelime girmeniz gerekiyor? Ve şimdiki kod bunu neden yapamıyor? 3. Basitse - onu geliştirmeyin. Yanlış yapacaksın. – Igor

+0

Soru 3'e gelince, Bu durumda, Döngüler gerçekten uygun değilken. Bunun yerine döngüler için kullanın. Döngüler için geleneksel olarak her yinelemede bir değişkeni arttırmak için kullanılır. Bir boole bayrağı veya her döngüde arttırmayan bir koşul ifadesi kullanıyorsanız bir süre daha iyi olurdu. Ayrıca okunabilirlik için herhangi bir kapsüllenmiş kod satırını girdiğinizden emin olun. Int main() {...} içindeki her şey girintili olmalıdır. Son olarak, yeni bir programcı olarak endl ile "\ n" arasındaki farkı öğrenmenizi öneririm ve birbirinin yerine geçiyormuş gibi görünüyorsunuz ama aynı şeyle aynıdırlar – shockawave123

+0

Son bir not! "Sayı" gibi jenerik değişken adlarından uzak durun. Bu almak için kötü bir alışkanlık. Araba sayısı için "numCars" gibi bir şey adlandırın. Ayrıca, "araba" değişkeniniz de biraz geneldir, ancak bu küçük örnek için muhtemelen işe yarayacaktır. Ancak, bir liste olduğu için çoğul olarak değiştirilmesini öneririm çünkü sadece bir arabanın değil, bir otomobil listesi. Buna kendini belgeleme kodu denir. Girmek için iyi bir alışkanlık. – shockawave123

cevap

1

1) Can I use a string object instead of an array of char in the structure? If so, could you tell me how?

Evet, sadece tip std::string üyesi değişkeni sağlamakBu tür sorular, çalışma kodunuz yakında, SE Code Review adresinden daha iyi bir şekilde sorulmaktadır. Yığın Taşması için bu genellikle çok geniş olarak genişler.

+0

Tüm yardımlarınız için teşekkür ederiz. 'std :: getline (std :: cin, car [n] .name) kullanarak denedim; cout << endl; ' ancak şu hatayı alıyorum: hatası: 'getline (std :: istream &, char [20])' ye çağrı için eşleme işlevi yok '| –

+0

@ KonradBjörnthorne Bu yüzden std :: string name; 'char name [ArSize];' yi kullanmanız gerektiğini söyledim. –

İlgili konular