有什么方法可以缩短它?

时间:2013-03-28 17:34:07

标签: c++

输出应该是这种方式

I
IN
IND
INDI
INDIA
INDIA
INDI
IND
IN
I

我想知道是否有办法缩短我的课程。

也许使用2个while循环或2个for循环而不是4个。

#include<iostream>
#include<conio.h>
using namespace std;
void main()
{
    char a[]={'I','N','D','I','A'};
    int r,c;
    for(r=1;r<=5;r++)
    {
        for(c=0;c<r;c++)
            cout<<a[c]<<" ";
        cout<<endl;
    }

    for(r=5;r>=0;r--)
    {
        for(c=0;c<r;c++)
            cout<<a[c]<<" ";
        cout<<endl;
    }
    _getch();
}

8 个答案:

答案 0 :(得分:10)

如果您使用的是C ++ 11,这很好而且简短:

#include <stdio.h>
#include <initializer_list>
int main() {
    for (int i : {1,3,5,7,9,9,7,5,3,1})
        printf ("%.*s\n", i, "I N D I A") ;
}

我把它放在this link的意思号上。

答案 1 :(得分:2)

“作弊”;-)但很短的解决方案是

#include <cstdio>
int main() {
    puts("I\nIN\nIND\nINDI\nINDIA\nINDIA\nINDI\nIND\nIN\nI\n");
}

另一种解决方案基于 TonyK 的漂亮想法(适用于C和C ++):

#include <stdio.h>
int main() {
    for (int i = 1; i < 11; ++i)
        printf("%.*s\n", i < 6 ? i : 11 - i, "INDIA") ;
}

更新:(在TonyK的评论之后):

如果你想要空格,那么用这个

替换上面的printf
printf("%.*s\n", 2*(i < 6 ? i : 11 - i), "I N D I A ");

更新:没有循环的解决方案:

#include <stdio.h>
int main(int i, char**) {
    return printf("%.*s\n", i < 6 ? i : 11 - i, "INDIA") - 1 && main(i + 1, 0);
}

有关初学者的详细解释如下。

最重要的一点是,这是一次“学术”练习。代码是模糊的,人们应该避免编写像这样的严肃代码。

标准不修复函数main的特定签名。它只表示必须返回int并且编译器必须接受两种特定形式:

  1. int main();
  2. int main(int argc, char** argv);
  3. 我正在使用第二个。更受欢迎的形式int main(int argc, char* argv[])相当于(2)。实际上,通常,用作函数参数的数组T 被隐式转换为指向T 的指针。在此示例中,char* argv[]是一个指向char 的指针数组,它成为指向char 指针的指针。上面的程序虽然没有使用第二个参数(它被忽略或给定一个NULL,即0值)。

    程序不是循环,而是递归调用main。实际上,这是非法,但主要编制者对此视而不见(如果你要求它选择-Wpedantic,那么最多GCC会发出警告)。当使用无参数从命令行调用程序时,操作系统调用main传递11 +参数数量)和a 指向char 指针的指针,如上所述,该程序将忽略该指针。因此,在第一次通话时i = 1

    随后,main每次都可能会自行调整i。总而言之,maini1234,...,

    很容易看出,对于i的此值序列,表达式i < 6 ? i : 11 - i的计算结果为123,{{1 }},4554321,...(这个根据Drew Dorman的解决方案也可以用0来表示,但是使用三元运算符可以避免需要5.5 - abs(5.5 - i)来保存一条线;-)这些数字是应该是“INDIA”的字符数量每次显示。

    调用#include <cmath>,其中printf("%.s\n", j, "INDIA")显示“INDIA”的第一个j = i < 6 ? i : 11 - i个字符,后跟一个新行,并返回有效打印的字符数(包括新行) ,即j。带走j + 1收益1

    我们现在回想起j语义的重要一点,即整数a && ba。如果b,则a == 0 未评估。否则,将评估b。对我们来说,b(即a = printf("%.*s\n", j, "INDIA") - 1)和a = j

    现在,让我们把这些碎片放在一起。

    1。最初,b = main(i + 1, 0)i = 1。对j = 1的调用输出“I \ n”并返回printf。带走2,即可获得1。因此,a = 1 != 0被评估(即,b = main(2, 0)被调用)。

    2。那么,对于main(2, 0)的第二次通话,我们maini = 2j = 2显示“IN \ n” ,printfa = 2 != 0已经过评估。

    重复这个论点,每次调用b = main(3, 0)我们都有:

    3。 maini = 3,“IND \ n”已打印,j = 3a = 3 != 0被调用。

    4。 main(4, 0)i = 4,打印“INDI \ n”,j = 4a = 4 != 0被调用。

    5。 main(5, 0)i = 5,“INDIA \ n”已打印,j = 5a = 5 != 0被调用。

    6。 main(6, 0)i = 6,“INDIA \ n”已打印,j = 5a = 5 != 0被调用。

    7。 main(7, 0)i = 7,打印“INDI \ n”,调用j = 4a = 4 != 0

    ...

    10。 main(8, 0)i = 10,打印“我\ n”,j = 1a = 1 != 0被调用。

    11。 main(11, 0)i = 11,“\ n”已打印,j = 0。现在a = 0未被提及且main(12, 0)返回

    请注意,步骤1中的main在步骤2中调用main,在步骤main中调用main,...在步骤中调用3 11.因此,步骤11中的main在步骤10中返回main,在步骤9中返回main,...,在步骤1中返回main最后,步骤1中的main返回操作系统。

    如果您对更加混淆的代码感兴趣,请查看IOCCC的现在和过去的获奖者。享受!

