使用C进行用户输入统计,会遇到字符长度计算,整数数组有效长度选取的问题。
当时确实想了很久有效长度的问题,实在是找不到好办法,只能使用一个全局随机变量作为数组最后一个元素,作为终止元素。
这样会有几率让用户输入对这个随机数,导致程序错误,不过感觉这几率太低。
这个程序是统计多行输入的字符串长度,并将统计结果以升序方式列出,以水平树状图的形式显示出来。
#include<stdio.h>
#include<stdlib.h>
#define MAX 500
#define SINGLE 100
int randomize();
int STOP=rand(); //定义一个由随机数产生的全局变量
void OutPtstar(int [],int []);
void outit(int []);
void *popo(int []);
void info();
int main()
{
<span style="white-space:pre"> </span>int i=0,n=0,m=0,j=0,x=0;
<span style="white-space:pre"> </span>int UserPut[MAX];
<span style="white-space:pre"> </span>int inP[SINGLE];
<span style="white-space:pre"> </span>int rate[MAX];
<span style="white-space:pre"> </span>int frequency[MAX];
<span style="white-space:pre"> </span>info();
<span style="white-space:pre"> </span>while((UserPut[i]=getchar())!=EOF)
<span style="white-space:pre"> </span>i++;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>UserPut[i]='\0';<span style="white-space:pre"> </span>// 让用户输入任意字符 使用EOF终止
<span style="white-space:pre"> </span>//puts(UserPut);
<span style="white-space:pre"> </span>for(j=0;UserPut[j]!='\0';j++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if(UserPut[j]=='\n'||UserPut[j]=='!')
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>n=j-n;<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>inP[m]=n;
<span style="white-space:pre"> </span>n=j+1;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>m++;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>inP[m]=STOP;<span style="white-space:pre"> </span>//对输入结果进行初步统计,以回车为判断条件,初步了解用户输入的字符长度,每次存储在
<span style="white-space:pre"> </span>//数组inP中,以输入先后作为排序存储。
<span style="white-space:pre"> </span>//使用STOP值作为数组末尾标记。方便读取其有效值。
<span style="white-space:pre"> </span>popo(inP);<span style="white-space:pre"> </span>//使用起泡排序对inP进行由小到大的排列。
<span style="white-space:pre"> </span>//for(i=0;i<m;i++)
<span style="white-space:pre"> </span>//printf("inP:%d\n",inP[i]);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>n=0;j=1;
<span style="white-space:pre"> </span>for(i=0;i<m;i++)<span style="white-space:pre"> </span>//比较inP中重复的数字和重复次数
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>j=1;
<span style="white-space:pre"> </span>if(inP[i]==inP[i+1])
<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>for(x=i;inP[x]==inP[x+1];x++)
<span style="white-space:pre"> </span>j++;
<span style="white-space:pre"> </span>//printf("\nj:%d n:%d x:%d",j,n,x);
<span style="white-space:pre"> </span>rate[n]=j;
<span style="white-space:pre"> </span>frequency[n]=inP[x];
<span style="white-space:pre"> </span>//printf("\ninP: %d",inP[x]);
<span style="white-space:pre"> </span>n++;
<span style="white-space:pre"> </span>i=x; //使用i=x跳过重复数字 避免重复比较
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>else if(inP[i]==STOP)
<span style="white-space:pre"> </span>break;<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>else if(inP[x]!=inP[x+1])
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>j=1;
<span style="white-space:pre"> </span>x=1;
<span style="white-space:pre"> </span>frequency[n]=inP[i];
<span style="white-space:pre"> </span>rate[n]=j;
<span style="white-space:pre"> </span>n++;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>frequency[n]=STOP;
<span style="white-space:pre"> </span>rate[n]=STOP;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>//outit(frequency);
<span style="white-space:pre"> </span>//outit(rate);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>OutPtstar(frequency,rate);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>return 0;
}
void OutPtstar(int x[],int m[])
{
<span style="white-space:pre"> </span>int i,j;
<span style="white-space:pre"> </span>char star='*';
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>printf("length Number Graphic\n");
<span style="white-space:pre"> </span>printf("============================\n");
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>for(i=0;x[i]!=STOP;i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>printf("%-11d %-8d",x[i],m[i]);
<span style="white-space:pre"> </span>for(j=0;j<m[i];j++)
<span style="white-space:pre"> </span>printf("%c",star);<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>printf("\n");
<span style="white-space:pre"> </span>}
}
void *popo(int vals[])
{<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>int i,j,t,A;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>int m;
<span style="white-space:pre"> </span>for(m=0;vals[m]!=STOP;m++);
<span style="white-space:pre"> </span>A=m;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>for(i=0;i<A;i++)
<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>for(j=0;j<A;j++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if(vals[j]>vals[j+1])
<span style="white-space:pre"> </span>{ t=vals[j];
<span style="white-space:pre"> </span> vals[j]=vals[j+1];
<span style="white-space:pre"> </span> vals[j+1]=t;}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
return vals;
}
void outit(int x[])
{
<span style="white-space:pre"> </span>int i;
<span style="white-space:pre"> </span>printf("\n");
<span style="white-space:pre"> </span>for(i=0;x[i]!=STOP;i++)
<span style="white-space:pre"> </span>printf("%d",x[i]);
<span style="white-space:pre"> </span>printf("\n");
}
void info()
{
<span style="white-space:pre"> </span>printf("\nThis program allow you to input everychar you want.Use Enter to end once input.\n");
<span style="white-space:pre"> </span>printf("Press Ctrl+Z to end your input.\n");
<span style="white-space:pre"> </span>printf("Then the program will give you the counts of everytime you have input.\n");
<span style="white-space:pre"> </span>printf("And it will be printed to a histogram to you.\nNow start to input :\n");
}