编写程序,打印一下图案

雨巷流刀 2018-11-20 12:18:16
自己动手写了一个小小的程序,发现自己真几吧弱,一个小问题竟然让我花了半个多小时…… a ab abc abcd : : ab……z 下面是我写的程序 #include <stdio.h> void main() { int m,n; char A; for(n=1;n<=26;n++) { for(m=1,A=97;(m<=n)&&(A<=122);m++) { putchar(A); A++; } printf("\n"); } } 出现的问题主要有: 1.刚开始给 A 赋值时没有每次都将 A 赋值为 97 (将A放在循环外面了)。 2.花括号{}使用有些乱,导致意想不到的结果出现。
...全文
916 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 30 楼 lin5161678 的回复:

#include <stdio.h>
int main(int argc, char** argv)
{
for(argc=1; argc<'z'-'a'+2; ++argc)
printf("%.*s\n", argc, "abcdefghijklnmopqrstuvwxyz");
return 0;
}


这个就不多说了,一般人还不好意思写这样的代码,也就比直接输出结果稍好一点~~~
  • 打赏
  • 举报
回复
引用 30 楼 lin5161678 的回复:
[quote=引用 28 楼 早打大打打核战争 的回复:]
看到int i就知道你的聪明了~~~
哦 你的意见是不定义新变量??
#include <stdio.h>

int main(int argc, char** argv)
{
if(argc >= 'z' - 'a' + 2)
return 0;
for(argv='a'; argv < 'a' + argc; putchar(argv),argv = (int)argv + 1)
;
puts("");
main(argc + 1, NULL);
return 0;
}

[/quote]

你这版还不如上一版,依赖argc值的问题依然存在,而且argv是char**,对argv赋值、比较、输出、强制类型转换的代码全是错的
综合评价:你的基本功还不够,代码逻辑稍微复杂一点就无法把握,还达不到写精巧代码的程度。
  • 打赏
  • 举报
回复
嗯,笑料自然是有其可笑之处~~~
lin5161678 2018-11-26
  • 打赏
  • 举报
回复
引用 37 楼 早打大打打核战争 的回复:
[quote=引用 36 楼 lin5161678 的回复:]
[quote=引用 34 楼 早打大打打核战争 的回复:]
对不对你自己不会编译一下看看?作为C++编译你的代码就不可能通过,作为C编译有很多警告,尤其编译为64位代码有指针截断为int的问题。
#include <stdio.h> 谁让你用C++编译
至于警告
我知道代码是行为是怎么用的 警告无关紧要
指针截断为int 对呀 截断了 然后呢? 有什么问题??
没有 断就断呗[/quote]

1. 谁告诉你的C++不能用stdio.h?
2. 你以为换成cstdio就能过?
头文件能影响语言标准?"这是你基础差了 "这话实在是太准确了~~~
嗯,警告无所谓、指针截断无所谓... 你直接宣布你写的是标准就好了~~~ 没见到你写出任何水准之上的代码,保守点说,是毫无灵气的拙劣之作,客观评价就是基本功不及格,和你的目高于顶严重不匹配...
[/quote]等等 你的意思好像是 你把你写的递归输出三角形字母表的操作称之为 有灵性的作品??
噗噗噗哈哈哈哈哈
让我笑笑
lin5161678 2018-11-26
  • 打赏
  • 举报
回复
引用 38 楼 早打大打打核战争 的回复:
[quote=引用 35 楼 lin5161678 的回复:]
[quote=引用 32 楼 早打大打打核战争 的回复:]
[quote=引用 30 楼 lin5161678 的回复:]

#include <stdio.h>
int main(int argc, char** argv)
{
for(argc=1; argc<'z'-'a'+2; ++argc)
printf("%.*s\n", argc, "abcdefghijklnmopqrstuvwxyz");
return 0;
}


这个就不多说了,一般人还不好意思写这样的代码,也就比直接输出结果稍好一点~~~
[/quote]能够直接输出结果当然应该追求直接输出结果?
有什么不对么[/quote]

这话说的... 强词夺理了,老师让你编程求1000以内素数,你直接输出2 3 5 7... 能算合格?
[/quote]没做过acm?
acm水题要求输出1000以内素数 你直接输出 2 3 5 7.... 还能错了?
lin5161678 2018-11-26
  • 打赏
  • 举报
回复
引用 37 楼 早打大打打核战争 的回复:
[quote=引用 36 楼 lin5161678 的回复:]
[quote=引用 34 楼 早打大打打核战争 的回复:]
对不对你自己不会编译一下看看?作为C++编译你的代码就不可能通过,作为C编译有很多警告,尤其编译为64位代码有指针截断为int的问题。
#include <stdio.h> 谁让你用C++编译
至于警告
我知道代码是行为是怎么用的 警告无关紧要
指针截断为int 对呀 截断了 然后呢? 有什么问题??
没有 断就断呗[/quote]

