C语言 程序设计 统计单词个数 源代码
统计字符个数的C语言程序

统计字符个数的C语言程序输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
[题解分析]:统计程序的典型结构:初值归零: int n=0; // n的取名最好与被统计的对象相关。
输入数据。
计数: 循环事件{ if ( 相关对象出现) n++; }输出。
//当存在多项统计时,注意输出序列不要混乱。
//注解:因为统计是针对输入的,所以输入可以放在循环事件内。
也可以先输入保存,然后再循环一次,进行统计。
#include "stdafx.h"#include <stdio.h>void main(){char c; int nEng=0, nSp=0, nDig=0, nElse=0;printf("请输入一行字符:\n");while ((c=getchar())!='\n'){if(c>='a'&&c<='z'||c>='A'&&c<='Z') nEng++;else if (c>='0'&&c<='9') nDig++;else if (c==' ') nSp++;else nElse++;}printf("字母数:%d\n空格数:%d\n数字数:%d\n其他字符数:%d\n", nEng, nSp, nDig, nElse);}//注解:while ((c=getchar())!='\n') 的意思是:先输入c=getchar(),然后判别c!='\n'。
这是输入嵌入循环的典型句法,是C语言特有的句式。
其他语言适合于分开写(虽然那样比较罗嗦)。
分开写的句法可以这样:while (1) // 1表示永远是真。
C语言程序设计例子

C语言程序设计例子题目:输入3个数abc,按大小顺序输出。
1.程序分析:利用指针方法。
2.程序源代码:/♦pointer*/#include "stdio-h11#include "conio.h”main(){iiit nl,ii2,n3;mt *pomter 1、*poiiiter2, *pomter3;pnntf(M please mput 3 numbei:nhn2,n3:H);scanfC%d%d、%cT,&iih&i2&n3);pomterl =&nl;pomter2=&n2;pomter3=&n3;if(nl>n2) swap(pomterLpointer2);if(nl>n3) swap(pomterLpointer3);if(n2>n3) swap(pomter2,pointer3);pnntf(M the sorted numbers are:%d,%d,%d\ir\nl,ii2,n3);getch();}swap(pl.p2)iiit *pl,*p2;{imp;p=*pl;*pl=*p2;*p2=p;}题目:编写input()和output()函数输入,输出5个学生的数据记录。
1.程序分析:2.程序源代码:#include "stdio-h11#include "conio.h”^define N 5stmct student{char num[6];char name[8];}stu[N];mput(stu)stmct student stu[];{intij;for(i=O;i<N;i-H-){pnntf(M\n please input %d of %d\n”,i+l,N);pnntf(M num: ”);scanf(H%s H,stu[i].num);pnntf(M name:");scanf(H%s H,stu [i].name);for(j=O;j<3j++){printf(M score %d・”j+l);scanf(,,%d,\&stu[i].score[j]);}prmtf(”\n”);}}print(stu)stmct student stu[];{intij;pnntf(M\nNo. Name Scol Sco2 Sco3\iT);fbr(i=O;i<N;i-H-){printf(M%-6s%-10s,\stu[i].num,stu[i].naine);for(j=O;j<3j++)pnntf(,,%-8d,\sni[i].scoielj]);pmitfCE);}}main(){mputQ;pnnt();getch();}题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
北邮-编译原理-词法分析

实验报告编译原理与技术ytinrete程序设计1题目:词法分析程序的设计与实现。
实验内容:设计并实现C语言的词法分析程序,要求如下。
(1)、可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。
(2)、可以识别并读取源程序中的注释。
(3)、可以统计源程序汇总的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果(4)、检查源程序中存在的错误,并可以报告错误所在的行列位置。
(5)、发现源程序中存在的错误后,进行适当的恢复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。
|实验要求:方法1:采用C/C++作为实现语言,手工编写词法分析程序。
方法2:通过编写LEX源程序,利用LEX软件工具自动生成词法分析程序。
算法思路:首先通过遍历,统计行号和字符数,并记录所有的注释。
其次,再次读取,利用一个字符数组作为buffer保存一行的数据,在对其中的数据进行处理,完成之后再读下一行,跳过注释。
对于整行数据的处理,依靠空格将其分成单个单词再具体处理。
对于查错问题实在是一个难题,只能根据一些规则判定有错并记录。
&程序源代码:==*p || 'E'==*p || 'e'==*p)//小数和指数形式{(1,*p);p++;while(isdigit(*p)){(1,*p);p++;}}{sum_word++;(temp_word);cout<<endl<<"第"<<sum_word<<"个单词:"<<" 无符号数:" <<temp_word<<endl;}}elseif('#'==*p)//预处理文件特殊处理{while('\0'!=*p){(1,*p);》p++;}//p指向换行,完成直接退出(temp_word);}elseif('"'==*p)//字符串{();p++;while('"'!=*p)<{(1,*p);p++;}p++;sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 字符串:" <<temp_word<<endl;}elseif('+'==*p)//处理符号{。
北邮-编译原理-词法分析

