问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言编程下图怎么做?

发布网友 发布时间:2022-04-30 00:03

我来回答

1个回答

热心网友 时间:2022-06-26 17:59

方法有很多种:

一、直接循环,通过变量计数判断每个字符输出的内容。缺点:逻辑繁琐。

二、把图像看成固定长度的多行字符串(最大行宽用常量或动态数组)。

这样两个题目就都统一成一个思路,那就是循环重复打印一个字符串。而这个字符串在每次循环都改变自己的内容。

改变内容的方法:初始用两个指针指向这个字符串的中心位置,不断往两边移动,移动同时改变指向地址的值。

这里,如指针移动到两头,程序就结束,那么打印的就是题目二的三角形。如到两头再往回走,打印的就是菱形。

另外要注意:1、菱形是固定字符黑桃。而三角形是循环打印大写字母。

2、字符之间是有宽度的,不能直接用%s输出一行字符串,需要循环输出指定宽度字符。

因此,按照编程思想,输出打印一个字符串以及循环大写字母这两个功能是要重复调用的,要单独写函数。

下面是代码:

#include <stdio.h>

#define MLEN 50//图形最大行宽度

void show1();//对应题目1的菱形

void show2();//对应题目2的三角形

void showLine(char lnStr[],int n,int d);//打印输出一行图形,参数:行数组、数组长度、字符间隔大小

char getLetter();//每次调用,返回A~Z的一个字母,字母循环

int main()

{

    show1();

    show2();

    return 0;

}

void showLine(char lnStr[],int n,int d)

{

    int i;

    for(i=0;i<n;i++) printf("%*c",d,lnStr[i]);

    printf("\n");

}

char getLetter()

{

    char b;

    static char w='A';

    b=w;

    if(w<'Z') w++;

    else w--;

    return b;

}

void show1()

{

    int i,flag=1,n=0;

    char lnStr[MLEN]={0},*p0=NULL,*p1=NULL;

    while(n<=1 || n%2==0 || n>=MLEN)

        printf("请输入菱形最大宽度n(字符个数n必须是大于1且小于%d的奇数):",MLEN),scanf("%d",&n);

    for(i=0;i<n;i++) lnStr[i]=' ';//初始化一行空格

    p0=p1=&lnStr[n/2];//指针初始指向中间

    while(p0<=p1)

    {

        if(flag) *p0=*p1=5,p0--,p1++;//标识为1,两指针指向地址值变黑桃,之后分别向两边移动

        else *p0=*p1=' ',p0++,p1--;//标识为0,两指针指向地址值变空格,之后分别向中间移动

        showLine(lnStr,n,2);

        if(p0+1==&lnStr[0]) p0++,p1--,flag=0;//两指针移动到两头,开始反向移动

    }

}

void show2()

{

    int i,n=0;

    char lnStr[MLEN]={0},*p0=NULL,*p1=NULL,*p=NULL;

    while(n<=1 || n%2==0 || n>=MLEN)

        printf("请输入三角形底边宽度n(字符个数n必须是大于1且小于%d的奇数):",MLEN),scanf("%d",&n);

    for(i=0;i<n;i++) lnStr[i]=' ';//初始化一行空格

    p0=p1=&lnStr[n/2];//指针初始指向中间

    while(1)

    {

        showLine(lnStr,n,2);

        if(p0+1==&lnStr[0]) break;

        p=p0;

        while(p<=p1) *p=getLetter(),p++;

        //两指针之间的地址值循环取大写字母,之后分别向两边移动

        p0--,p1++;

    }

}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
离职几个月公司发短信说我离职生效叫我回去补办离职交接手续怎么 开除员工不办手续违法吗 辞退员工没有办手续违法吗 苹果13/6.1录制两个人脸,后面换锁屏密码认证还有什么提醒,或者是两个人... 很规律很威严的词语是什么 我老了又无能 想有个爱我一辈子的 到今没 就一个人 把爱放心里 用数字... 日语N2 20天复习够吗 为什么泥工先于木工 泥工做好隔多久做木工 从泥工做好到做木工,需要等待多久? 水泥操作人员作业流程是怎样的? 怎么用c语言编程画出场图 我家电脑与音响连不上是怎么回事啊 在C语言编程中,图要如何创建和遍历? 电脑与音响连接不上怎么办? 电脑连不上音响,一连就蓝屏? Edifier音响为什么连不上电脑 另外一根线是要怎么插? 一般纳税人适用什么税率 音响连接不了笔记本电脑什么原因 人体有静电碰到电脑会黑屏是什么原因? 电脑遇到黑屏怎么办啊 你好 我想问一下笔记本开机到一半就黑屏该怎么处理,释放静电用了没效果? 我的电脑总是不经意间就黑屏了,去修说是主板有静电,把电池拿出来再安上就行了,有没有防静电的方法? r9000p为什么会静电黑屏 笔记本黑屏有静电怎么处理?加急!!! 放电脑内存静电是怎么回事,电脑存在黑屏 机箱有静电 导致电脑自动关机 黑屏 电脑静电黑屏怎么办 近视眼戴眼镜度数会越来越加深吗? 2010陕西高考分数线 长期戴眼镜会使近视度越来越深的?会加重近视吗?不带又会加重吗? C语言简单编程 流程图 c语言编程图形,高手来 C语言编程,下图怎么编程啊? C语言编程,顺便写下流程图,谢谢 C语言编程题(图案) 如何用c语言编写图形 c语言编程,编译过程求图 华为COULD 是什么 cloud华为云服务登录 ...不是很了解,问问各位高手华为的cloud+是什么意思啊? 感冒了喝姜茶有用吗??? 挖的笈荠菜太多了吃不完,可以冻冰箱里吗 芨芨菜的食用禁忌 荠菜在冰箱里冷冻可以储存多久 芨芨菜如何贮藏的方法 昨天超话打榜签到连续201天了,为什么今天又是第一天签? 芨芨菜出来了还能盖着吗 我不想说再见的完整吉他谱 我不想说再见的歌词 加油吧 实习生 36集里面的歌 (你我天各一方的爱) 这句歌词是哪首歌啊