A<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.cppe.ru/index.php?action=history&amp;feed=atom&amp;title=C%2FDevelopment%2FBar_Chart</id>
		<title>C/Development/Bar Chart - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.cppe.ru/index.php?action=history&amp;feed=atom&amp;title=C%2FDevelopment%2FBar_Chart"/>
		<link rel="alternate" type="text/html" href="http://www.cppe.ru/index.php?title=C/Development/Bar_Chart&amp;action=history"/>
		<updated>2026-04-17T22:38:48Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.cppe.ru/index.php?title=C/Development/Bar_Chart&amp;diff=44&amp;oldid=prev</id>
		<title> в 14:20, 25 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.cppe.ru/index.php?title=C/Development/Bar_Chart&amp;diff=44&amp;oldid=prev"/>
				<updated>2010-05-25T14:20:56Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 14:20, 25 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://www.cppe.ru/index.php?title=C/Development/Bar_Chart&amp;diff=45&amp;oldid=prev</id>
		<title>Admin: 1 версия:&amp;#32;Импорт контента...</title>
		<link rel="alternate" type="text/html" href="http://www.cppe.ru/index.php?title=C/Development/Bar_Chart&amp;diff=45&amp;oldid=prev"/>
				<updated>2010-05-25T10:22:06Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия: Импорт контента...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Generating a bar chart==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Beginning C, Third Edition&lt;br /&gt;
 By Ivor Horton&lt;br /&gt;
 ISBN: 1-59059-253-0&lt;br /&gt;
 Published: Apr 2004&lt;br /&gt;
 Publisher: apress&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt; &lt;br /&gt;