实验报告编译原理与技术ytinrete程序设计1题目:词法分析程序的设计与实现。
实验内容:设计并实现C语言的词法分析程序,要求如下。
(1)、可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。
(2)、可以识别并读取源程序中的注释。
(3)、可以统计源程序汇总的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果(4)、检查源程序中存在的错误,并可以报告错误所在的行列位置。
((5)、发现源程序中存在的错误后,进行适当的恢复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。
实验要求:方法1:采用C/C++作为实现语言,手工编写词法分析程序。
方法2:通过编写LEX源程序,利用LEX软件工具自动生成词法分析程序。
算法思路:首先通过遍历,统计行号和字符数,并记录所有的注释。
其次,再次读取,利用一个字符数组作为buffer保存一行的数据,在对其中的数据进行处理,完成之后再读下一行,跳过注释。
对于整行数据的处理,依靠空格将其分成单个单词再具体处理。
对于查错问题实在是一个难题,只能根据一些规则判定有错并记录。
-程序源代码:==*p || 'E'==*p || 'e'==*p)//小数和指数形式{(1,*p);p++;while(isdigit(*p)){(1,*p);—p++;}}sum_word++;(temp_word);cout<<endl<<"第"<<sum_word<<"个单词:"<<" 无符号数:" <<temp_word<<endl;}}elseif('#'==*p)//预处理文件特殊处理&while('\0'!=*p){(1,*p);p++;}//p指向换行,完成直接退出(temp_word);}else-if('"'==*p)//字符串{();p++;while('"'!=*p){(1,*p);p++;}p++;:sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 字符串:" <<temp_word<<endl;elseif('+'==*p)//处理符号{();if('='==*(p+1))//自加{temp_word = "+=";¥(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 自加号:" <<temp_word<<endl;p+=2;//推进}elseif('+'==*(p+1))//自加1{temp_word = "++";(temp_word);—sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 自加1号:" <<temp_word<<endl;p+=2;//推进}elseif(isdigit(*(p+1)))//有符号数{temp_word="+";for(int j=1; isdigit(*(p+j));j++)(1,*(p+j));,(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 有符号数:" <<temp_word<<endl;p+=2;//推进}else{temp_word = "+";(temp_word);sum_word++;,cout<<endl<<"第"<<sum_word<<"个单词:"<<" 加号:" <<temp_word<<endl;p+=2;//推进}}elseif('-'==*p)//处理符号{();if('='==*(p+1))//自减{—temp_word = "-=";(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 自减号:" <<temp_word<<endl;p+=2;//推进}elseif('-'==*(p+1))//自减1{temp_word = "--";、(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 自减1号:" <<temp_word<<endl;p+=2;//推进}elseif(isdigit(*(p+1)))//有符号数{temp_word="-";for(int j=1; isdigit(*(p+j));j++)~(1,*(p+j));(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 有符号数:" <<temp_word<<endl;p+=2;//推进}else{temp_word = "-";(temp_word);:sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 减号:" <<temp_word<<endl;p+=2;//推进}}elseif('*'==*p)//处理符号{();if('='==*(p+1))//自乘!{temp_word = "*=";(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 自乘号:" <<temp_word<<endl;p+=2;//推进}else{temp_word = "*";[(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 乘号:" <<temp_word<<endl;p+=2;//推进}}elseif('/'==*p)//处理符号{'();if('='==*(p+1))//自除{temp_word = "*=";(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 自除号:" <<temp_word<<endl;p+=2;//推进}else|if('/'==*(p+1))//行注释return;// 直接跳出elseif('*'==*(p+1))//多行注释{in_comment=true;p+=2;while('\0'!=*p)//判断这行为止注释能不能结束{if(('*'==*p)&&('/')==*(p+1)),{in_comment = false;break;}p++;}}else{temp_word = "/";—(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 除号:" <<temp_word<<endl;p+=2;//推进}}elseif('='==*p)//处理等号{();¥if('='==*(p+1))//比较{temp_word = "==";(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 比较号:"<<temp_word<<endl;p+=2;//推进}else{}temp_word = "=";(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 赋值号:" <<temp_word<<endl;p+=2;//推进}}elseif('>'==*p)){();if('='==*(p+1)){temp_word = ">=";(temp_word);sum_word++;<<temp_word<<endl;p+=2;//推进}·else{temp_word = ">";(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 大于号:" <<temp_word<<endl;p+=2;//推进}}《elseif('<'==*p){();if('='==*(p+1)){temp_word = "<=";(temp_word);sum_word++;<<temp_word<<endl;&p+=2;//推进}else{temp_word = "<";(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 小于号:" <<temp_word<<endl;p+=2;//推进}[}elseif('!'==*p){();if('='==*(p+1)){temp_word = "!=";(temp_word);;sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 不等于号:" <<temp_word<<endl;p+=2;//推进}else{temp_word = "!";(temp_word);sum_word++;cout<<endl<<"第"<<sum_word<<"个单词:"<<" 取反号:" <<temp_word<<endl;'p+=2;//推进}}elseif(':'==*p || '('==*p || ')'==*p || ';'==*p || '{' ==*p|| '}'==*p || ','==*p||'['==*p||']'==*p||'\0'==*p||'\n'==*p)//标点不算单词{if('('==*p)small_bracket++;//查错`if(')'==*p)small_bracket--;//查错if('{'==*p)big_bracket++;//查错if('}'==*p)big_bracket--;//查错p++;//推进}else//非法字符{`cout<<endl<<"error: 在第"<<current_line<<"行,出现非法字符:"<<*p<<endl;p++;}}}void analyse(void)//循环填充buffer并进行词法分析{char *p=buffer;(0);//文件指针回到头]while(!()){(*p);if('\n'==*p)//充满一句{*(p+1)='\0';*(p+2)='\0';current_line++;word_analyse();if(0!=small_bracket),{cout<<endl<<"error: 在第"<<current_line<<"行,小括号不匹配!"<<endl;small_bracket=0;}p=buffer;//重新填充}elsep++;{}if(0!=big_bracket)cout<<endl<<"error: 大括号不匹配!"<<endl;}void show_result(void)//显示统计结果{cout<<endl<<"the number of words is:"<<sum_word<<endl;cout<<endl<<"the number of char is:"<<sum_char<<endl;cout<<endl<<"the number of line is:"<<sum_line<<endl;¥cout<<"the followings are header:"<<endl;for(int i=0; i<(); i++){cout<<(i);}cout<<"the followings are comment:"<<endl;for(int i=0; i<(); i++){cout<<(i);}$}int main(void){("");if(NULL==file)》cout<<endl<<"找不到文件!"<<endl;else{//开始处理init();//初始化关键字analyse();();sum();//统计行数字节数注释show_result();//显示统计结果}int test;cin>>test;return 0;}实验结果测试:正常文件运行结果:有问题文件:运行结果:。
单词统计程序 C++

