2012-02-25 6 views
4

Мне нужно написать программу, в которой требуется 2 целых числа из файла. Затем он должен сделать пирамиду из этих двух чисел. Он должен выглядеть следующим образом:C++ пирамида чисел

enter image description here

Я написал код, и она работает, как я хочу, бет, я не могу придумать способ, как сделать это выглядит пирамида, как.

Вот как это выглядит, когда я делаю это:

enter image description here

И это мой код:

#include <fstream> 
using namespace std; 

    int main(){ 

     ifstream inFile("Duomenys.txt"); 
     ofstream outFile("Rezultatai.txt"); 
     int N,M,smth,suma=0; 

     inFile >> N >> M; 
     smth=N; 

     while(N<=M){ 
      for(int i=smth;i<=N;i++){ 
       outFile<<i<<" "; 
       suma+=i; 
       if(i==N){ 
        for(int i=N-1;i>=smth;i--){ 
         outFile<<i<<" "; 
         suma+=i; 
        } 
       } 
      } 
      outFile<<endl; 
      N++; 
     } 
     outFile<<endl<<"Skaiciu suma: "<<suma; 

     inFile.close(); 
     outFile.close(); 
     return 0; 
    } 

Так что мой вопрос будет, как это сделать, что мой ответ был бы образный в пирамиде, как в примере?

+9

Вычислить ширину последней строки вверх, а затем использовать эту информацию для центрирования каждой строки. –

+0

Я хотел бы знать, как это сделать. <. < – RnD

+0

Вы также можете посмотреть параметр 'width'. –

ответ

0
#include <fstream> 
#include <iostream> 
#include <iomanip> 
#include <assert.h> 

using namespace std; 

template <class T> 
int numDigits(T number) 
{ 
    int digits = 0; 
    while (number) { 
     number /= 10; 
     digits++; 
    } 
    return digits; 
} 

int main() 
{ 
    ifstream inFile("Duomenys.txt"); 
    ofstream outFile("Rezultatai.txt"); 
    int N,M,smth,suma=0; 

    inFile >> N >> M; 
    smth=N; 

    // assuming positive numbers 
    assert(N>=0 && M>=0); 
    // this will be the size of each printed number 
    int nd = numDigits<int>(M)+1; 

    while(N<=M){ 
     for(int i=N;i<=M;i++) 
      outFile << setw(nd) << " "; 
     for(int i=smth;i<=N;i++){ 
      outFile << setw(nd) << i; 
      suma+=i; 
      if(i==N){ 
       for(int i=N-1;i>=smth;i--){ 
        outFile << setw(nd) << i; 
        suma+=i; 
       } 
      } 
     } 
     outFile<<endl; 
     N++; 
    } 
    outFile<<endl<<"Skaiciu suma: "<<suma; 

    inFile.close(); 
    outFile.close(); 
    return 0; 
} 
+0

Это работало, если все номера были напечатаны в уникальной строке –

0
inFile >> N >> M; 
     smth=N; 

     while(N<=M){ 
      for(int position=0;position<(M-N);position++){ // doesn't work if M<N obviously 
       for(int digit=(smth+position);digit;digit=digit/10){ 
        outFile<<" "; 
       } 
       outFile<<" "; // this is to complement the spacer for each digit in your code 
      } 
      for(int i=smth;i<=N;i++){ 
       outFile<<i<<" "; 
       ... 
+0

Это определенно на этот раз lol – Beeblbrox

0

Сначала вы должны вычислить количество цифр вашего второго номера. Это очень просто. Затем вы можете рассчитать глубину заключенной пирамиды, используя: (второе число-первое число) +1. После этого вы можете быть уверены, что в последней строке максимальное количество цифр, которое у вас есть, будет ((второе число - первое число) * 2 + 1) * число цифр = x головы пирамиды. Таким образом, вы должны напечатать главу пирамиды в точке (x, y) = (x головы пирамиды, ....)

0

Чтобы определить длину последней строки, вы можете либо записать свой вывод на , либо получить длиной с myStrStream.str().size() (и затем распечатайте содержимое потока строк до std::cout или вашего outFile), или вы можете подсчитать длину всех элементов последней строки отдельно, а затем суммировать затем вверх, включая пробелы. Я думаю, что первый подход проще.

Самый простой подход - это откат.

0

Это также зависит от цифр, которые имеют каждый номер. Предполагая, что каждое число имеет две цифры, достаточно добавить определенное количество пробелов для каждой итерации. Это число в вашем случае 5 во время первой итерации, и заканчивается равна нулю:

#include <fstream> 
using namespace std; 

int main(){ 

    ifstream inFile("Duomenys.txt"); 
    ofstream outFile("Rezultatai.txt"); 
    int N,M,smth,suma=0; 

    inFile >> N >> M; 
    smth=N; 

    while(N<=M){ 
     for(int i=smth;i<=N;i++){ 
      outFile<<i<<" "; 
      suma+=i; 
      if(i==N){ 
       for(int i=N;i<M;i++) 
        cout << " "; 
       for(int i=N-1;i>=smth;i--){ 
        outFile<<i<<" "; 
        suma+=i; 
       } 
      } 
     } 
     outFile<<endl; 
     N++; 
    } 
    outFile<<endl<<"Skaiciu suma: "<<suma; 

    inFile.close(); 
    outFile.close(); 
    return 0; 
} 

Альтернативой является использование iomanip-х setw, но в этом случае вы должны записать все числа в строку и напечатать весь строка каждый раз.

0
#include<fstream> 
using namespace std; 
ofstream outFile("output"); 
void printSpace(int a){ 
    string spaces(a,' '); 
    outFile<<spaces; 
} 
int main(){ 
    int N=1,M=11,smth=4,suma=0; 
    int l=2*(M-N); 
    while(N<=M){ 
     printSpace(l); 
     for(int i=smth;i<=N;i++){ 
      outFile<<i<<" "; 
      suma+=i; 
      if(i==N){ 
       for(int i=N-1;i>=smth;i--){ 
        outFile<<i<<" "; 
        suma+=i; 
       } 
      } 
     } 
     l-=2; 
     outFile<<endl; 
     N++; 
    } 
    outFile<<endl<<"Skaiciu suma: "<<suma; 

    outFile.close(); 
    return 0; 
} 
Смежные вопросы