C++程序设计-第16周字符数组及指针上机实践项目

简介: 回到课程主页,链接:C++程序设计课程主页-2012级  本次上机对应的教学内容:第5章   数组 - 字符数组,第六章 指针 指针的基本概念第一部分 程序分析阅读下面的程序,先写出其运行结果,再上机运行进行对比。必要时,单步执行程序,在监视(watch)窗口中观察变量的动态变化,从而掌握程序的运行机理。(1)#include <iostream>using names

回到课程主页,链接:C++程序设计课程主页-2012级

  本次上机对应的教学内容:第5章   数组 - 字符数组,第六章 指针 指针的基本概念



第一部分 程序分析

阅读下面的程序,先写出其运行结果,再上机运行进行对比。必要时,单步执行程序,在监视(watch)窗口中观察变量的动态变化,从而掌握程序的运行机理。

(1)
#include <iostream>
using namespace std;
void prt(int*, int*, int*);
int a=10, b=40, c=20;
int main(void)
{ 
  prt(&a, &b, &c);
  prt(&a, &b, &c);
  return 0;
} 
void prt(int *x, int *y, int *z)
{
  cout<<++*x<<','<<++*y<<','<<*(z++)<<'\n';
}


(2)
#include <iostream>
using namespace std;
int sub(int*);
int main(void)
{
  int  i, k;
  for (i=0; i<4; i++)
  {
    k=sub(&i);
    cout<<"sum="<<k<<'\t';
  }
  cout<<"\n";
  return 0;
}
int sub(int *s)
{
  static int t=0;
  t=*s + t;
  return t;
}

(3)
#include <iostream>
using namespace std;
int sub(int*);
int main(void)
{
  int  i, k;
  for (i=0; i<4; i++)
  {
    k=sub(&i);
    cout<<"sum="<<k<<'\t';
  }
  cout<<"\n";
  return 0;
}
int sub(int *s)
{
  static int t=0;
  t=*s + t;
  return t;
}


(4)
#include <iostream>
using namespace std;
static int a[ ]={1,3,5,7,11,13};
main( )
{
  int *p;
  p=a+3;
  cout<<*p<<'\t'<<(*p++)<<endl;
  cout<<*(p-2)<<'\t'<<*(a+4)<<endl;
}


第二部分 上机任务
【项目1-小心地放开玩字符串/字符数组】
(1)读程序,请分析其实现的功能
#include<iostream>
using namespace std;
int main()
{
  char str[50];
  int i=0,n=0;
  cout<<"输入字符串:";
  gets(str);
  while(str[i]!='\0')
  {  
    if(str[i]>='0'&&str[i]<='9') n++;
    i++;
  }
  cout<<"其中的数字个数是: "<<n<<endl;
  return 0;
}
请自选下面有关字符串中字符统计的任务,完成两个即可。
  • 统计字母'A'(空格)出现的次数;
  • 统计字符串中(大/小写)字母个数;
  • 统计每一个数字字符出现的次数(提示:笨办法,设十个变量,例a0,a1,...,a9分别保存个数;显示学过数组的办法,设数组a[10],a[0]代表'0'出现的个数,当str[i]为'0'时,a[str[i]-48]++);
  • 统计每一个字母出现的个数(提示:没有必要设26个或52个变量)
(2)读程序,请分析其实现的功能
#include<iostream>
using namespace std;
int main()
{
  char str1[50]="I am a happy boy\'s daddy.",str2[50];
  int i=0,j=0;
  for(i=0;str1[i]!='\0';i++)
  {  
    if(str1[i]!=' ')
    {
      str2[j]=str1[i];
      j++;
    }
  }
  str2[j]='\0';//切记!!
  cout<<"整理后的字符串"<<str2<<endl;
  return 0;
}
请自选下面有关字符串中字符统计的任务,完成两个即可。
  • 复制字符串str1,保存到str2中;
  • 在字符串str2后面增加符号"//comment:"
  • 将str1和str2接起来存放到str3中;
  • 将str1中的空格去除,仍保存在str1中;
  • 将str1和str2接起来,仍存放在str1中;
  • 去除str1中的多余空格(即两个单词中间仅保留一个空格)。
  • 在字符串前加5个符号"note:"

