2012-02-25 285 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

计算最后一行的宽度,然后使用该信息将每一行居中。 – 2012-02-25 11:50:39

+0

我想知道如何做到这一点。<。< – RnD 2012-02-25 11:54:03

+0

你可能也想看看'width'参数。 – 2012-02-25 11:56:19

回答

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

这是工作,如果所有的数字打印在一个独特的字符串 – 2012-02-25 12:36:28

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

这绝对是这次大声笑 – Beeblbrox 2012-02-25 13:06:19

0

首先你必须计算你的第二个数字的位数。它是如此容易。然后,您可以使用以下公式计算金字塔深度:(第二个数字 - 第一个数字)+1。之后,您可以确定在最后一行中,您将拥有的最大数字数((第二个数字 - 第一个数字)* 2 + 1)*数字计数=金字塔头部的x。所以你应该在(x,y)=(金字塔头的x,...)处打印金字塔的头部。

0

要确定最后一行的长度,可以将输出写入std::stringstream并获取长度为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的运输及工务局局长,但这种情况下,你必须写所有数字的字符串并打印全每次都有字符串。

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; 
}