C语言打印直方图(垂直方向)

C语言打印直方图(垂直方向)

    本人学生,在学习C时用的是学校编的书,效果很差,后来买了《The C Programming Language》,重新学习C语言,感觉很好。做里面的习题,打印单词长度的直方图,参考网上大神的代码,并加以修改,达到了自己满意的效果,代码方面我自己加了许多注释,希望对大家有用。

程序功能说明

   输入:输入单词,以空格、回车、制表符为间隔,EOF为结束输入。(window 下CTRL+Z ,Linux 下CTRL +D)

   输出:打印输入的单词数量、最大单词长度以及单词长度直方图。

程序功能展示

输入
输入:I am a student  CTRL +Z 结束

输出
这里写图片描述

代码片段
绘制直方图的代码,两个For循环

/*
     绘制直方图
     备注:本来想用\t制表符来替换空格的,但发现\t 打出来的空格不一样多
           下面我会注释用了多少空格的 ,用空格是为了打印出来的直方图对齐 
*/
void vertical(int array[],int len)
{
    int maxValue = max(array,len);    
    int j;
    int i;  
    printf("  y/num↑\n");               /* 打印直方图的y轴顶部 , y前面2个SP    */ 

    for(i = maxValue + 1; i > 0; i--)
    {
        printf("%8d|_  ", i);           /*  打印直方图的y轴    */
        for(j = 0; j < len; j++)
        {
            if(array[j] == i)           /*  打印直方图的顶部 ,1个SP,3个_,4个SP */
            {
                printf(" ___    ");      
            }
            else if(array[j] >= i)      /*  打印直方图的侧部 ,2个|,3个SP,3个SP */
            {
                printf("|   |   ");
            }
            else if(array[j] == i-1)    /*  打印该数据,位于直方图顶部的上方     */
            {
                printf(" (%d)    ",array[j]);
            }
            else
            {
                printf("        ");     /*  无数据     8个SP                 */
            }
        }

        printf("\n");
    }

    /*
    *   纯属美观需要,并打印 X轴 
    *
    */
    printf("       0");

    for(i = 0; i < len + 1; i++)
    {
        printf("|___|___");
    }
    printf("|___→\n");

    for(i = 0; i< (2 * len); i++)
    {
        printf("\t");
    }
    printf("\tx/word\n\t ");

    for(i = 0; i < len; i++)
    {
        printf("   word%d",i+1);     /* 3个SP */ 
    }
    printf("\n\n");
}

最终代码

#include<stdio.h>
#include<string.h>

/* word 数量*/
#define NUM 100


/*  
    数组中的最大数
*/
int max(int* array,int len)
{
    int maxValue = 0;
    int i=0;
    for(i = 0; i < len; i++)
    {
        if(array[i] > maxValue)
        {
            maxValue = array[i];
        }
    }
    return maxValue;
}

/*
     绘制直方图
     备注:本来想用\t制表符来替换空格的,但发现\t 打出来的空格不一样多
           下面我会注释用了多少空格的 ,用空格是为了打印出来的直方图对齐 
*/
void vertical(int array[],int len)
{
    int maxValue = max(array,len);    
    int j;
    int i;  
    printf("  y/num↑\n");               /* 打印直方图的y轴顶部 , y前面2个SP   */ 

    for(i = maxValue + 1; i > 0; i--)
    {
        printf("%8d|_  ", i);           /*  打印直方图的y轴    */
        for(j = 0; j < len; j++)
        {
            if(array[j] == i)           /*  打印直方图的顶部 ,1个SP,3个_,4个SP */
            {
                printf(" ___    ");      
            }
            else if(array[j] >= i)      /*  打印直方图的侧部 ,2个|,3个SP,3个SP */
            {
                printf("|   |   ");
            }
            else if(array[j] == i-1)    /*  打印该数据,位于直方图顶部的上方    */
            {
                printf(" (%d)    ",array[j]);
            }
            else
            {
                printf("        ");     /*  无数据     8个SP                        */
            }
        }

        printf("\n");
    }

    /*
    *   纯属美观需要,并打印 X轴 
    *
    */
    printf("       0");

    for(i = 0; i < len + 1; i++)
    {
        printf("|___|___");
    }
    printf("|___→\n");

    for(i = 0; i< (2 * len); i++)
    {
        printf("\t");
    }
    printf("\tx/word\n\t ");

    for(i = 0; i < len; i++)
    {
        printf("   word%d",i+1);     /* 3个SP */ 
    }
    printf("\n\n");
}

