C++语言程序设计实验答案_数组、指针与字符串
c++数组、指针与字符串xiti答案

1.概念填空题1.1 数组定义时有3个要素:数组名、数组元素的类型和数组元素的个数。
按元素在数组中的位置进行访问,是通过下标进行的,称为直接或索引访问。
1.2 C++中的多维数组是嵌套定义的,即多维数组的基本定义是数组构成的数组,三维数组的元素是二维数组。
1.3 计算机内存是一维编址的,多维数组在内存中的存储必须转换为一维方式,C++多维数组在内存中的排列是行方式,即越低的下标变化快。
设数组a有m行n列,每个元素占内存u个字节,则a[i][j]的首地址为a[0][0]的地址+ (i*n+j)*u。
1.4数组名是整型常量,数组名赋给同类型的指针后,该指针是指向数组首元素的指针。
数组名在表达式中被转换为指向数组首元素的指针常量。
1.5每个对象都有一个指向自身的指针,称为this指针,通过使用它来确定其自身的地址。
该指针只能读,不能写。
1.6在C++中,对象访问成员所用的运算符是.,通过指针访问对象的成员所用的运算符是->。
1.7 当动态分配失败时,系统采用返回NULL来表示发生了异常。
如果new返回的指针丢失,则所分配的自由存储区空间将无法收回,称为内存泄漏。
这部分空间必须在计算机重启才能找回,这是因为无名对象的生命期为整个程序。
1.8默认复制构造函数只能完成对象成员的赋值,可能会造成重复释放,默认的析构函数可能会产生内存泄漏。
“=”运算也会产生对象重复释放。
因此我们需要自定义复制构造函数完成对象的深复制。
1.9 在用new运算符建立一个三维数组int 4*5*6,使用了3 个下标运算符,用delete运算符释放该数组时使用了 1 个下标运算符。
new返回的指针类型是int (*) [5]6]。
2 简答题2.1 用一维数组名作函数参数和用一维数组元素函数参数的含义是否相同?为什么2.2 指针变量与整型量的加减运算代表什么意义?2.3个指向普通变量的指针进行减运算是否有意义?为什么2.4什么是浅拷贝?什么是深拷贝?二者有何异同?何时必须自定义复制构造函数、析构函数,何时必须自定义=运算符中在函数, 自定义的复制构造函数、析构函数应该怎样设计?2.5从右往左解释int *(*(*pf)[5])(double *)中4个*的含义。
《C++语言程序设计》第6章 数组 指针与字符串

