字母频率vc源代码(字母出现频率c语言)[20240423更新]
admin 发布:2024-04-23 11:04 102
本篇文章给大家谈谈字母频率vc源代码,以及字母出现频率c语言对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、VC 6.0的C语言库函数的源代码可以在哪找到?
- 2、统计输入的字符串中字母的频率 (vc++)
- 3、用C语言编写一个程序,输入一个字符串,统计其中各个字符出现的次数
- 4、c语言 统计字母频率
- 5、求VC++编程源代码
VC 6.0的C语言库函数的源代码可以在哪找到?
深入printf
/***
*printf.c - print formatted
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines printf() - print formatted data
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
/***
*int printf(format, ...) - print formatted data
*
*Purpose:
* Prints formatted data on stdout using the format string to
* format data and getting as many arguments as called for
* Uses temporary buffering to improve efficiency.
* _output does the real work here
*
*Entry:
* char *format - format string to control data format/number of arguments
* followed by list of arguments, number and type controlled by
* format string
*
*Exit:
* returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/
int __cdecl printf (
const char *format,
...
)
/*
* stdout ''PRINT'', ''F''ormatted
*/
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format);
_ASSERTE(format != NULL);//断言宏。如果输出格式字符串指针为空,则在DEBUG版下断言,报告错误。
_lock_str2(1, stdout);
buffing = _stbuf(stdout);//stdout:指定输出到屏幕
retval = _output(stdout,format,arglist);
_ftbuf(buffing, stdout);
_unlock_str2(1, stdout);
return(retval);
}
以上为printf()的源代码
1、从含有可选参数函数中获得可选参数,以及操作这些参数
typedef char *va_list;
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
假定函数含有一个必选参数和多个可选参数,必选参数声明为普通数据类型,且能通过参数名来获得该变量的值。可选参数通过宏va_start、va_arg和va_end(定义在stdarg.h或varargs.h中)来进行操作,即通过设置指向第一个可选参数指针、返回当前参数、在返回参数后重新设置指针来操作所有的可选参数。
va_start:为获取可变数目参数的函数的参数提供一种便捷手段。设置arg_ptr为指向传给函数参数列表中的第一个可选参数的指针,且该参数必须是va_list类型。prev_param是在参数列表中第一个可选参数前的必选参数。
va_arg:返回由arg_ptr所指向的参数的值,且自增指向下一个参数的地址。type为当前参数的类型,用来计算该参数的长度,确定下一个参数的起始位置。它可以在函数中应用多次,直到得到函数的所有参数为止,但必须在宏va_start后面调用。
va_end:在获取所有的参数后,设置指针arg_ptr为NULL。
下面举例说明:
#include
#include
int average( int first, ... );
void main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
/* Call with 4 integers. */
printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
/* Call with just -1 terminator. */
printf( "Average is: %d\n", average( -1 ) );
}
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
返回值为:
Average is: 3
Average is: 8
Average is: 0
综上所述,在printf()函数中,可以只输出一个字符串,也可按照一定的形式输出含有多个可选参数的字符串信息。因此,首先就要通过这些宏来获取所有的可选参数。在上面的源码可以看出printf()中,只使用了宏at_start,将可选参数的首地址赋给了arglist。
2、锁定字符串及输出字符串到屏幕
#define _lock_str2(i,s) _lock_file2(i,s)
void __cdecl _lock_file2(int, void *);
#define _unlock_str2(i,s) _unlock_file2(i,s)
void __cdecl _unlock_file2(int, void *);
int __cdecl _stbuf(FILE *);
void __cdecl _ftbuf(int, FILE *);
int __cdecl _output(FILE *, const char *, va_list);
在output函数中,读取格式字符串中的每一个字符,然后对其进行处理,处理方式根据每一个字符所代表的意义来进行,如:普通字符直接利用函数WRITE_CHAR(ch, charsout);输出到控制台。
其中的主要部分是对转换说明符(d,c,s,f)的处理,现在将对其中的部分代码进行详细说明,这里只说明最基本的转换说明符,对这些须基本的转换说明符进行修饰的修饰符,程序中单独进行处理。下面是函数output()(output.c)部分源代码:
case ST_TYPE:
//表示当前处理的字符的类型为转换说明符。
...
switch (ch) {
//下面对参数的获取都是利用宏va_arg( va_list arg_ptr, type );来进行的。
case ''c'': {
//从参数表中获取单个字符,输出到缓冲字符串中,此时,type=int
buffer[0] = (char) get_int_arg(argptr); /* get char to print */
text = buffer;
textlen = 1; /* print just a single character */
}
break;
case ''s'': {
//从参数表中获取字符串,输出到缓冲字符串中,此时,type=char*
int i;
char *p; /* temps */
text = get_ptr_arg(argptr);
...
}
break;
case ''w'': {
//对宽字符进行处理
...
} /* case ''w'' */
break;
...
case ''e'':
case ''f'':
case ''g'': {
//对浮点数进行操作
...
#if !LONGDOUBLE_IS_DOUBLE
/* do the conversion */
if (flags FL_LONGDOUBLE) {
_cldcvt((LONGDOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, LONGDOUBLE);
//对长双精度型进行处理,此时,type=long double
}
else
#endif /* !LONGDOUBLE_IS_DOUBLE */
{
//对双精度型进行处理,此时,type=double
_cfltcvt((DOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, DOUBLE);
}
...
break;
//对整型变量处理
case ''d'':
case ''i'':
...
goto COMMON_INT;
case ''u'':
radix = 10;
goto COMMON_INT;
case ''p'':
...
goto COMMON_INT;
case ''o'':
...
注:对于浮点型double和long double,有相应的转换说明符(%f表示双精度型,%lf表示长双精度型),而float却没有。其中的原因是,在KRC下,float值用于表达式或用作参数前,会自动转换成double类型。而ANSI C一般不会自动把float转换成double。有些程序已假定其中的float参数会被转换成double,为了保护大量这样的程序,所有printf()函数的float参数还是被自动转换成double型。因此,在KRC或ANSI C下,都无需用特定的转换说明符来显示float型。
综上所述,转换说明符必须与待打印字符的类型。通常,用户有种选择。例如,如要打印一个int类型的值。则只可以使用%d,%x或%o。所有这些说明符都表示要打印一个int类型的值;它们只不过提供了一个数值的几种不同表示。类似一,可以用%f、%g和%e来表示double类型的值。但如果转换说明与类型不匹配,将会出现意想不到的结果。为什么呢?问题就在于C向函数传递信息的方式。
这个失败的根本细节与具体实现相关。它决定了系统中的参数以何方式传递。函数调用如下:
float n1;
double n2;
long n3;
long n4;
...
printf("%ld,%ld,%ld,%ld",n1,n2,n3,n4);
这个调用告诉计算机,要把变量n1,n2,n3和n4的值交给计算机,它把这些变量放进称作栈(stack)的内存区域中,来完成这一任务。计算机把这些值放进栈中,其根据是变量的类型而不是转换说明符,比如n1,把8个字节放入栈中(float被转换成double),类似地,为n2放了8字节,其后给n3和n4各放了4个字节。接着,控制的对象转移到printf();此函数从栈中读数,不过在这一过程中,它是在转换说明符的指导下,读取数值的。说明符%ld指定printf()应读4个字节(va_arg( va_list arg_ptr, type )中type=long),因此printf()读入栈中的4个字节,作为它的第一个值。但是这只是n1的前半部分,这个值被看成一个long整数。下一个说明符%ld读入4个字节,这正是n1的后半部分,这个值被看成第二个long整数。类似地,第三、第四次又读入n2的前后两部分。因此,尽管我们对n3和n4使用了正确的说明符,printf()仍然会产生错误。
这里也可以下载
统计输入的字符串中字母的频率 (vc++)
#includestdio.h
#define MAX 100 /*定义数组长度*/
char aa[MAX]; /*用于存放字符串*/
int a[50]; /*用于存放每个字母出现的次数*/
/*函数功能:统计给定字母的个数*/
int Tongji(char cc)
{
int i,count=0; /*计数器置0*/
char *p; /*定义数组指针*/
p=aa; /*指针P指向数组第一个元素*/
for(i=0;aa[i] !='\0' ;i++)
if(*(p+i)==cc)
count=count+1;
return count;
}
main()
{
int i,max=0,min=MAX;
printf("请输入字母:");
gets(aa); /*将输入的字母存入数组*/
for(i=0;i26;i++) /*依次统计a-z的个数*/
{
a[i]=Tongji(i+97);
printf("字母%c出现了%d次.\n",i+97,a[i]);
}
for(i=26;i52;i++) /*依次统计A-Z的个数*/
{
a[i]=Tongji(i+39);
printf("字母%c出现了%d次.\n",i+39,a[i]);
}
a[46]='\0';
for(i=0;i52;i++) /* 以下求出现最多次数的字母*/
if(a[i]max)
max=a[i];
for(i=0;i26;i++)
{
if(a[i]==max)
printf("%c出现的最多,次数有%d次。\n",i+97,a[i]);
}
for(i=26;i52;i++)
{
if(a[i]==max)
printf("%c出现的最多,次数有%d次。\n",i+39,a[i]);
}
for(i=0;i52;i++) /* 以下求出现最少次数的字母*/
if(a[i]min)
min=a[i];
for(i=0;i26;i++)
{
if(a[i]==min)
printf("%c出现的最少,次数有%d次。\n",i+97,a[i]);
}
for(i=26;i52;i++)
{
if(a[i]==min)
printf("%c出现的最少,次数有%d次。\n",i+39,a[i]);
}
}
写出来交流一下
用C语言编写一个程序,输入一个字符串,统计其中各个字符出现的次数
源程序代码如下:
#include "pch.h"
#define _CRT_SECURE_NO_WARNINGS//VS环境下需要,VC不需要
#includestdio.h
int main()
{
char c = 0;//定义输入字符变量
int num_count = 0;//数字个数
int bigalp_count = 0;//大写字母个数
int littlealp_count = 0;//小写字母个数
int emp_count = 0;//空格个数
int els_count = 0;//其他字符个数
while((c = getchar()) != '\n')//连续输入字符直到输入回车结束
{
if((c = '0')(c = '9'))//判断是否是数字
{
num_count ++ ;
}
else if ((c = 'a') (c = 'z'))//判断是否是小写字母
{
littlealp_count++;
}
else if ((c = 'A') (c = 'Z'))//判断是否是大写字母
{
bigalp_count++;
}
else if(c == ' ')//判断是否是空格
{
emp_count ++;
}
else //判断是否其他字符
{
els_count ++;
}
}
//输出个数统计值
printf("数字个数:%d\n小写字母个数:%d\n大写字母个数:%d\n",num_count, littlealp_count, bigalp_count);
printf("空格个数:%d\n其他字符个数:%d\n", emp_count, els_count);
return 0;
}
程序运行结果如下:
扩展资料:
其他实现方法:
#include stdio.h
#include ctype.h //对空白字符的判断,调用了isspace()函数,所以要调用头文件
int main()
{
char str[20]; //这块对输入有所限制了
int num_count=0;
int space_count=0;
int other_count=0;
char *p=str;
gets(str); //接收字符串
while(*p)
{
if(*p='0'*p='9')
{
num_count++;
}
else if(isspace(*p)) //用isspace函数来判断是不是空白字符
{
space_count++;
}
else
{
other_count++;
}
p++;
}
printf("num_count=%d\n",num_count);
printf("space_count=%d\n",space_count);
printf("other_count=%d\n",other_count);
return 0;
}
c语言 统计字母频率
看我旁边做的注解
cnt(s,array); /*调用子函数cnt,并传给参数s, array。s是字符数组,相当于字符串指针;array是数组好理解*/
for(i=0;i26;i++)
printf("%d",array[i]); /* for循环 依次输出26个字母出现的次数。这里%d后面加个空格或逗号分隔才好 */
printf("\n");
子函数
void cnt(char *p,int arr[]) /* 第一个参数是字符串指针,第二个参数是整型数组 */
{
int i;
for(i=0;i26;i++) /*数组初始化*/
arr[i]=0; /* 26个字母的个数全初始设置为0 */
while(*p) /* 循环,*p表示取指针p所指的字符,如果为0则表示字符串结束,退出循环 */
{
if(*p='a'*p='z') /*数组元素判断*/ /* 判断是否是a到z的字母,若是才统计*/
arr[*p-'a']++; /*p与字母a的差值刚好就是数组arr下标*/ /* 字母a对应数组的下标是0, b是1,依次类推 */
p++; /* 指针加1, 指向后面一个字符 */
}
}
这样可以么?
求VC++编程源代码
打开VC++6.0,新建基于对话框的工程RS485Comm,在主对话框窗口IDD_RS485COMM_DIALOG上添加两个按钮,ID分别为IDC_SEND和IDC_RECEIVE,标题分别为“发送”和“接收”;添加一个静态文本框IDC_DISP,用于显示串口接收到的内容。
在RS485CommDlg.cpp文件中添加全局变量:
HANDLE hCom; //全局变量,串口句柄
在RS485CommDlg.cpp文件中的OnInitDialog()函数添加如下代码: // TODO: Add extra initialization here
hCom=CreateFile("COM1",//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
}
SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,TimeOuts); //设置超时
DCB dcb;
GetCommState(hCom,dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
分别双击IDC_SEND按钮和IDC_RECEIVE按钮,添加两个按钮的响应函数: void CRS485CommDlg::OnSend()
{
// TODO: Add your control notification handler code here
// 在此需要简单介绍百特公司XMA5000的通讯协议:
//该仪表RS485通讯采用主机广播方式通讯。
//串行半双工,帧11位,1个起始位(0),8个数据位,2个停止位(1)
//如:读仪表显示的瞬时值,主机发送:DC1 AAA BB ETX
//其中:DC1是标准ASCII码的一个控制符号,码值为11H(十进制的17)
//在XMA5000的通讯协议中,DC1表示读瞬时值
//AAA是从机地址码,也就是XMA5000显示仪表的通讯地址
//BB为通道号,读瞬时值时该值为01
//ETX也是标准ASCII码的一个控制符号,码值为03H
//在XMA5000的通讯协议中,ETX表示主机结束符
char lpOutBuffer[7];
memset(lpOutBuffer,''\0'',7); //前7个字节先清零
lpOutBuffer[0]=''\x11''; //发送缓冲区的第1个字节为DC1
lpOutBuffer[1]=''0''; //第2个字节为字符0(30H)
lpOutBuffer[2]=''0''; //第3个字节为字符0(30H)
lpOutBuffer[3]=''1''; // 第4个字节为字符1(31H)
lpOutBuffer[4]=''0''; //第5个字节为字符0(30H)
lpOutBuffer[5]=''1''; //第6个字节为字符1(31H)
lpOutBuffer[6]=''\x03''; //第7个字节为字符ETX
//从该段代码可以看出,仪表的通讯地址为001
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,dwErrorFlags,ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite, dwBytesWrite,NULL);
if(!bWriteStat)
{
AfxMessageBox("写串口失败!");
}
}
void CRS485CommDlg::OnReceive()
{
// TODO: Add your control notification handler code here
char str[100];
memset(str,''\0'',100);
DWORD wCount=100;//读取的字节数
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,wCount,wCount,NULL);
if(!bReadStat)
AfxMessageBox("读串口失败!");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);
}
您可以观察返回的字符串,其中有和仪表显示值相同的部分,您可以进行相应的字符串操作取出仪表的显示值。
打开ClassWizard,为静态文本框IDC_DISP添加CString类型变量m_disp,同时添加WM_CLOSE的相应函数: void CRS485CommDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CloseHandle(hCom); //程序退出时关闭串口
CDialog::OnClose();
}
程序的相应部分已经在代码内部作了详细介绍。连接好硬件部分,编译运行程序,细心体会串口同步操作部分。
字母频率vc源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于字母出现频率c语言、字母频率vc源代码的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
- 上一篇:建网站模板,网站建站模板
- 下一篇:百度网盘分享秒进群,百度网盘分享秒进群链接贴吧
相关推荐
- 05-04html图片源代码(html代码生成图片)[20240504更新]
- 05-043d校园源代码(3D虚拟校园)[20240504更新]
- 05-03php源代码大全(php的源代码)[20240503更新]
- 05-03bbs论坛源代码论文(个人论坛源码)[20240503更新]
- 05-03黄金矿工安桌源代码(黄金矿工编程代码)[20240503更新]
- 05-03易语言键盘代码在线查询(易语言键代码怎么使用)[20240503更新]
- 05-03关于txt各种源代码大全的信息[20240503更新]
- 05-03微信二维码源代码(微信二维码源代码怎么弄)[20240503更新]
- 05-03打印机监控源代码(打印机监控源代码怎么看)[20240503更新]
- 05-03新闻发布平台源代码(新闻app源码)[20240503更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接