[英]Any ways to make this shorter?
输出应该以这种方式
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();
}
如果您使用的是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") ;
}
我将此链接放在ideone上。
“作弊” ;-)但很短的解决方案是
#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
,并且编译器必须接受两种特殊形式:
int main();
int main(int argc, char** argv);
我正在使用第二个。 更加流行的形式int main(int argc, char* argv[])
等效于(2)。 实际上,通常,将用作函数参数的T数组隐式转换为指向T的指针 。 在此示例中, char* argv[]
是指向char的指针的数组,该数组变为指向 char的指针的指针 。 上面的程序虽然没有使用第二个参数(它要么被忽略,要么被赋予NULL,即0值)。
该程序没有进行循环,而是递归调用main
。 实际上,这是非法的,但是主要的编译器对此视而不见(如果您要求使用选项-Wpedantic对其进行窃,则至多GCC都会发出警告)。 当从命令行中不带参数的情况下调用该程序时,操作系统将调用main
传递1
(即1
+参数的数量)和指向char的指针的指针 ,正如所指出的那样,此程序会忽略它。 因此,在第一次通话时, i = 1
。
随后, main
可能会调用每次递增i
自身。 总之, main
被顺序调用i
是1
, 2
, 3
, 4
,...
很容易看出,对于i
这个值序列,表达式i < 6 ? i : 11 - i
i < 6 ? i : 11 - i
计算结果为1
, 2
, 3
, 4
, 5
, 5
, 4
, 3
, 2
, 1
, 0
,...(这也可被表示为5.5 - abs(5.5 - i)
按德鲁Dorman的解决方案但使用三元运算符避免了需要#include <cmath>
,这节省了一行;-)这些数字是每次应显示的“ INDIA”字符数。
调用printf("%.s\\n", j, "INDIA")
,其中j = i < 6 ? i : 11 - i
j = i < 6 ? i : 11 - i
,显示“ INDIA”的前j
字符,后跟新行,并返回有效打印的字符数(包括新行),即j + 1
。 拿走1
产生j
。
现在我们回想起a && b
的语义对于整数a
和b
的重要意义。 如果a == 0
, 则不评估 b
。 否则,将评估b
。 对于我们来说, a = printf("%.*s\\n", j, "INDIA") - 1
(即a = j
)和b = main(i + 1, 0)
。
现在,让我们将这些片段放在一起。
1.最初, i = 1
, j = 1
。 对printf
的调用输出“ I \\ n”并返回2
。 拿走1
,得到a = 1 != 0
。 因此,对b = main(2, 0)
进行求值(即,调用main(2, 0)
)。
2.好吧,对于第二次调用main
,我们有i = 2
, j = 2
, printf
显示“ IN \\ n”, a = 2 != 0
和b = main(3, 0)
。
重复此参数,在每次调用main
我们都有:
3. i = 3
, j = 3
,打印“ IND \\ n”, a = 3 != 0
并调用main(4, 0)
。
4. i = 4
, j = 4
,打印“ INDI \\ n”, a = 4 != 0
并调用main(5, 0)
。
5. i = 5
, j = 5
,打印“ INDIA \\ n”, a = 5 != 0
并调用main(6, 0)
。
6. i = 6
, j = 5
,打印“ INDIA \\ n”, a = 5 != 0
并调用main(7, 0)
。
7. i = 7
, j = 4
,打印“ INDI \\ n”, a = 4 != 0
并调用main(8, 0)
。
...
10. i = 10
, j = 1
,打印“ I \\ n”, a = 1 != 0
并调用main(11, 0)
。
11. i = 11
, j = 0
,打印“ \\ n”, a = 0
。 现在main(12, 0)
12,0 main(12, 0)
不执行, main
返回
请注意, main
在步骤1调用main
在步骤2中,它调用main
在步骤3
,...它调用main
在步骤11中。因此, main
在步骤11返回到main
在步骤10中,其返回到main
步骤9中, ...,它返回到步骤1中的main
。最后,步骤1中的main
返回到操作系统。
如果您对更多混淆的代码感兴趣,请参阅IOCCC的现有和过去获奖者。 请享用!
短一点
#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;
}
}
您可以使用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;
...
像这样:无论如何,很难做到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;
}
这是使用两个循环的示例:
#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
您可以这样:
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;
}
}
基于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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.