• 可以只对部分元素初始化
• 例如:static int a[3][4]={{1},{0,6},{0,0,11}};
• 列出全部初始值时,第1维下标个数可以省略
• 例如:static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}; • 或:static int a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
其中数组a的存储顺序为:
a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23
12
二维数组的初始化
• 将所有初值写在一个{}内,按顺序初始化
• 例如:static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
• 分行列出二维数组元素的初值
cout << "Moving the point to (" << newX << ", " << newY << ")" << endl; x = newX; y = newY; }
例6-3 对象数组应用举例
//6-3.cpp #include "Point.h" #include <iostream> using namespace std;
int main() {
cout << "Entering main..." << endl;
C语言-数组-实验题目及答案

实验六数组程序设计【实验目的】1、掌握使用一维数组编程方法2、掌握使用二维数组进行程序设计【实验内容】一、上机验证程序,并分析结果要求:读懂程序,写出分析结果;上机运行程序,得到运行结果,比较之。
1、#include <stdio.h>int main(){ int a[ ]={1,2,3,4,5} , i, j, s=0 ;j = 1;for ( i = 4 ; i>=0 ; i--){s = s+ a[i] * j ;j = j * 10 ;}printf(" s= %d \n" , s );return 0;}二、程序改错题1.下面程序的功能,是从键盘输入一个数组(数组长度为10),查找数组中正数的个数。
源代码如下,程序中存在错误,请将其改正。
#include <stdio.h>int main(){int a(10);/*定义数组*/int count,i;/* i循环变量 count 正数个数*/for(i=0;i<=10;i++){/*循环输入*/scanf("%d",a[i]);}count=1;for(i=0;i<=10;i++){/*查找正数*/if(a(i)>0)count++;}printf("数组中正数有:%d个\n",count);return 0;}三编写程序1.编写程序要求输入30个学生的单科成绩,输出高于平均分的成绩。
#include <stdio.h>#define N 30int main(){float score[N],sum=0,aver;int i;for(i=0;i<30;i++){scanf("%f",&score[i]);sum=sum+score[i];}aver=sum/30;printf("平均分为:%.2f\n",aver);for(i=0;i<N;i++)if(score[i]>aver)printf("%.2f ",score[i]);printf("\n");return 0;}2.编写程序:假设有13位评委参与评分工作。
实验5 数组、指针与字符串

实验五:数组、指针与字符串一、实验目的1.学习使用数组数据对象2.掌握指针的使用方法3. 理解深拷贝与浅拷贝的机制二、实验设备计算机,Windows操作系统,VC++6.0三、实验内容1.阅读下列程序分析其结果,理解指针与类成员函数的关系(1)lab5_1_1.cpp为点类Point-指向类的非静态成员的指针,补充完整程序,并体会输出结果#include <iostream>using namespace std;class Point //类的声明{ int X,Y,Z;public: //外部接口Point(int x=0, int y=0,int z=0) {X=x;Y=y;Z=z;} //构造函数int GetX() {return X;} //内联函数,返回Xint GetY() {return Y;} //内联函数,返回Yint GetZ() {return Z;} //内联函数,返回Z};int main() //主函数{ Point Obj(4,5,6); //声明对象ObjPoint *pObj=&Obj; //声明对象指针并初始化int ______________________ ; //声明成员函数指针并初始化,P_getx指向Getx()函数int ______________________ ; //声明成员函数指针并初始化,P_gety指向Gety()函数int ______________________ ; //声明成员函数指针并初始化,P_getz指向Getz()函数cout<<"The coordinate of X is:"<<(Obj.*p_GetX)()<<endl;//语句1:使用成员函数指针cout<<"The coordinate of Y is:"<<(pObj->GetY)()<<endl; //语句2:使用对象指针cout<<"The coordinate of Z is:"<<Obj.GetZ()<<endl; //语句3:使用对象名return 0;}(2)lab5_1_2.cpp为点类Point-指向类的静态数据成员的指针,补充完整程序,体会输出结果#include <iostream>using namespace std;class Point //类的声明{ int X,Y,Z;public: //外部接口//其它成员函数同上案例,这里略…Point(int x=0, int y=0,int z=0) {X=x;Y=y;Z=z;countP++;} //构造函数static int countP; //静态数据成员引用性说明};int Point::countP=0; //静态数据成员定义性说明int main(){ Point Obj1(4,5,6), Obj2(14,15,16); //声明对象int *count=__________________; //语句1:声明指向类的静态数据成员的指针cout<<"The number of the Objects is:"<<_________<<endl; //语句2:直接通过指针访问静态数据成员return 0;}(3)lab5_1_3.cpp为点类Point-指向类的静态函数成员的指针,补充完整程序,体会输出结果#include <iostream>using namespace std;class Point //类的声明{public: //外部接口//其它成员函数同上案例,这里略…Point(int x=0, int y=0,int z=0) {X=x;Y=y;Z=z;countP++;} //构造函数static int GetC() {return countP;} //静态函数成员private: //私有数据int X,Y,Z;static int countP; //静态数据成员引用性说明};int Point::countP=0; //静态数据成员定义性说明int main() //主函数{ ___________________________; //语句1:声明一个指向类的静态成员函数指针gc指向GetCPoint Obj(4,5,6), Obj2(14,15,16); //声明对象cout<<"The number of the Objects is:"<<gc()<<endl;//语句2:通过函数指针调用静态成员函数return 0;}2.阅读下列程序分析其结果,理解深拷贝与浅拷贝的问题(1)lab5_2_1.cpp为动态分配内存过程的深拷贝与浅拷贝的问题#include <iostream>using namespace std;int main(){ int *pi=new int(88),*qi; //声明两个整型指针变量cout<<"The address is as follows:"<<endl <<"pi="<<pi<<", qi="<<qi<<endl;//qi=new int;*qi=*pi; //语句1:浅拷贝delete pi;//delete qi; //错误:由于浅拷贝带来内存重复释放。
C 语言程序设计实验答案_数组、指针与字符串解析

实验06 数组、指针与字符串(4学时)(第6章数组、指针与字符串)一、实验目的二、实验任务6_1(习题6-25)编写并测试3×3矩阵转置函数,使用数组保存3×3矩阵。
6_2(习题6-26)使用动态内存分配生成动态数组来重新完成上题(n阶方阵),使用指针实现函数的功能。
6_3 编程实现两字符串的连接。
要求使用字符数组保存字符串,不要使用系统函数。
6_4 使用string类声明字符串对象,重新实现上一小题。
6_5(习题6-27)声明一个Employee类。
其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。
display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性,实现并测试这个类。
6_6(习题6-27)声明包含5个元素的对象数组,每个元素都是Employee 类型的对象。
6_7 修改实验4中的people(人员)类。
具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号char id[16]。
其中“出生日期”声明为一个“日期”类内嵌子对象。
用成员函数实现对人员信息的录入和显示。
要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、聚集。
在测试程序中声明people类的对象数组,录入数据并显示。
三、实验步骤1.(编程,习题6-25)编写矩阵转置函数,输入参数为3×3整型数组。
使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入输出。
程序名:lab6_1.cpp。
参考运行结果:★程序及运行结果://lab6_1.cpp#include<iostream>using namespace std;void move(int matrix[][3]){int temp;for(int i=0;i<3;i++)for(int j=0;j<i;j++){temp=matrix[i][j];matrix[i][j]=matrix[j][i];matrix[j][i]=temp;}}void main(){int i,j,mat[3][3];cout<<"输入3×3矩阵"<<endl;for(i=0;i<3;i++){cout<<"第"<<i+1<<"行:";for(j=0;j<3;j++) cin>>mat[i][j];}cout<<"\n输入的3×3矩阵为:"<<endl;for(i=0;i<3;i++){for(j=0;j<3;j++)cout<<mat[i][j]<<" ";cout<<endl;}move(mat);cout<<"转置后的矩阵为:"<<endl;for(i=0;i<3;i++){for(j=0;j<3;j++)cout<<*(*(mat+i)+j)<<" ";//指针形式cout<<endl;}}2.(编程,习题6-26)编写n×n阶矩阵转置函数,参数为整型指针。
全国计算机二级C语言程序设计讲义 数组的指针和字符串的指针

1.数组与地址
对数组的首地址加上偏移量x就可以得到其它 元素的地址。 例: &a[1] 表示数组元素a[1]的地址 等价于 a+1、 p+1 &a[x] 表示数组元素a[x]的地址 等价于 a+x、 p+x
2.数组元素的访问
下标法: 用 a[i] 的形式存取数组元素。 地址法: 用 *(a+i)的形式存取数组元素。 指针法: 用指针变量p指向数组的首地址,然后通 过移动指针存取数组元素。 如 p=a, p+i。
例:
/* 用字符数组实现字符串操作 */ main( ) { char str[]="Welcome to study C !"; int i; printf("%s\n",str); 程序运行结果为: for (i=0;i<=7;i++) Welcome to study C ! printf("%c",str[i]); Welcome printf("\n"); }
例 输入一串小写字符将其转换为大写字符
main() { int i; char a[100]; printf(“Input\n”); scanf(“%s”,a); utol( a ) ; printf( "%s\n", a ); } utol( char *x )
{ int i;
for ( i=0; *(x+i)!='\0'; i++ )
第16讲 数组的指针和字符串的指针
一、数组的指针
1.数组与地址 2.数组元素的访问
二、字符串指针
1.字符串指针的定义
2.字符指针与字符数组的区别
C++ 实验数组、指针与字符串实验报告

贵州大学实验报告学院:计算机科学与信息专业:通信工程班级:实验内容1. 编写一个函数,统计一个英文句子中字母的个数,在主程序中实现输入、输出。
2.编写函数reverse(char *s)的倒序递归程序,使字符串s倒序。
实验数据1、代码如下:#include<iostream>#include <string>using namespace std ;int main(){string Str;char ch ;int i=0,j=0;cout << "input str:" <<endl;getline(cin , Str );for ( i=0;i<Str.length();i++ ){if ( Str[i] >='a' && Str[i]<='z' || Str[i] >='A' && Str[i]<='Z' ) j++;}cout << "str="<<Str<<endl ;cout << "The number is:" << j <<endl ;system("pause");return 0;}运行结果:2、代码和运行结果:实验总结1、这次试验让我了解了在C++程序中的输入输出和字符串的统计。
2、掌握了一点点递归的方法。
3、通过这次试验觉得自己还是有很多不足,对基础知识掌握不牢。
指导教师意见签名:年月日注:各学院可根据教学需要对以上栏木进行增减。
表格内容可根据内容扩充。
C第六章数组、指针与字符串

/********** 程序运行结果 ********** x = 11.1
例:用数组来处理求 Fibonacci 数列, 输出前20项。
//用数组来处理求Fibonacci数列,输出前20项。
#include <iostream.h>
void main()
{
int i ;
static int f[20] = { 1 , 1} ; //初始化第0、1个数
// 逆序显示一个数组的内容 #include <iostream.h> void main() {
const int SIZE=5; double a[SIZE]; int i;
cout << "Enter " << SIZE << " numbers: "; for (i = 0; I < SIZE; I ++)
#if ! defined(_LOCATION_H) #include "Location.h"
#define _LOCATION_H class Location {
public: Location( ); Location(int xx,int yy);
Location::Location() { X = Y = 0;
int Table[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}}; for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) cout << Table[i][j] << " ";
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验06 数组、指针与字符串(4学时)(第6章数组、指针与字符串)一、实验目的二、实验任务6_1(习题6-25)编写并测试3×3矩阵转置函数,使用数组保存3×3矩阵。
6_2(习题6-26)使用动态内存分配生成动态数组来重新完成上题(n阶方阵),使用指针实现函数的功能。
6_3 编程实现两字符串的连接。
要求使用字符数组保存字符串,不要使用系统函数。
6_4 使用string类声明字符串对象,重新实现上一小题。
6_5(习题6-27)声明一个Employee类。
其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。
display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性,实现并测试这个类。
6_6(习题6-27)声明包含5个元素的对象数组,每个元素都是Employee 类型的对象。
6_7 修改实验4中的people(人员)类。
具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号char id[16]。
其中“出生日期”声明为一个“日期”类内嵌子对象。
用成员函数实现对人员信息的录入和显示。
要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、聚集。
在测试程序中声明people类的对象数组,录入数据并显示。
三、实验步骤1.(编程,习题6-25)编写矩阵转置函数,输入参数为3×3整型数组。
使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入输出。
程序名:lab6_1.cpp。
参考运行结果:★程序及运行结果://lab6_1.cpp#include<iostream>using namespace std;void move(int matrix[][3]){int temp;for(int i=0;i<3;i++)for(int j=0;j<i;j++){temp=matrix[i][j];matrix[i][j]=matrix[j][i];matrix[j][i]=temp;}}void main(){int i,j,mat[3][3];cout<<"输入3×3矩阵"<<endl;for(i=0;i<3;i++){cout<<"第"<<i+1<<"行:";for(j=0;j<3;j++) cin>>mat[i][j];}cout<<"\n输入的3×3矩阵为:"<<endl;for(i=0;i<3;i++){for(j=0;j<3;j++)cout<<mat[i][j]<<" ";cout<<endl;}move(mat);cout<<"转置后的矩阵为:"<<endl;for(i=0;i<3;i++){for(j=0;j<3;j++)cout<<*(*(mat+i)+j)<<" ";//指针形式cout<<endl;}}2.(编程,习题6-26)编写n×n阶矩阵转置函数,参数为整型指针。
使用指针对数组元素进行操作,在main()函数中使用new操作符分配内存生成动态数组。
通过调试功能观察指针的内容及其所指的对象中的内容。
程序名:lab6_2.cpp。
注:可使用一维动态数组,或二维动态数组。
★程序及运行结果:(1) 使用一维动态数组表示方阵。
//lab6_2.cpp#include<iostream>#include<iomanip>using namespace std;void move(int *matrix,int n){//矩阵为整型指针,对应一维数组int temp;for(int i=0;i<n;i++)for(int j=0;j<i;j++){temp=matrix[i*n+j];matrix[i*n+j]=matrix[j*n+i];matrix[j*n+i]=temp;}}void main(){int i,j,n,*mat;cout<<"输入方阵的阶数:";cin>>n;mat=new int[n*n];cout<<"输入"<<n<<"×"<<n<<"矩阵"<<endl;for(i=0;i<n;i++){cout<<"第"<<i+1<<"行:";for(j=0;j<n;j++) cin>>mat[i*n+j];//数组形式}cout<<"\n输入的矩阵为:"<<endl;for(i=0;i<n;i++){for(j=0;j<n;j++)cout<<setw(4)<<mat[i*n+j];cout<<endl;}move(mat,n);cout<<"转置后的矩阵为:"<<endl;for(i=0;i<n;i++){for(j=0;j<n;j++)cout<<setw(4)<<*(mat+i*n+j);//指针形式cout<<endl;}delete []mat;}(2) 使用二维动态数组表示方阵。
(参考实验提示)3.(编程)实现两字符串的连接。
声明字符数组保存字符串,在程序中提示用户输入两个字符串,实现两个字符串的连接,最后用cout语句显示输出。
程序名:lab6_3.cpp。
用cin实现输入,注意,字符串的结束标志是ASCII码0,使用循环语句进行字符串间的字符拷贝。
// 字符串的结束标志'\0'参考运行结果:★程序及运行结果://lab6_3.cpp#include<iostream>using namespace std;void strLL(char *a,char *b,char *c);void main(){int i;char a[10],b[10],c[20];cout<<"输入一个字符串a:"; cin>>a;cout<<"显示内存中的字符串a:";for(i=0;i<10;i++){if(a[i]) cout<<a[i]; //a[i]不为0else{cout<<"\'\\0\'";//转义break;}}cout<<endl;cout<<"\n输入另一个字符串b:"; cin>>b;cout<<"显示内存中的字符串b:";cout<<b<<"\'\\0\'"<<endl;strLL(a,b,c);cout<<"\n显示内存中的连接字符串c:";for(i=0;i<20;i++){if(c[i]) cout<<c[i];else{ cout<<"\'\\0\'"; break; }}cout<<endl;}void strLL(char *a,char *b,char *c){int i,j;for(i=0;a[i];i++) c[i]=a[i];//循环直到a[i]为0for(j=0;b[j];i++,j++) c[i]=b[j];c[i]=0;}4.(编程)使用string类声明字符串对象,实现两字符串的连接。
在string类中已重载了运算符“+=”实现字符串的连接,可以使用这个功能。
程序名:lab6_4.cpp。
★程序及运行结果://lab6_4.cpp#include<string>//使用C++中的string#include<iostream>using namespace std;void main(){string s1,s2;cout<<"输入字符串s1:";cin>>s1;cout<<"输入字符串s2:";cin>>s2;s1+=s2;cout<<"s1+s2 = "<<s1<<endl;}5.(编程,习题6-27)声明Employee类并应用。
在employee.h文件中声明Employee类。
Employee类具有姓名、街道地址、城市和邮编等私有数据成员,都可以用字符数组来表示。
成员函数:构造函数用来初始化所有成员数组,对字符数组的赋值可以使用字符串拷贝函数strcpy(char *, char *name);display() 使用cout显示姓名、街道地址、城市和邮编等属性;change_name() 改变类中表示姓名属性的字符数组类型的数据成员。
在主程序中声明这个类的对象并对其进行操作。
程序名:lab6_5.cpp。
参考运行结果:★程序及运行结果://lab6_5employee.h#include<cstring>//使用C中的string#include<iostream>using namespace std;class Employee{private:char name[10],street[20],city[10],mail[7];//姓名、街道、城市、邮编public:Employee(char *n,char *s,char *c,char *m);void display();void change_name(char *n);};Employee::Employee(char *n,char *s,char *c,char *m){strcpy(name,n); strcpy(street,s);strcpy(city,c); strcpy(mail,m);}void Employee::display(){cout<<"姓名:"<<name<<endl;cout<<"街道:"<<street<<endl;cout<<"城市:"<<city<<endl;cout<<"邮编:"<<mail<<endl;}void Employee::change_name(char *n){ strcpy(name,n); }//lab6_5.cpp#include"lab6_5employee.h"void main(){Employee emp("张山","海甸三西路13号","海口市","570228");emp.display();emp.change_name("李世");cout<<endl;emp.display();}6.(编程,习题6-27)使用上一小题中的Employee类声明对象数组emp[5]。