int main()
{
    int words[NUM];
    char temp[NUM][100];
    int i;
    int num;

    num = 0;

    printf("请输入单词:");
    while(1)                                /* 循环输入单词,直到EOF结束 */ 
    {
        if (scanf("%s", temp[num])==EOF)
        {
            break;
        }
        else
        {
            num++;
        }
    }
    printf("\n共输入了%d个单词:", num);


    for(i = 0; i < num; i++)
    {
        printf("\n\t word%2d is %s\n", i+1, temp[i]);
    }

    for(i = 0; i < num; i++)
    {
        words[i] = strlen(temp[i]);
    }

    int maxValue = max(words,num);
    printf("maxValue =%d \n", maxValue);
    vertical(words,num);
    return 0;
}
  • 25
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
位图直方图均衡是一种常见的图像处理方法,用于增强图像对比度和亮度。以下是C语言实现位图直方图均衡的基本步骤: 1. 读取位图文件头和位图信息头信息。 2. 读取位图像素数据,并将每个像素的灰度值记录在一个数组中。 3. 统计灰度值出现的次数,生成灰度值和出现次数的对应表。 4. 计算每个灰度值在图像中的出现概率,并生成累积概率表。 5. 根据累积概率表,将每个灰度值映射到新的灰度值上。 6. 重新生成像素数据,并将新的像素数据写入位图文件中。 下面是一个简单的C语言程序示例,用于实现位图直方图均衡: ```c #include <stdio.h> #include <stdlib.h> #pragma pack(push, 1) typedef struct { unsigned short signature; // 文件类型,"BM"表示Windows位图格式 unsigned int fileSize; // 文件大小 unsigned short reserved1; // 保留字段1 unsigned short reserved2; // 保留字段2 unsigned int dataOffset; // 数据偏移量 } BMPFileHeader; typedef struct { unsigned int headerSize; // 信息头大小 int width; // 图像宽度 int height; // 图像高度 unsigned short colorPlanes; // 颜色平面数量,固定值1 unsigned short bitsPerPixel; // 每个像素使用的位数 unsigned int compression; // 压缩类型 unsigned int imageSize; // 图像数据大小 int horizontalResolution; // 水平分辨率 int verticalResolution; // 垂直分辨率 unsigned int colorsUsed; // 调色板中的颜色数量 unsigned int importantColors; // 重要的颜色数量 } BMPInfoHeader; typedef struct { unsigned char blue; // 蓝色分量 unsigned char green; // 绿色分量 unsigned char red; // 红色分量 } RGB; #pragma pack(pop) void equalizeHistogram(unsigned char *imageData, int width, int height) { int histogram[256] = {0}; int cumulativeHistogram[256] = {0}; int i, j; unsigned char pixelValue; float probability; // 统计灰度值出现的次数 for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { pixelValue = imageData[i * width + j]; histogram[pixelValue]++; } } // 计算每个灰度值在图像中的出现概率 for (i = 0; i < 256; i++) { probability = (float)histogram[i] / (float)(width * height); cumulativeHistogram[i] = (int)(probability * 255.0f + 0.5f); } // 将每个灰度值映射到新的灰度值上 for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { pixelValue = imageData[i * width + j]; imageData[i * width + j] = cumulativeHistogram[pixelValue]; } } } int main(int argc, char *argv[]) { BMPFileHeader fileHeader; BMPInfoHeader infoHeader; FILE *inputFile, *outputFile; unsigned char *imageData; int width, height, padding, imageSize; // 打开输入文件 inputFile = fopen(argv[1], "rb"); if (inputFile == NULL) { printf("Error: Unable to open input file.\n"); return 1; } // 读取文件头和信息头信息 fread(&fileHeader, sizeof(BMPFileHeader), 1, inputFile); fread(&infoHeader, sizeof(BMPInfoHeader), 1, inputFile); // 获取图像宽度、高度、填充字节数和图像数据大小 width = infoHeader.width; height = infoHeader.height; padding = (4 - ((width * infoHeader.bitsPerPixel / 8) % 4)) % 4; imageSize = (width * infoHeader.bitsPerPixel / 8 + padding) * height; // 分配内存并读取图像数据 imageData = (unsigned char *)malloc(imageSize); fread(imageData, sizeof(unsigned char), imageSize, inputFile); // 关闭输入文件 fclose(inputFile); // 对图像进行直方图均衡 equalizeHistogram(imageData, width, height); // 打开输出文件 outputFile = fopen(argv[2], "wb"); if (outputFile == NULL) { printf("Error: Unable to open output file.\n"); free(imageData); return 1; } // 写入文件头和信息头信息 fwrite(&fileHeader, sizeof(BMPFileHeader), 1, outputFile); fwrite(&infoHeader, sizeof(BMPInfoHeader), 1, outputFile); // 写入图像数据 fwrite(imageData, sizeof(unsigned char), imageSize, outputFile); // 关闭输出文件 fclose(outputFile); // 释放内存 free(imageData); return 0; } ``` 该程序可以通过命令行参数指定输入文件和输出文件的路径,例如: ``` ./histogram_equalization input.bmp output.bmp ``` 注意,该程序只支持Windows位图格式(BMP)的文件。如果需要处理其他格式的图像文件,需要根据不同的文件格式进行解析和写入。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值