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;
}


目录
相关文章
|
2月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
58 5
|
3月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
125 1
|
4月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
314 4
|
5月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
1月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
13天前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
39 16
|
6天前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
6天前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。
|
17天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
61 6
|
1月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)