#define PAGE_HEIGHT  20&lt;br /&gt;
#define PAGE_WIDTH   40&lt;br /&gt;
#define TRUE  1&lt;br /&gt;
#define FALSE 0&lt;br /&gt;
typedef struct barTAG         /* Bar structure       */&lt;br /&gt;
{&lt;br /&gt;
   double value;              /* Value of bar        */&lt;br /&gt;
   struct barTAG *pnextbar;   /* Pointer to next bar */&lt;br /&gt;
}bar;                         /* Type for a bar      */&lt;br /&gt;
typedef unsigned int uint;    /* Type definition     */&lt;br /&gt;
/* Function prototype */&lt;br /&gt;
int bar_chart(bar *pfirstbar, uint page_width, uint page_height, char *title);&lt;br /&gt;
 &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   bar firstbar;            /* First bar structure */&lt;br /&gt;
   bar *plastbar = NULL;    /* Pointer to last bar */&lt;br /&gt;
   char value[80];          /* Input buffer        */&lt;br /&gt;
   char title[80];          /* Chart title         */&lt;br /&gt;
 &lt;br /&gt;
   printf(&amp;quot;\nEnter the chart title: &amp;quot;);&lt;br /&gt;
   gets(title);             /* Read chart title    */&lt;br /&gt;
   for( ;; )                /* Loop for bar input  */&lt;br /&gt;
   {&lt;br /&gt;
     printf(&amp;quot;Enter the value of the bar, or use quit to end: &amp;quot;);&lt;br /&gt;
     gets(value);&lt;br /&gt;
     if(strcmp(value, &amp;quot;quit&amp;quot;) == 0)   /* quit entered?       */&lt;br /&gt;
      break;                          /* then input finished */&lt;br /&gt;
     /* Store in next bar */&lt;br /&gt;
     if(plastbar == NULL)             /* First time?         */&lt;br /&gt;
     {&lt;br /&gt;
       firstbar.pnextbar = NULL;  /* Initialize next pointer */&lt;br /&gt;
       plastbar = &amp;amp;firstbar;      /* Use the first           */&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
       /* Get memory */&lt;br /&gt;
       if((plastbar-&amp;gt;pnextbar = malloc(sizeof(bar))) == NULL)      &lt;br /&gt;
       {&lt;br /&gt;
         printf(&amp;quot;Oops! Couldn&amp;quot;t allocate memory\n&amp;quot;);&lt;br /&gt;
         return -1;&lt;br /&gt;
       }&lt;br /&gt;
       plastbar = plastbar-&amp;gt;pnextbar;    /* Old next is new bar  */&lt;br /&gt;
       plastbar-&amp;gt;pnextbar = NULL;        /* New bar next is NULL */&lt;br /&gt;
     }&lt;br /&gt;
     plastbar-&amp;gt;value = atof(value);      /* Store the value      */&lt;br /&gt;
   }&lt;br /&gt;
   /* Create bar-chart */&lt;br /&gt;
   bar_chart(&amp;amp;firstbar, PAGE_WIDTH, PAGE_HEIGHT, title);    &lt;br /&gt;
   /* We are done, so release all the memory we allocated */&lt;br /&gt;
   while(firstbar.pnextbar != NULL)&lt;br /&gt;
   {&lt;br /&gt;
     plastbar = firstbar.pnextbar;           /* Save pointer to next */&lt;br /&gt;
     firstbar.pnextbar = plastbar-&amp;gt;pnextbar; /* Get one after next   */&lt;br /&gt;
     free(plastbar);                         /* Free next memory     */&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
int bar_chart(bar *pfirstbar, uint page_width, uint page_height,&lt;br /&gt;
                                                       char *title)&lt;br /&gt;
{&lt;br /&gt;
   bar *plastbar = pfirstbar;  /* Pointer to previous bar            */&lt;br /&gt;
   double max = 0.0;           /* Maximum bar value                  */&lt;br /&gt;
   double min = 0.0;           /* Minimum bar value                  */&lt;br /&gt;
   double vert_scale = 0.0;    /* Unit step in vertical direction    */&lt;br /&gt;
   double position = 0.0;      /* Current vertical position on chart */&lt;br /&gt;
   uint bar_count = 1;         /* Number of bars - at least 1        */&lt;br /&gt;
   uint barwidth = 0;          /* Width of a bar                     */&lt;br /&gt;
   uint space = 2;             /* spaces between bars                */&lt;br /&gt;
   uint i = 0;                 /* Loop counter                       */&lt;br /&gt;
   uint bars = 0;              /* Loop counter through bars          */&lt;br /&gt;
   char *column = NULL;        /* Pointer to bar column section      */&lt;br /&gt;
   char *blank = NULL;         /* Blank string for bar+space         */&lt;br /&gt;
   int axis = FALSE;           /* Indicates axis drawn               */ &lt;br /&gt;
   /* Find maximum and minimum of all bar values */&lt;br /&gt;
   /* Set max and min to first bar value */&lt;br /&gt;
   max = min = plastbar-&amp;gt;value; &lt;br /&gt;
   while((plastbar = plastbar-&amp;gt;pnextbar) != NULL)&lt;br /&gt;
   {&lt;br /&gt;
     bar_count++;              /* Increment bar count */&lt;br /&gt;
     max = (max &amp;lt; plastbar-&amp;gt;value)? plastbar-&amp;gt;value : max;&lt;br /&gt;
     min = (min &amp;gt; plastbar-&amp;gt;value)? plastbar-&amp;gt;value : min;&lt;br /&gt;
   } &lt;br /&gt;
   vert_scale = (max - min)/page_height; /* Calculate step length */&lt;br /&gt;
 &lt;br /&gt;
   /* Check bar width */&lt;br /&gt;
   if((barwidth = page_width/bar_count - space) &amp;lt; 1)    &lt;br /&gt;
   {&lt;br /&gt;
     printf(&amp;quot;\nPage width too narrow.\n&amp;quot;);&lt;br /&gt;
     return -1;&lt;br /&gt;
   }&lt;br /&gt;
   /* Set up a string which will be used to build the columns */ &lt;br /&gt;
   /* Get the memory */&lt;br /&gt;
   if((column = malloc(barwidth + space + 1)) == NULL)          &lt;br /&gt;
   {&lt;br /&gt;
     printf(&amp;quot;\nFailed to allocate memory in barchart()&amp;quot;&lt;br /&gt;
                           &amp;quot; - terminating program.\n&amp;quot;);&lt;br /&gt;
     abort();&lt;br /&gt;
   }&lt;br /&gt;
   for(i = 0 ; i &amp;lt; space ; i++)&lt;br /&gt;
     *(column+i)=&amp;quot; &amp;quot;;         /* Blank the space between bars */&lt;br /&gt;
   for( ; i &amp;lt; space+barwidth ; i++)&lt;br /&gt;
     *(column+i)=&amp;quot;#&amp;quot;;         /* Enter the bar characters     */&lt;br /&gt;
   *(column+i) = &amp;quot;\0&amp;quot;;        /* Add string terminator        */&lt;br /&gt;
   /* Set up a string which will be used as a blank column */   &lt;br /&gt;
   /* Get the memory */&lt;br /&gt;
   if((blank = malloc(barwidth + space + 1)) == NULL)           &lt;br /&gt;
   {&lt;br /&gt;
     printf(&amp;quot;\nFailed to allocate memory in barchart()&amp;quot;&lt;br /&gt;
                           &amp;quot; - terminating program.\n&amp;quot;);&lt;br /&gt;
     abort();&lt;br /&gt;
   }&lt;br /&gt;
   for(i = 0 ; i &amp;lt; space+barwidth ; i++)&lt;br /&gt;
     *(blank+i) = &amp;quot; &amp;quot;;        /* Blank total width of bar+space */&lt;br /&gt;
   *(blank+i) = &amp;quot;\0&amp;quot;;         /* Add string terminator          */ &lt;br /&gt;
   printf(&amp;quot;^ %s\n&amp;quot;, title);   /* Output the chart title      */&lt;br /&gt;
   /* Draw the bar chart */&lt;br /&gt;
   position = max;&lt;br /&gt;
   for(i = 0 ; i &amp;lt;= page_height ; i++)&lt;br /&gt;
   {&lt;br /&gt;
     /* Check if we need to output the horizontal axis */&lt;br /&gt;
     if(position &amp;lt;= 0.0 &amp;amp;&amp;amp; !axis)&lt;br /&gt;
     {&lt;br /&gt;
       printf(&amp;quot;+&amp;quot;);           /* Start of horizontal axis    */&lt;br /&gt;
       for(bars = 0; bars &amp;lt; bar_count*(barwidth+space); bars++)&lt;br /&gt;
         printf(&amp;quot;-&amp;quot;);         /* Output horizontal axis      */&lt;br /&gt;
       printf(&amp;quot;&amp;gt;\n&amp;quot;);&lt;br /&gt;
       axis = TRUE;           /* Axis was drawn              */&lt;br /&gt;
       position -= vert_scale;/* Decrement position           */&lt;br /&gt;
       continue;&lt;br /&gt;
     }&lt;br /&gt;
     printf(&amp;quot;|&amp;quot;);             /* Output vertical axis        */&lt;br /&gt;
     plastbar = pfirstbar;    /* start with the first bar    */ &lt;br /&gt;
     /* For each bar... */&lt;br /&gt;
     for(bars = 1; bars &amp;lt;= bar_count; bars++)     &lt;br /&gt;
     {&lt;br /&gt;
       /* If position is between axis and value, output column */&lt;br /&gt;
       /* otherwise output blank                               */&lt;br /&gt;
       printf(&amp;quot;%s&amp;quot;, position &amp;lt;= plastbar-&amp;gt;value &amp;amp;&amp;amp; &lt;br /&gt;
                    plastbar-&amp;gt;value &amp;gt;= 0.0 &amp;amp;&amp;amp; position &amp;gt; 0.0 ||&lt;br /&gt;
                    position &amp;gt;= plastbar-&amp;gt;value &amp;amp;&amp;amp; &lt;br /&gt;
                    plastbar-&amp;gt;value &amp;lt;= 0.0 &amp;amp;&amp;amp; &lt;br /&gt;
                    position &amp;lt;= 0.0 ? column: blank);&lt;br /&gt;
       plastbar = plastbar-&amp;gt;pnextbar;&lt;br /&gt;
     }&lt;br /&gt;
     printf(&amp;quot;\n&amp;quot;);            /* End the line of output        */&lt;br /&gt;
     position -= vert_scale;  /* Decrement position            */&lt;br /&gt;
   } &lt;br /&gt;
   if(!axis)            /* Have we output the horizontal axis? */&lt;br /&gt;
   {                    /* No, so do it now                    */&lt;br /&gt;
     printf(&amp;quot;+&amp;quot;);&lt;br /&gt;
     for(bars = 0; bars &amp;lt; bar_count*(barwidth+space); bars++)&lt;br /&gt;
       printf(&amp;quot;-&amp;quot;);&lt;br /&gt;
     printf(&amp;quot;&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
   free(blank);               /* Free memory for blank string   */&lt;br /&gt;
   free(column);              /* Free memory for column string  */&lt;br /&gt;
   return 0; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>