1. 谁告诉你的C++不能用stdio.h?
2. 你以为换成cstdio就能过?
头文件能影响语言标准?"这是你基础差了 "这话实在是太准确了~~~
嗯,警告无所谓、指针截断无所谓... 你直接宣布你写的是标准就好了~~~ 没见到你写出任何水准之上的代码,保守点说,是毫无灵气的拙劣之作,客观评价就是基本功不及格,和你的目高于顶严重不匹配...
[/quote]

1. 谁告诉你的C++不能用stdio.h?
这句话意思是
这是一段 C语言代码
根本没考虑过用C++编译器编译

指针截断有问题
那么 请你介绍一下问题在哪里
标准不允许吗? 标准什么条文规定的?
实现不允许吗?
  • 打赏
  • 举报
回复
引用 35 楼 lin5161678 的回复:
[quote=引用 32 楼 早打大打打核战争 的回复:]
[quote=引用 30 楼 lin5161678 的回复:]

#include <stdio.h>
int main(int argc, char** argv)
{
for(argc=1; argc<'z'-'a'+2; ++argc)
printf("%.*s\n", argc, "abcdefghijklnmopqrstuvwxyz");
return 0;
}


这个就不多说了,一般人还不好意思写这样的代码,也就比直接输出结果稍好一点~~~
[/quote]能够直接输出结果当然应该追求直接输出结果?
有什么不对么[/quote]

这话说的... 强词夺理了,老师让你编程求1000以内素数,你直接输出2 3 5 7... 能算合格?
  • 打赏
  • 举报
回复
引用 36 楼 lin5161678 的回复:
[quote=引用 34 楼 早打大打打核战争 的回复:]
对不对你自己不会编译一下看看?作为C++编译你的代码就不可能通过,作为C编译有很多警告,尤其编译为64位代码有指针截断为int的问题。
#include <stdio.h> 谁让你用C++编译
至于警告
我知道代码是行为是怎么用的 警告无关紧要
指针截断为int 对呀 截断了 然后呢? 有什么问题??
没有 断就断呗[/quote]

1. 谁告诉你的C++不能用stdio.h?
2. 你以为换成cstdio就能过?
头文件能影响语言标准?"这是你基础差了 "这话实在是太准确了~~~
嗯,警告无所谓、指针截断无所谓... 你直接宣布你写的是标准就好了~~~ 没见到你写出任何水准之上的代码,保守点说,是毫无灵气的拙劣之作,客观评价就是基本功不及格,和你的目高于顶严重不匹配...
lin5161678 2018-11-26
  • 打赏
  • 举报
回复
引用 34 楼 早打大打打核战争 的回复:
对不对你自己不会编译一下看看?作为C++编译你的代码就不可能通过,作为C编译有很多警告,尤其编译为64位代码有指针截断为int的问题。
#include <stdio.h> 谁让你用C++编译
至于警告
我知道代码是行为是怎么用的 警告无关紧要
指针截断为int 对呀 截断了 然后呢? 有什么问题??
没有 断就断呗
lin5161678 2018-11-26
  • 打赏
  • 举报
回复
引用 32 楼 早打大打打核战争 的回复:
[quote=引用 30 楼 lin5161678 的回复:]

#include <stdio.h>
int main(int argc, char** argv)
{
for(argc=1; argc<'z'-'a'+2; ++argc)
printf("%.*s\n", argc, "abcdefghijklnmopqrstuvwxyz");
return 0;
}


这个就不多说了,一般人还不好意思写这样的代码,也就比直接输出结果稍好一点~~~
[/quote]能够直接输出结果当然应该追求直接输出结果?
有什么不对么
  • 打赏
  • 举报
回复
对不对你自己不会编译一下看看?作为C++编译你的代码就不可能通过,作为C编译有很多警告,尤其编译为64位代码有指针截断为int的问题。
lin5161678 2018-11-26
  • 打赏
  • 举报
回复
引用 31 楼 早打大打打核战争 的回复:
[quote=引用 30 楼 lin5161678 的回复:]
[quote=引用 28 楼 早打大打打核战争 的回复:]
看到int i就知道你的聪明了~~~
哦 你的意见是不定义新变量??
#include <stdio.h>

int main(int argc, char** argv)
{
if(argc >= 'z' - 'a' + 2)
return 0;
for(argv='a'; argv < 'a' + argc; putchar(argv),argv = (int)argv + 1)
;
puts("");
main(argc + 1, NULL);
return 0;
}

[/quote]

你这版还不如上一版,依赖argc值的问题依然存在,而且argv是char**,对argv赋值、比较、输出、强制类型转换的代码全是错的
综合评价:你的基本功还不够,代码逻辑稍微复杂一点就无法把握,还达不到写精巧代码的程度。
[/quote]
不应该依赖argc值为1 这个意见有参考价值

argv赋值 比较 输出 类型转换 你以为是错的
这是你基础差了
对象指针可以转换为整型 也可以从整型转换为对象指针 并保证原值不变
这样的操作没有任何问题
顺便你自己不也写了
argv = (char **)(++argc * sizeof(char *))
为什么你觉得对argv赋值不对?

  • 打赏
  • 举报
