c语言-请教一个C编程 打印输出图像的算法编程

问题描述

请教一个C编程 打印输出图像的算法编程

解决方案


大概就是这样,建立笛卡尔坐标系。
用point()函数里的嵌套for循环来输出每一个字符,然后把代表坐标的i和j传递给getChar()函数通过坐标来决定输出的是什么字符。

解决方案二:

 char getChar(int x,int y,int n)
{
    if(x<0)
        x=-x;
    if(y<0)
        y=-y;

    if(x>y)
    {
        if(n-x<=2)
            return 'x'+n-x;
        else
            return '0'+n-x-3;
    }
    else
    {
        if(n-y<=2)
            return 'x'+n-y;
        else
            return '0'+n-y-3;
    }
}
int print(int n)
{
    for(int i=-n+1;i<n;i++)
    {
        for(int j=-n+1;j<n;j++)
        {
            printf("%c",getChar(j,i,n-1));
        }
        printf("n");
    }
    return 0;
}

int main()
{
    int a;
    scanf("%d",&a);
    print(a);
    return 0;
}


代码逻辑很简单,但是不怎么高效和简洁,还可以再改进。

解决方案三:

二维数组不是更简单吗?

解决方案四:

个人比较倾向于二维数组

解决方案五:

非常感谢 a1193561652 纵横车 的帮助,给了我思路和方法。我把方法总结如下:

首先把问题简化为下图所示的样子:

很显然,图是中心对称的。即相同的字符与中心的字符的相对位置是相同的,比如,n=4时,字符a距离中心点字符d的是3格(a在第三环),b距离d是2格(b在第二环),c距离d是1环。刚好,字符与中心点字符的距离就是两者之间的ascii码之差,比如 'd'-'a'=3。 就是说,只要算出要打印的字符与中心点字符d的距离(第几环),就可以得到要打印的字符的ascii码。计算两点之间的距离(第几环),很简单,分别计算两点的坐标X相减的绝对值和坐标Y相减的绝对值,取最大者即可。用代码表示为:max(abs(x1-x2),abs(y1-y2)) 每个点的坐标用行号,列号表示。假设左上角字母a坐标为(0,0),右下角字母a坐标为(2*n-2, 2*n-2), 则中心点d的坐标为(n-1,n-1)。

代码如下:

char mygetchar(int x, int y, int n)
{
int m = max(abs(x-(n-1)), abs(y-(n-1)));
return (char)('a' + n - 1 - m);
}

void myprint(int n)
{
int x, y;
for (y = 0; y < 2*n-1; y++)
{
for (x = 0; x < 2*n-1; x++)
{
printf("%c", mygetchar(x,y,n));
}
printf("n");
}
}

void main()
{
int a;
scanf("%d", &a);
myprint(a);
}

对于原题,只需要在此代码基础上,增加一个判断,若在最外面的三环,则输出x,y,z, 在其他环,则输出0~9。代码就不写了。

时间: 2024-09-24 15:28:22

c语言-请教一个C编程 打印输出图像的算法编程的相关文章

赋值-请教一个php自由增减的小算法。

问题描述 请教一个php自由增减的小算法. $i在0~30 的时候,$j是自由增减的,$i==30的时候,$j的值也一定要自由增减到30,不要直接就赋值30,这个算法怎么写呢? 解决方案 问题问的不是很清楚,$j自由增减是如何自由增减呢? 算法大体是这样: 1.先判断$i的值,是否在0~30里面 2.如果$i在0~30里面,$j自由增加,如果$i ==30,判断$j是否为30,是,结束代码,不是,$j++或$j-- 解决方案二: 我是新手,什么是自由增减呢,是随机增加一个数还是什么?如果是这样可

c语言-编写一个程序,打印输入中的单词长度的直方图。垂直方图。

问题描述 编写一个程序,打印输入中的单词长度的直方图.垂直方图. 直方图是如何理解????求教这道题~~ 这道题目是书上的!有没有懂的大神.给讲解啊. 解决方案 问题是怎么解决的? 我想到的就是算好格式用printf()一行行的输入,最后拼成直方图.

c语言-请教一个关于socket的问题

问题描述 请教一个关于socket的问题 代码中有这样一段 if ((m_UDPSndrSocket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) { AfxMessageBox("Failed to create UDPSocket"); return FALSE; } 然后出现了这样的错误 error C2065: 'WSASocket'

数据结构-请教一个有关c语言的问题

问题描述 请教一个有关c语言的问题 错误如下: yuan.cpp i:数据结构课程设计yiyuanduoxiangshiyuan.cpp(2) : error C2143: syntax error : missing ';' before 'PCH creation point' i:数据结构课程设计yiyuanduoxiangshiyuan.cpp(5) : error C2143: syntax error : missing ';' before 'PCH creation point'

推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】

    最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽然目前人气可能一般,但这里面题目和资源还是比较丰富的,希望给初学者一个帮助. 本文原文地址:[推荐]一个算法编程学习中文社区-51NOD[算法分级,支持多语言,可在线编译] 1.51NOD论坛介绍     该论坛网址:http://www.51nod.com/index.html     论

紧急请教一个c语言怎么写

问题描述 紧急请教一个c语言怎么写 一个变量包含一组数据,求从这个变量中抽出两个数相加的c语言程序怎么写 解决方案 什么类型的变量?int型数组变量?抽取的两个数有什么条件? 解决方案二: int a[20]; int i = 0,j=0,sum=0; for(i=0;i<20;i++){ //产生1--100 a[i]=rand()%100+1; } //产生0-20 i = rand() % 20; while(j==i){ j = rand() % 20; } sum = arr[i]+a

c语言-java小宝宝请教一个弱弱的问题。还请留步指教。

问题描述 java小宝宝请教一个弱弱的问题.还请留步指教. 各位高人,本人新手一枚.自己写的十六进制转化为十进制.有一点瑕疵就是,当提示输入一个数的时候,如果我什么都不输入,直接按enter(回车),程序就会陷入死循环,不能动了,只能Ctrl +c退出,搞不懂为什么,作为处女座,很难受. 自己琢磨了好久没琢磨出来.还请大大们指教指教,不胜感激. import java.util.Scanner; public class Test{ public static void main(String

r语言-请教R语言的一个数据统计问题

问题描述 请教R语言的一个数据统计问题 一个数据集中,包含"月份","手机号码"等字段.数据中包含多个月,且每个月有些手机号码会重复出现.现在想在原数据集增加一个字段"当月重复出现次数",等于[每条记录中手机号码在当月出现次数].请问在R中如何实现?谢谢! 解决方案 <项目一>请教一个关于获取post json数据的问题

请教一个c语言问题。谢谢!

问题描述 请教一个c语言问题.谢谢! 原例题: #include <stdio.h> #define maxline 1000 int getline(char line[],int max); void copy(char to[],char from[]); int main() {int len; char line[maxline]; char longest[maxline]; int max = 0; while((len = getline(line,maxline))>0