单词统计问题描述文字研究人员需要统计某篇英文小说中某些特定单词的出现次数和位置,试写出一个实现这一目标的文字统计系统。
这称为“文学研究助手”。
要求算法输入:文本文件和词集。
算法输出:单词出现的次数,出现位置所在行的行号(同一行出现两次的只输出一个行号)。
算法要点:(1)文本串非空且以文件形式存放。
(2)单词定义:用字母组成的字符序列,中间不含空格,不区分大小写。
(3)待统计的单词不跨行出现,它或者从行首开始,或者前置一个空格。
(4)数据结构采用二维链表,单词结点链接成一个链表,每个单词的行号组成一个链表,单词结点作为行号链表的头结点。
需求分析用户需求:用户可以通过该程序查询和统计一篇英文文章中某些特定单词出现次数和位置。
功能需求:用户可以输入单词来查询单词出现次数和位置;程序可以正确显示查询结果;用户可以选择是否在一次输出后继续查询;在一次查询中的结果记录到一个二维链表中。
概要设计为达到设计要求,本程序采用二维链表存储单词结点和相关的位置信息。
抽象数据类型:struct node{int col; //行坐标int row; //所在行的列坐标node* next; //指向下一个坐标结点的指针}; //单词坐标坐点类型struct Node{char words[20]; //单词数组node* ptr; //指向单词坐标结点的指针Node* next; //指向下一个单词结点的指针int num; //单词所含字符个数}; //单词结点class TLink{public:TLink() { head = NULL; }//构造函数~TLink()//析构函数{while( head != NULL ){Node* temp;temp = head;head = head -> next;delete temp;}}void Insert( char* Item );//前条件:参数Item[]为一个字符数组。
(完整版)C语言统计文件中的字符数、单词数以及总行数

C语言统计文件中的字符数、单词数以及总行数统计文件的字符数、单词数以及总行数,包括:每行的字符数和单词数文件的总字符数、总单词数以及总行数注意:空白字符(空格和tab缩进)不计入字符总数;单词以空格为分隔;不考虑一个单词在两行的情况;限制每行的字符数不能超过1000。
代码如下#include <stdio.h>#include <string.h>int *getCharNum(char *filename, int *totalNum);int main(){char filename[30];// totalNum[0]: 总行数totalNum[1]: 总字符数totalNum[2]: 总单词数int totalNum[3] = {0, 0, 0};printf("Input file name: ");scanf("%s", filename);if(getCharNum(filename, totalNum)){printf("Total: %d lines, %d words, %d chars\n", totalNum[0], totalNum[2], totalNum[1]);}else{printf("Error!\n");}return 0;}/*** 统计文件的字符数、单词数、行数** @param filename 文件名* @param totalNum 文件统计数据** @return 成功返回统计数据,否则返回NULL**/int *getCharNum(char *filename, int *totalNum){FILE *fp; // 指向文件的指针char buffer[1003]; //缓冲区,存储读取到的每行的内容int bufferLen; // 缓冲区中实际存储的内容的长度int i; // 当前读到缓冲区的第i个字符char c; // 读取到的字符int isLastBlank = 0; // 上个字符是否是空格int charNum = 0; // 当前行的字符数int wordNum = 0; // 当前行的单词数if( (fp=fopen(filename, "rb")) == NULL ){perror(filename);return NULL;}printf("line words chars\n");// 每次读取一行数据,保存到buffer,每行最多只能有1000个字符while(fgets(buffer, 1003, fp) != NULL){bufferLen = strlen(buffer);// 遍历缓冲区的内容for(i=0; i<bufferLen; i++){c = buffer[i];if( c==' ' || c=='\t'){ // 遇到空格!isLastBlank && wordNum++; // 如果上个字符不是空格,那么单词数加1isLastBlank = 1;}else if(c!='\n'&&c!='\r'){ // 忽略换行符charNum++; // 如果既不是换行符也不是空格,字符数加1isLastBlank = 0;}}!isLastBlank && wordNum++; // 如果最后一个字符不是空格,那么单词数加1isLastBlank = 1; // 每次换行重置为1// 一行结束,计算总字符数、总单词数、总行数totalNum[0]++; // 总行数totalNum[1] += charNum; // 总字符数totalNum[2] += wordNum; // 总单词数printf("%-7d%-7d%d\n", totalNum[0], wordNum, charNum);// 置零,重新统计下一行charNum = 0;wordNum = 0;}return totalNum;}在D盘下创建文件demo.txt,并输入如下的内容:运行程序,输出结果为:上面的程序,每次从文件中读取一行,放到缓冲区buffer,然后遍历缓冲区,统计当前行的字符和单词数。
c语言程序设计 谭浩强版 何钦铭颜晖版习题答案全集

c语言程序设计谭浩强版何钦铭颜晖版习题答案全集【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){int i,j,k;printf("\n");for(i=1;i<5;i++)/*以下为三重循环*/for(j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}}【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}-----------------------------------------------------------------------------【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
程序设计基础(C语言)实验报告