【项目2-带姓名的成绩单(字符数组版)】(参考15周项目3)设score数组中存储同学们的C++成绩,增加一个数组char name[][20]并赋初值,表示同学们的姓名(注意:本周不使用更方便的string类)。这两个数组中,同学的姓名与成绩的下标保持一致(例如name[1]和score[1]表示同一位同学的姓名和C++成绩)。请(1)输出按成绩排序后的同学的名单;(2)输出按同学姓名排序后的成绩单(排序对象是字符串)。提示:比较、复制等需要用到字符串函数。


【项目3-打入“内部”寻“内幕”】下面是一段使用了指针的程序。请利用“单步”执行的方式运行程序,深刻理解“指针变量存储的是地址值”、“通过指针变量间接访问”等概念。将在执行过程中留下深刻映像的界面截屏下来(不限一个),并加以点评。——学会单步调试,这件事不能再拖了!

#include<iostream>
using namespace std;
int main()
{
	int a=2, b=3, c[5]={1,2,3,4,5};
	int *p1, *p2, *p3;
	p1=&a; 
	p2=&b; 
	p3=c;
	p3++;
	(*p3)+=10;
	cout<<a<<'\t'<<b<<'\t'<<c[1]<<endl;
	cout<<*p1<<'\t'<<*p2<<'\t'<<*p3<<endl;
	return 0;
}   
下图是我在单步运行时截屏出来的一个图,供参考:



【项目4-指来指去】设计一个程序,利用指针完成下面的工作
(1)下面的程序,输入10 100和100 10,均可以输出max=100 min=10,请补充完整
#include <iostream>
using namespace std;
int main( )
{
	int *p1,*p2,a,b,t;
	cin>>a>>b;
	p1=&a; 
	p2=&b;  
	//下面加入代码,只许用p1,p2和t,不许用a和b,t作为交换时的中间变量

	cout<<"max="<<a<<" min="<<b<<endl;
	return 0;
}

(2)下面的程序将调用函数进行变量的交换,请设计出交换的函数
#include <iostream>
using namespace std;
int main( )
{
	int *p1,*p2,a,b,t;
	cin>>a>>b;
	jiaohuan(&a,&b);  
	cout<<"交换后:a="<<a<<" b="<<b<<endl;
	return 0;
}
//下面定义jiaohuan(&a,&b);  


【项目5-填空学指针】采用指针访问方式从键盘给数组a[N]输入数据,然后对元素值重新按逆序存放并输出。请补充完整下面的程序。
#include <iostream>
using namespace std;
const int N=8;
int main()
{
	int a[N],*p,*q;
	for(p=a; p<a+N; p++)
		___(1)___;
	p=a;q=a+N-1;
	while(p<q) 
	{
		int r=*p; 
		*p=*q;
		*q=r;
		___(2)___; 
		___(3)___;
	}
	for(p=a;p<a+N; p++)
		cout<<*p<<' ';
	cout<<endl;
	return 0;
}


目录
相关文章
|
5月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
147 17
|
9月前
|
存储 算法 C++
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
二分查找的基本思想是:每次比较中间元素与目标元素的大小,如果中间元素等于目标元素,则查找成功;顺序表是线性表的一种存储方式,它用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素在物理存储位置上也相邻。第1次比较:查找范围R[0...10],比较元素R[5]:25。第1次比较:查找范围R[0...10],比较元素R[5]:25。第2次比较:查找范围R[0..4],比较元素R[2]:10。第3次比较:查找范围R[3...4],比较元素R[3]:15。,其中是顺序表中元素的个数。
300 68
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
|
9月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
337 77
|
9月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
198 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
9月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
246 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
9月前
|
算法 C++
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】 目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二叉排序树的基本算法。 相关知识 为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下: (1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。 (2)判断bt是否为一棵二叉排序树。 (3)采用递归方法查找关键字为6的结点,并输出其查找路径。 (4)分别删除bt中关键
210 11
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
|
9月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
174 19
|
9月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
213 13
|
9月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
188 12
|
9月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
168 10