2012-05-04 10 views
6

मैं सी ++ सीख रहा हूं और प्रोजेक्ट को आउटपुट (गणना की एन-पंक्तियों के बाद) को पास्कल का त्रिकोण भेजने के लिए मिला है। इस तरह आउटपुट प्राप्त करना, स्ट्रिंगस्ट्रीम "बफर"स्ट्रिंगस्ट्रीम का उपयोग इंडेंट/सेंटर आउटपुट

में संग्रहीत किया जा रहा है
1 
1 1 
1 2 1 
1 3 3 1 

लेकिन क्या मैं चाहता हूँ बल्कि है

1 
    1 1 
    1 2 1 
1 3 3 1 

मेरा विचार था: अंतिम पंक्ति और मौजूदा लाइन की लंबाई (मुझे पता है कि पिछले एक लंबे समय तक है) के अंतर की गणना। फिर रिक्त स्थान (रेखा-लंबाई-अंतर का आधा) का उपयोग करके प्रत्येक पंक्ति को पैड करें। मेरे समस्या अब है:

  • मैं कैसे काम करता है getLine मिला नहीं, न तो मैं एक विशिष्ट कैसे निकाल सकता है (-> पिछले) लाइन
  • मैं नहीं जानता और कैसे एक संपादित करने के लिए लगता है नहीं कर सका स्ट्रिंगस्ट्रीम

किसी भी तरह मुझे यह महसूस हो रहा है कि मैं स्ट्रिंगस्ट्रीम का उपयोग करके सबसे अच्छे तरीके से नहीं हूं।

तो यह एक आम सवाल है: आपने इस समस्या को कैसे हल किया और यदि संभव हो तो स्ट्रिंगस्ट्रीम के साथ - कैसे?

+1

http://www.cplusplus.com/reference/iostream/manipulators/setw/ इसे देखें – v01d

+0

बस स्पष्ट होने के लिए, क्या आप अपने स्वयं के मूल्यों की गणना कर रहे हैं? या आप उन्हें पार्स कर रहे हैं और फिर reprinting? – Benj

+0

मैं उन्हें स्वयं की गणना करता हूं, मुझे सेटव पर एक नज़र डालने वाला है, यह एक अच्छा तरीका प्रतीत होता है :-) – AnatraIlDuck

उत्तर

2

पहली पंक्ति के खरोज पता करने के लिए , आपको इनपुट में लाइनों की संख्या जानने की आवश्यकता होगी। इसलिए आपको पहले सभी इनपुट में पढ़ना होगा। मैंने .size() सदस्य फ़ंक्शन की सुविधा के लिए मानों को संग्रहीत करने के लिए वेक्टर का उपयोग करना चुना है जो सभी इनपुट में पढ़ने के बाद लाइनों की कुल संख्या देगा।

#include<iostream> 
#include<sstream> 
#include<vector> 
#include<iomanip> // For setw 
using namespace std; 
int main() 
{ 
    stringstream ss; 
    vector<string> lines; 
    string s; 

    //Read all of the lines into a vector 
    while(getline(cin,s)) 
    lines.push_back(s); 

    // setw() - sets the width of the line being output 
    // right - specifies that the output should be right justified 
    for(int i=0,sz=lines.size();i<sz;++i) 
    ss << setw((sz - i) + lines[i].length()) << right << lines[i] << endl; 

    cout << ss.str(); 
    return 0; 
} 

इस उदाहरण में, मैं लाइन की चौड़ाई को उचित ठहराने के लिए सेटव का उपयोग कर रहा हूं। स्ट्रिंग के बाईं तरफ पैडिंग (एसजे - i) द्वारा दी जाती है जहां एसजे लाइनों की कुल संख्या है और मैं वर्तमान रेखा है। इसलिए प्रत्येक बाद की रेखा के बाईं ओर 1 कम जगह होती है।

अगला मुझे लाइन के मूल आकार (रेखाएं [i]। लम्बाई()) में जोड़ने की आवश्यकता है, अन्यथा लाइन में परिणामी स्ट्रिंग के लिए बाएं हाथ पर सही पैडिंग करने के लिए पर्याप्त जगह नहीं होगी पक्ष।

setw((sz - i) + lines[i].length()) 

आशा है कि इससे मदद मिलती है!

0

आप कोड है कि प्रारंभिक उत्पादन लिखते हैं की पहुंच है, और यदि आप लाइनों N आप लिख रहे हैं की संख्या पता है, तो आप बस कर सकता है, तो:

for(int i = 0; i < N; ++i) { 
    for(int j = 0; j < N - 1 - i; ++j) 
     sstr << " "; // write N - 1 - i spaces, no spaces for i == N. 
    // now write your numbers the way you currently do 
} 
+1

मुझे संदेह है कि यह काम करेगा जब एन बढ़ता है और दो अंकों की संख्याएं खेलती हैं। यह होगा? – nims

+1

@nims निश्चित रूप से, आपको अंकों की संख्या प्राप्त करने के लिए 'चौड़ाई = अधिकतम (चुनें (एन, के)% 10' की गणना करने की आवश्यकता होगी, और लिखें (एन -1 - i) * चौड़ाई सफेद जगहें।मेरा मुद्दा यह था कि गणना के बाद आउटपुट प्रारूपित करने के बजाय गणना के साथ प्रारूपण को जोड़ना आसान है। – TemplateRex

+0

किसी भी तरह से मुझे पहले मूल्यों की गणना करने के लिए यह अच्छा लगेगा और फिर आउटपुट प्रारूपित करें ... – AnatraIlDuck

संबंधित मुद्दे