程序设计基础(C语言)实验报告课程名称:程序设计基础(C语言)姓名:学号:年级:专业:指导教师:实验地点:目录实验一顺序结构程序设计实验二选择结构程序设计实验三循环结构程序设计实验四数组及其应用实验五函数及其应用实验六指针及其应用实验(一)顺序结构程序设计一、实验目的1.掌握顺序结构程序的设计思想,领会顺序结构的程序执行时顺次执行的特点。
2.掌握赋值语句的特点、功能。
3.掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。
4.掌握编写程序和调试程序的方法。
二、实验内容及要求1.用下面的scanf函数输入数据使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。
#include <stdio.h>int main(){int a,b;float x,y;char c1,c2;scanf("a=%db=%d",&a,&b);scanf("%f%e",&x,&y);scanf("%c%c",&c1,&c2);printf("a=%d,b=%d,x=%.1f,y=%.2f,c1=%c,c2=%c\n",a,b,x,y,c1,c2);return 0;}运行时分别按以下方式输入数据,观察输出结果,分析原因(□表示空格,↙表示回车)。
(1)a=3,b=7,x=8.5,y=71.82,A,a↙(2)a=3□b=7□x=8.5□y=71.82□A□a↙(3)a=3□b=7□8.5□71.82□A□a↙(4)a=3□b=7□8.5□71.82Aa↙(5)3□7□8.5□71.82Aa↙(6)a=3□b=7↙8.5□71.82↙A↙a↙(7)a=3□b=7↙8.5□71.82↙Aa↙(8)a=3□b=7↙8.5□71.82Aa↙通过此题,总结输入数据的规律和容易出错的地方。