c++实训题(2)

1.通过指针访问结构体数组
定义结构体PERSON 表示一个人的基本信息,成员包含姓名(char),性别(char),年龄(int)。在主函数中定义结构体数组表示一个班级(不超过 50 人),通过指针若干人的信息,输入三个 0 时表示结束,通过指针逆序输出这些人的信息。字符串的比较可以使用字符串处理库函数。
运行结果如下:
c++实训题(2)_第1张图片
代码如下:

#include 
#include
using namespace std;
struct PERSON    //定义结构体
{
 char name[40];
 char sex[4];
 int age;
};
int main()
{PERSON a[50],*p=a;        //定义结构体数组,表示一个班级
int count=0;
cin>>p->name>>p->sex>>p->age;
while( strcmp(p->name,"0")!=0&&strcmp(p->sex,"0")!=0&&p->age!=0)//strcmp()函数,对两个字符串进行比较
{
count ++;
p++;
cin>>p->name>>p->sex>>p->age;   //p->name中p为结构体指针,p.name中p为一般结构体变量
}
p--;       //将输入的0 0 0略去
while(p>=a)
{
 cout<<p->name<<" "<<p->sex<<" "<<p->age<<endl;
 p--;      //实现倒序输出
}
}

知识补充:
当为以下函数时,必须包含头文件

#include
  1. strcat(str1,str2)实现两个字符串相加,并且相加的结果储存在str1中;
    strcat()和strncat()函数功能一样,只是strncat()会检查第一个字符串是否能容纳第二个,如果不行,会报错
  2. strcmp(str1,str2)比较两个字符串是否相等,一般返回值0,表示相等;
  3. memset(数组名,字符的ASCⅡ的值,数组的大小)

2.动态申请变量
编写动态申请三个存放整数的存储单元,输入三个整数,输出它们的和。
【注意】输入、计算、输出都不是问题,关键是存放整数的空间是用 new 申请的。

#include
using namespace std;
int main()
{
int *a=new int;            //存放整数的空间是用new申请的
int *b=new int;           
int *c=new int;  //通过new一个int型内存块,就会申请int大小这样的一个内存,如果成功,把它的值赋给int型的指针变量p,此时p值是非0的
cin >>*a >>*b >>*c;
cout <<*a+*b+*c<<endl;
delete a,b,c;           //使用delete释放空间
return 0;
}

知识补充:

  • new除了分配内存,还会给对象做一定的初始化;
  • delete[],动态分配内存实际上是向操作系统中申请的,使用完就释放掉,若不释放,易造成系统泄露

3.动态申请数组
编写程序,输入整数n,动态申请能存放n 个double 型数据的空间(动态数组),输入若干实数,以 9999表示结束,实际个数不超过最大个数 n,逆序输出数据。
【注意】关键是动态和指针,程序中不出现下标运算。注意释放空间。运行结果如下:
c++实训题(2)_第2张图片
代码如下:

#include 
using namespace std;
int main()
{
 double *p;
 double *q;
int n;
int m;
cin>>n;
p = new double[n];  //动态申请数据空间
m=0;
q=p;
cin>>*q;
while(*q!=9999)
{
 m++;
 q++;
 cin>>*q;
}
q=p+m-1;    //将输入的数组存在指针q中
cout<<*q;
q--;   //将输入的9999略去
while(q>=p)
{
 cout<<" "<<*q;
 q--;    //实现倒序输出
}
cout<<endl;
delete []p;     //释放空间
return 0;
}

你可能感兴趣的:(c++实训题(2))