热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第15周报告2:操作字符数组

任务2(字符数组和字符串):给出一个字符数组charstr[],在程序中赋初值为一个句子,例如charstr[]”hethrewthreefreethrows”,自编函数完成下

任务2(字符数组和字符串):给出一个字符数组char str[],在程序中赋初值为一个句子,例如char str[]=”he threw threefree throws”,自编函数完成下面的功能:

(1)求出字符数组中字符的个数(从第一个字符读起,直到读到’\0’结束计数)(对于例句,输出为26);

(2)计算句子中各字符出现的频数

算法提示:

(a) i=0

(b)取字符串中的第i个符号c

(c)如果在c未在i之前出现过,在i位置上是第一次出现,频数f=1,从i+1位置到字符串结束,c每出现一次,f++,最后输出c-f(即字符-频数)对;如果在c在i之前出现过,则代表c字符已经计算过频数,不再处理,直接转(d)步;

(d)i++,若处理完,转(b)步;

可以动脑想想,或者集体讨论一下还可以采用什么算法完成这一道题,可能的算法很多。



实验目的:学会操作字符数组

实验内容:完成对字符数组的操作

/* 程序头部注释开始
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:  char_array.cpp                          
* 作    者:     贺利坚                       
* 完成日期:  2011  年   12  月   4 日
* 版本 号:    v1.0        
* 对任务及求解方法的描述部分
* 输入描述:要处理的字符串在程序中通过赋初值完成
* 问题描述:求出字符数组中字符的个数及计算句子中各字符出现的频数
* 程序输出:字符数组中字符的个数和句子中各字符出现的频数
* 程序头部的注释结束
*/
#include
using namespace std;
int length(char[]);
void output_frequency(char[]);
int main(void)
{
 char str[]="he threwthree free throws";
 cout<<"要处理的字符串为:"< 
 

运行结果:(贴图)


经验积累: 算法有些麻烦,但思路也算清晰,以后要习惯于将大脑中所想的过程自然地转换为代码

//下面是这一算法的另外一种表达,很简洁,对for循环的使用很老到
void output_frequency(char str[])
{
 int i , j ,num;
 for(i=0;i <= length(str);i++)//length(str)在for之前求出来保存到一个变量中就更好了
 {
   num = 0;
 for(j=0;jj)
     break;  //在i之前发现了等待统计的字符,break了之
    else
     num++;  //这时已经过了大限,++即可
   }
  }
 
  if(num!=0)  //这儿我做些改动,只考虑不等于0即可
   cout < 
 

下面再给出两个不同思想的算法供参考。有些同学们也想到了,不过有不少存在些小问题

算法2:

// 求出各字符出现的频数的算法2
// 算法思想:将字符数组排序,相同的字符将是连续的,形如aaaabbcccccc....计数方法比算法1简单很多
// 对于数组元素count[i],其下标为整型,而字符c当整型使用时,其值恰好为c的ASCII码。
void output_frequency(char s[])
{
 int len=length(s);
 char s1[80];   //无法预知字符数组长度,设一足够“长”的
 int i,j,f;
 char c;
 for(i=0;is1[i+1])
   {
    c=s1[i];
    s1[i]=s1[i+1];
    s1[i+1]=c;
   }
 //计数形如aaaabbcccccc....的字符数组中的符号
 c=s1[0];
 f=1;   //s1[0]字符出现了1次
 for(i=1;i 
 
总结:(1)这个算法使计数过程简单了,但却需要一个较高代价的工作:排序。如果直接对s 排序,还有产生副作用的危险,不太提倡;(2)请在本解中研究一下对相同字符相邻的字符数组计数的算法。

算法3

// 求出各字符出现的频数的算法3
// 算法思想:设置一个数组count[],当读到字符c时,将c的ASCII码作下标的数组元素累加1即可。
// 对于数组元素count[i],其下标为整型,而字符c当整型使用时,其值恰好为c的ASCII码。
void output_frequency(char s[])
{
 int len=length(s);
 int count[256]={0}; //int数组初始化时,未指定的元素值为0
 int i,j,f;
 char c;
 for(i=0;i0)
  cout< 
 

总结:这是用空间换时间,通过count这个较大的数组,使计数简单地累加就行了。

算法4:

// 求出各字符出现的频数的算法4
// 这个算法由李洪悬提出,我们命名为李法
// 算法思想:当扫描中遇到正在统计的那个符号时,将其做一个标记,从而在以后扫描中不考虑这个符号
// 用'\0'作为这个标记。我们正在操作字符数组,而不是字符串,其循环由长度控制,故无碍
// 函数中要将s赋值比例本地的一个临时数组,目的是不致于改变实参数组的值
void output_frequency(char s[])
{
 int len=length(s);
 char s1[80];   //无法预知字符数组长度,设一足够“长”的
 int i,j,f;
 char c;
 for(i=0;i 
 

下面是对“he threw three free throws”统计时,正在统计字符“e”(i=1)时单步执行中的一个截屏。可以看到其中的一些字符数组元素的值(下标为0,1,4,6,10)已经为空字符。




 


推荐阅读
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
author-avatar
手机用户2502908547
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有