答案 2 :(得分:1)

短。

#include <iostream>
#include <cmath>

int main()
{
    char a[]={'I','N','D','I','A'};
    for(int r=1;r<=10;r++)
    {
        int c = 5.5 - std::abs(5.5 - r);
        std::cout << std::string(a, 0, c) << std::endl;
    }
}

答案 3 :(得分:0)

您可以使用substr

此外,如果你想在字符之间添加空格(就像你现在在代码中那样),你可以对整个单词做一次,然后处理那个修改过的字符串:

input = "INDIA";
modifiedInput = ...; // Figure out a way to get "I N D I A " here
for (int i = 1; ...)
    cout << substr(modifiedInput, 0, 2 * i) << endl;
...

答案 4 :(得分:0)

像这样: 无论如何,2个循环很难)

 int i=1;
bool ind=0;
     for(r=0;r<10;r++)
      {
if (ind == 0){
          for(c=0;c<i;c++)
              cout<<a[c]<<" ";
    i++; }


    if (ind == 1){
          for(c=0;c<i;c++) cout<<a[c]<<" ";
    i--;
        }
    if (i % 5 == 0) ind=1;
        cout<<endl;
      }

答案 5 :(得分:0)

以下是使用两个循环的示例:

#include<iostream>

using namespace std;
int main()
{
  char a[]={'I','N','D','I','A'};
  int arr_length=5;
  bool two_times=false;//if you want to output INDIA twice
  for(int i=2*arr_length-1; i>=1; i--)
  {
      for(int j=0; j<arr_length-abs(arr_length-i); j++)
      {
            cout << a[j];
      }
      if(i==arr_length && !two_times){ two_times=true; i++;}//if you want to output INDIA twice
      cout << endl;
  }
  return 0;
}

输出:

I
IN
IND
INDI
INDIA
INDIA
INDI
IND
IN
I

答案 6 :(得分:0)

你可以这样做:

void main()
{
  char a[]={'I','N','D','I','A'};
  int r,c;

  int x = 0;  // initially x is 0 
  int l = 5;
  for(r=1;r<= 11 ;r++)  //loop runs for 5*2 + 1 times
  {
     if(r>=6){
       x = l - r % 6;  //set x to remaining length 
       l--;
     }
     for(c=0;c< (r % 6) + x; c++)  // add x 
         cout<<a[c]<<" ";
     cout<<endl;
  }
}

你可以找到它working here.

答案 7 :(得分:0)

另一种基于TonyK答案的解决方案。您可以输入所需的字符串。

#include <stdio.h>
#include <string.h>
int main() {
    char s[100];
    gets(s);
    for (int i = 0; i < strlen(s) * 2; i++)
        printf ("%.*s\n", i < strlen(s) ? i + 1: 2 * strlen(s) - i, s);
}

http://ideone.com/Zsg5Lu