回复
引用 20 楼 lin5161678 的回复:
[quote=引用 19 楼 DelphiGuy 的回复:]
[quote=引用 18 楼 weixin_43689161 的回复:]
[quote=引用 6 楼 早打大打打核战争的回复:]来个高中水平的:
for (char a[27] = {97, 0}, *p = a; *p < 123; (printf("%s\n", &a[p++, 0]), *(short *)p = *(p - 1) + 1));

大哥你的代码我看不懂啊…[/quote]

那就来个初中版的,自身递归26次每次输出一行:

#include <stdio.h>

int main(int argc, char *argv[])
{
if (argv ? argc = 25, argv = 0 : 0) main(argc, 0);
if (argc) main(argc - 1, 0);
for (argv = (char **)(++argc * sizeof(char *)), argc = 97; argv ? putchar(argc++) : (puts(""), 0); argv--);

return 0;
}

[/quote]你这递归写得有点傻
为什么要从 25往回调用
直接从1开始调用上去不是更方便吗


argv ? putchar(argc++) : (puts(""),0)
这里为什么要写成三目呢?
输出可以放在最后 判断循环次数直接 argv

三目运算符用得太频繁了 很多使用得没什么价值[/quote]

把你的聪明代码写出来让我学习一下...
  • 打赏
  • 举报
回复
并不难,只是娱乐之作。如果这样写好理解一些:

#include <stdio.h>

void T(int n) {n > 97 ? T(n - 1), putchar(n) : putchar(n);}
void P(int n) {n > 97 ? P(n - 1), T(n) : T(n); puts("");}

int main()
{
P(122);

return 0;
}

lin5161678 2018-11-23
  • 打赏
  • 举报
回复
引用 28 楼 早打大打打核战争 的回复:
看到int i就知道你的聪明了~~~
哦 你的意见是不定义新变量??
#include <stdio.h>

int main(int argc, char** argv)
{
if(argc >= 'z' - 'a' + 2)
return 0;
for(argv='a'; argv < 'a' + argc; putchar(argv),argv = (int)argv + 1)
;
puts("");
main(argc + 1, NULL);
return 0;
}


#include <stdio.h>
int main(int argc, char** argv)
{
for(argc=1; argc<'z'-'a'+2; ++argc)
printf("%.*s\n", argc, "abcdefghijklnmopqrstuvwxyz");
return 0;
}
  • 打赏
  • 举报
回复
PS: 你假定argc初始值为1是危险的,属于靠天吃饭~~~
  • 打赏
  • 举报
回复
看到int i就知道你的聪明了~~~
lin5161678 2018-11-23
  • 打赏
  • 举报
回复
#include <stdio.h>
int main()
{
for(int i=1; i<'z'-'a'+2; ++i)
printf("%.*s\n", i, "abcdefghijklnmopqrstuvwxyz");
return 0;
}
lin5161678 2018-11-23
  • 打赏
  • 举报
回复
引用 23 楼 早打大打打核战争 的回复:
[quote=引用 20 楼 lin5161678 的回复:]
[quote=引用 19 楼 DelphiGuy 的回复:]
[quote=引用 18 楼 weixin_43689161 的回复:]
[quote=引用 6 楼 早打大打打核战争的回复:]来个高中水平的:
for (char a[27] = {97, 0}, *p = a; *p < 123; (printf("%s\n", &a[p++, 0]), *(short *)p = *(p - 1) + 1));

大哥你的代码我看不懂啊…[/quote]

那就来个初中版的,自身递归26次每次输出一行:

#include <stdio.h>

int main(int argc, char *argv[])
{
if (argv ? argc = 25, argv = 0 : 0) main(argc, 0);
if (argc) main(argc - 1, 0);
for (argv = (char **)(++argc * sizeof(char *)), argc = 97; argv ? putchar(argc++) : (puts(""), 0); argv--);

return 0;
}

[/quote]你这递归写得有点傻
为什么要从 25往回调用
直接从1开始调用上去不是更方便吗


argv ? putchar(argc++) : (puts(""),0)
这里为什么要写成三目呢?
输出可以放在最后 判断循环次数直接 argv

三目运算符用得太频繁了 很多使用得没什么价值[/quote]

把你的聪明代码写出来让我学习一下...
[/quote]

#include <stdio.h>

int main(int argc, char** str)
{
if(argc >= 'z' - 'a' + 2)
return 0;
for(int i='a'; i < 'a' + argc; putchar(i++))
;
puts("");
main(argc + 1, NULL);
return 0;
}

PS 用递归没什么意义
这里只是说明一下就算要递归
从1开始递归不停增加
要比从后面开始不停减少合适
从后面开始还需要一个变量 标记是第一次调用还是递归调用
另一个问题是 for循环里面 输出表达式 写在更新的位置比写在判断的位置合适
  • 打赏
  • 举报
回复
突然发现老赵的年纪和Linus Torvalds差不多~~~
加载更多回复(21)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