实验三 数组与指针实验
利用指针排序实验报告(3篇)

第1篇一、实验目的1. 理解指针在排序算法中的应用。
2. 掌握几种常见的排序算法(如冒泡排序、选择排序、插入排序等)的指针实现方式。
3. 比较不同排序算法的效率,分析其优缺点。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容本次实验主要实现了以下排序算法:1. 冒泡排序2. 选择排序3. 插入排序以下是对每种排序算法的具体实现和性能分析。
1. 冒泡排序(1)算法原理冒泡排序是一种简单的排序算法。
它重复地遍历待排序的序列,比较每对相邻的元素,如果它们的顺序错误就把它们交换过来。
遍历序列的工作是重复地进行,直到没有再需要交换的元素为止。
(2)指针实现```cppvoid bubbleSort(int arr, int len) {for (int i = 0; i < len - 1; i++) {for (int j = 0; j < len - 1 - i; j++) {if ((arr + j) > (arr + j + 1)) {int temp = (arr + j);(arr + j) = (arr + j + 1);(arr + j + 1) = temp;}}}}```(3)性能分析冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。
当待排序序列基本有序时,冒泡排序的性能较好。
2. 选择排序(1)算法原理选择排序是一种简单直观的排序算法。
它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
(2)指针实现```cppvoid selectionSort(int arr, int len) {for (int i = 0; i < len - 1; i++) {int minIndex = i;for (int j = i + 1; j < len; j++) {if ((arr + j) < (arr + minIndex)) {minIndex = j;}}int temp = (arr + i);(arr + i) = (arr + minIndex);(arr + minIndex) = temp;}}```(3)性能分析选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。
C语言教材第七章指针实验

C语⾔教材第七章指针实验第七章指针第⼀部分知识训练【知识要点】1. 地址与指针指针变量的概念:⽤⼀个变量专门来存放另⼀个变量的地址。
2. 指向变量的指针变量指针变量的形式:基类型 *指针变量名;&: 取地址运算符;*:指针运算符。
3. 指针与数组引⽤⼀个数组元素可以⽤下标法和指针法;可以⽤数组名作函数的参数。
4.指针与函数函数指针变量定义的⼀般形式为:类型说明符 (*指针变量名)();⼀个函数的返回值可以是⼀个函数。
【典型习题与解析】5. char * const p;char const * pconst char *p上述三个有什么区别?【解析】char * const p; //常量指针,p的值不可以修改;char const * p;//指向常量的指针,指向的常量值不可以改;const char *p; //和char const *p。
6. main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}输出结果是什么?【解析】答案:输出:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执⾏结果是2,5。
&a+1不是⾸地址+1,系统会认为加⼀个a数组的偏移,是偏移了⼀个数组的⼤⼩(本例是5个int)。
1)&a是数组指针,其类型为 int (*)[5];⽽指针加1要根据指针类型加上⼀定的值,不同类型的指针+1之后增加的⼤⼩不同。
2)a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5],但是prt与(&a+1)类型是不⼀样的(这点很重要),所以prt-1只会减去sizeof(int*) a,&a的地址是⼀样的,但意思不⼀样。
3)a是数组⾸地址,也就是a[0]的地址,&a是对象(数组)⾸地址,a+1是数组下⼀元素的地址,即a[1],&a+1是下⼀个对象的地址,即a[5]。
C语言实验报告——指针

C语言实验报告——指针实验目的:1.掌握指针的基本概念与用法;2.熟悉指针的运算规则;3.理解指针与数组之间的关系。
实验设备:1.计算机;2.编程环境:C语言编译器。
实验内容:1.指针的声明与初始化;2.指针的运算;3.指针与数组。
实验原理:指针是C语言中非常重要的概念,它可以用来存储变量的地址。
通过指针,我们可以直接访问存储在内存中的变量,从而实现对变量的灵活操作。
指针的声明与初始化:在C语言中,指针的声明可以通过在变量名前添加一个"*"来实现。
指针的初始化可以通过给指针赋予一些变量的地址来实现。
指针的运算:指针可以进行递增和递减运算。
递增指针使其指向下一个位置,递减指针使其指向上一个位置。
这样可以方便地遍历数组或者对数组进行操作。
指针与数组:指针与数组有着密切的关系。
在C语言中,数组实际上是由连续的存储单元组成的。
指针可以通过指向数组的首元素来访问数组中的各个元素。
通过指针可以方便地对数组进行操作,例如遍历数组、修改数组元素等等。
实验步骤:1.声明一个整型变量并初始化;2.声明一个指向该整型变量的指针,并将其初始化为该整型变量的地址;3.输出指针所指向的变量的值;4.改变指针所指向变量的值,并输出;5.声明一个数组,并初始化;6.输出数组的每个元素;7.使用指针对数组进行递增和递减运算,并输出运算结果。
实验结果与分析:1.初始变量的值为10;2.指针所指向的变量的值为10;3.改变指针所指向变量的值为20;4.数组元素分别为1、2、3、4、5;5.指针的递增运算结果为2、3、4、5;6.指针的递减运算结果为4、3、2、1实验结论:通过本次实验,我掌握了指针的基本概念与用法。
指针可以用来存储变量的地址,通过指针可以访问变量的值。
指针还可以用来操作数组,方便地遍历数组、修改数组元素等。
指针的递增和递减运算可以方便地遍历数组。
在实际编程中,熟练掌握指针的使用将会事半功倍。
c语言数组与指针实验心得

c语言数组与指针实验心得
C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了通过考试会对指针和数组的一些考点进行突击,但是很多极其细节的东西也许并不是那么清楚。
本篇侧重点在于分析数组与指针的关系,什么时候数组可以等同于指针,什么时候二者不同。
我们常常把指针和数组混淆,比如以下这种情况,定义为指针,却使用了数组的方式来取值。
char*p="pointertest";
c=p[i];
定义为指针,但是使用数组的方式来取值。
我们可以结合以上两种方式,来分析这种情况下的取值过程:
1.先根据符号p的地址,取到符号p的值,是一个地址,我们假设为4040,也就是和上面第二种情况的指针访问一样。
2.接下来就是4040+i,得到新的地址值
3.取新的地址的内容
同理,取偏移地址的时候,需要注意变量类型,比如int类型,就是加上i*4
以下对于二者可相互替换做一个总结
(1)externchara[];通过extern声明的数组,不能用指针形式替换
(2)数组定义为chara[5],不能用指针的形式替换
(3)数组作为函数参数,可以使用指针形式替换
(4)在表达式中,比如c=a[i],这种情况也可以使用指针形式来替换,因为在表达式中,数组名a被当做指向该数组第一个元素的指针,所以可以和指针相互替换。
而且数组下标i可以和指针的偏移量等同起来,a[i]等同于*(a+i)。
C语言指针实验报告-c语言指针心得

2
将一个任意整数插入到已排序的整形数组中,插入后,数组中的数仍然保持有序 要求:
(1) 整形数组直接由赋值的方式初始化,要插入的整数有seanf()函数数入;
(2)算法实现过程采用指针进行处理;
(3) 输入原始数据以及插入整数后的数据,并加以说明;
c语言程序设计实验报告实验名称指针机械工程与自动化专业班级机械1003任课教师实验时间实验内容将一个任意整数插入到已排序的整形数组中插入后数组中的数仍然保持有序要求
C
实验名称
指针
学院
机械工程与自动化
专业班级
机械1003
姓名
学号
任课教师
实验时间
1
(1)掌握指针的概念,会定义与使用指针变量;
(2) 能正确使用变量的指针与指向变量的指针变量;
C语言实验报告 实验三 参考答案

实验十 参考答案(指针)三、实验内容( 按要求完善或设计以下程序,并调试分析运行结果)1. 程序填空题 给定程序BLACK10-1.C 中,函数fun 的功能是:将形参n 所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n 传回所指变量。
例如,输入一个数:27638496,新的数:为739。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
【解题思路】第一处:t 是通过取模的方式来得到*n 的个位数字,所以应填:10。
第二处:判断是否是奇数,所以应填:0。
第三处:最后通形参n 来返回新数x ,所以应填:x 。
2. 程序改错题 给定程序MODI10-1.C 中函数fun 的功能是: 计算n 的5次方的值(规定n 的值大于2、小于8),通过形参指针传回主函数;并计算该值的个位、十位、百位上数字之和作为函数值返回。
例如,7的5次方是16807, 其低3位数的和值是15。
【解题思路】第一处:变量d 的初始值应为1。
第二处:整除的符号是 /。
3. 程序设计题 请编写函数fun ,它的功能是:求出能整除形参x 且不是偶数的各整数,并按从小到大的顺序放在pp 所指的数组中,这些除数的个数通过形参n 返回。
例如,若 x 中的值为: 35,则有 4 个数符合要求,它们是: 1, 5, 7, 35。
【解题思路】本题是求出能整除形参x 且不是偶数的各整数,并按从小到大的顺序放在pp 所指的数组中,这些除数的个数通过形参n 返回。
【参考答案】void fun ( int x, int pp[], int *n ){ int i; *n=0;for(i=1; i <= x; i++)if((x % i== 0) && (i % 2)) pp[(*n)++]=i;}4. 程序填空题 给定程序中,函数fun 的功能是:找出N ×N 矩阵中每列元素中的最大值,并按顺序依次存放于形参b 所指的一维数组中。
vs2008程序编写实验报告--数组、指针与函数

《测绘程序设计()》上机实验报告(Visual C++.Net)实验3 数组、指针与函数班级:学号:姓名:序号:二零一零年三月实验3 数组、指针与函数一、实验目的∙掌握数组的定义、引用及应用方法。
∙掌握指针与动态数组。
∙掌握函数的定义、引用及应用方法。
二、实验内容1.求任意多边形面积多边形面积计算原理及算法计算原理:例如上图:))((21))((21))((21))((214114344323321221y y x x y y x x y y x x y y x x P -++-++-++-+=面积计算的算法:经整理后得:)11,,2,1())((21111=+==-+=∑=++i n i n i Y Y X X P ni i i i i 时,;当设计思路:因为计算多边形面积的数据随多边形顶点数的增加而增加,因此要编写一个分割字符串的函数,使输入的数据第一行表示多边形类型,接下来的每一行依次表示一个顶点的坐标,X 与Y 之间用逗号隔开。
创建一个二维数组,行数即顶点个数,列数为2,用来保存各顶点的坐标。
调用Split 函数分离,获取各顶点坐标数据 界面设计:由1个静态框、2个文本框和2个命令按钮组成。
具体见运行结果的输出界面主要代码:ComAreaDlg.cppvoid CComAreaDlg::OnBnClickedCancel(){// TODO: 在此添加控件通知处理程序代码OnCancel();}CString * CComAreaDlg::SplitString(CString str, char split, int& iSubStrs){int iPos = 0; //分割符位置int iNums = 0; //分割符的总数CString strTemp = str;CString strRight;//先计算子字符串的数量while (iPos != -1){iPos = strTemp.Find(split);if (iPos == -1){break;}strRight = strTemp.Mid(iPos + 1, str.GetLength());strTemp = strRight;iNums++;}if (iNums == 0) //没有找到分割符{//子字符串数就是字符串本身iSubStrs = 1;return NULL;}//子字符串数组iSubStrs = iNums + 1; //子串的数量= 分割符数量+ 1CString* pStrSplit;pStrSplit = new CString[iSubStrs];strTemp = str;CString strLeft;for (int i = 0; i < iNums; i++){iPos = strTemp.Find(split);//左子串strLeft = strTemp.Left(iPos);//右子串strRight = strTemp.Mid(iPos + 1, strTemp.GetLength()); strTemp = strRight;pStrSplit[i] = strLeft;}pStrSplit[iNums] = strTemp;return pStrSplit;}void CComAreaDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);int iLine;//分行并存入字符串数组CString *pstrLine=SplitString(strCoordData,13,iLine);if(iLine<4){MessageBox(_T("输入的数据不完整!"));return;}int iApexCount=iLine-1;//多边形顶点个数short npolygonType;//多边形类型,double (*cApex)[2];cApex=new double[iApexCount][2];//顶点坐标值CString *strTmp=NULL;int n;npolygonType = _ttoi(pstrLine[0]); //第一行为多边形类型//逐行用Split函数分离,获取各顶点坐标数据for(int i=0;i<iApexCount;i++){strTmp = SplitString(pstrLine[i+1], ',',n);//分割第三行cApex[i][0] = _tstof(strTmp[0]);cApex[i][1] = _tstof(strTmp[1]);if(strTmp!=NULL)//释放内存{delete[] strTmp;strTmp=NULL;}}if(strTmp!=NULL)//释放内存{delete[] strTmp;strTmp=NULL;}double Area=0.0;//多边形面积for(int i=0;i<iApexCount;i++){if(i==iApexCount-1){//i+1=0;Area = Area+(0.5)*(cApex[0][0]+cApex[i][0])*(cApex[0][1]-cApex[i][1]);}elseArea = Area+(0.5)*(cApex[i+1][0]+cApex[i][0])*(cApex[i+1][1]-cApex[i][1]); //计算面积}//输出结果strResult.Format(_T("%s%.1fmm\r\n"),_T("面积S=:"),Area);//_T("序号 "),_T("调整后H (m) "));UpdateData(FALSE);//释放内存if(cApex!=NULL){delete [] cApex; cApex=NULL;}}运行结果:2.由三角形三个边长求内角函数计算公式: bc ac b A 2cos 222-+=ac bc a B 2cos 222-+=abcb a C 2cos 222-+=设计思路:已知三角形三个边长求三角形三个内角算法简单,需要的数据也少,顺序结构即可实现。
C语言实验报告-数组与指针

pArr=(int **)malloc((m+2)*sizeof(int *));
for(i=0;i<=m+2;i++)
pArr[i]=(int *)malloc((n+2)*sizeof(int *));
for(i=0;i<=n+2;i++)
3.掌握理解数组与指针的概念及两者之间的联系;
4.掌握指向数组元素指针的使用;
5.掌握用指向数组指针变量表示数组的数组元素及其操作方法;
6.掌握用指针形式参数在函数间传递数组实际参数的方法。
7.熟悉并掌握动态数组的创建方式及元素访问方法。
二、实验项目内容(实验题目)
模拟“地雷游戏”。在M*N的方格中,随机布上dn个“地雷”,按M行N列输出各格子的数(有雷为9(或‘*’),无雷为0)。在有相邻地雷的格子内进一步标出相邻地雷数。要求:
{
for(j=0;j<=n+2;j++)
pArr[i][j]=0;
}
printf("随机雷区:\n");
mine(pArr,m,n,dn);
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
printf("%5d",pArr[i][j]);
}
printf("\n");
}
printf(ቤተ መጻሕፍቲ ባይዱ\n地雷分布及数目\n");
mine_dis(pArr,m,n);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void student::setdata(long a,char *s,int t)
{
name=new char[strlen(s)+1];
no=a;
strcpy(name,s);
score=t;
num++;
sum+=t;
}
float student::avg()
{
float avg=0;
avg=sum/num;
}
void Account::getName(char *name)
{}
void Account::setmSN(long msn)
{
mSN=msn;
}
long Account::getmSN()
{
return(mSN);
}
int main()
{
char a[20];
long b;
int N=0;
Account *s;
cout<<"obs["<<i<<"].getx():"<<obs[i].getx()<<"\n";//访问数组元素的成员
return(0);
}
(2)#include<iostream.h>
class NumClass
{
int num;
public:
void set_num(int val){num=val;}
p++; p->show_num();
return(0);
}
(4)#include<iostream.h>
class NumClass
{
int num;
public:
void set_num(int val){num=val;}
void show_num(){cout<<"The num is :"<<num<<"\n";}
return(0);
}
2.编写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。设计一个学生类,包括学号、姓名和成绩数据成员外,还有两个静态变量sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和disp(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分。在main()函数中定义了一个对象数组用于存储输入的学生数据。
class ArrayElem
{
int x;
public:
ArrayElem(int i){x=i;} //带参数的构造函数
int getx(){return x;}
};
int main()
{
ArrayElem obs[4] ={-1,-2,-3,-4}; //创建对象数组并初始化
for(int i=0;i<4;i++)
}
void Account::deposit(float amount)
{
mBalance+=amount;
}
void Account::withdraw(float amount)
{
mBalance-=amount;
}
float Account::getBalance()
{
return(mBalance);
students[i].setdata(tempno,temps,tempscore) ;
}
cout<<"所有学生信息如下:"<<endl;
cout<<setw(10)<<"学号"<<setw(10)<<"姓名"<<setw(10)<<"成绩"<<endl;
//cout<<"学号"<<"姓名"<<"成绩"<<endl;
6.如果你定义了一个类,其指针成员是使用new初始化的,请指出可能出现的3个问题以及如何纠正这些问题。
2题
#include<iostream>
#include<string>
#include <cstdio>
#include <iomanip>
using namespace st(void);//输出数据
private:
long no;//学号
char *name;//姓名
int score;//分数
};
student::student()
{
cout<<"构造函数被调用"<<endl;
}
student::student(student &p)
{
name=new char[strlen()+1];
void show_num(){cout<<"The num is :"<<num<<"\n";}
};
int main()
{
NumClass ob,*p; //声明一个对象和指向对象的指针
ob.set_num(10); ob.show_num(); //通过对象ob直接调用成员函数
p=&ob; //使对象指针p指向对象ob
cout<<"请输入用户数"<<endl;
cin>>N;
s=new Account[20];
for(int i=0;i<N;i++)
{
cout<<"请输入用户名:"<<endl;
cin>>a;
s[i].getName(a);
cout<<"请输入账号:"<<endl;
cin>>b;
s[i].setmSN(b);
return avg;
}
float student::sum=0;
int student::num=0;
int main()
{
//NumClass *p=new NumClass[2];
int count;
long tempno;
char temps[10];
int tempscore;
cout<<"请输入学生人数:";
}
3题
#include<iostream.h>
#include<string.h>
class Account
{
private:
char mName[20]; //银行账户的户名
long mSN; //本账户的帐号
float mBalance; //本账户当前的余额
public:
Account(char name[]=" ",long num=0,float amount=0);//类的构造函数
};
int main()
{
NumClass *p=new NumClass[2]; //创建一个对象数组
p[0].set_num(10); p[1].set_num(20); //通过指针访问数组元素的成员
p[0].show_num();p[1].show_num();//通过指针显示数组元素
delete[] p;//删除整个对象数组
}
char choose='y';
while(choose=='y'||choose=='Y')
{
float a1,a2;
cout<<"请输入要查找的账号:"<<endl;
cin>>b;
for(int i=0;i<N;i++)
{
if(s[i].getmSN()==b)
{
cout<<"现在对账号"<<s[i].getmSN()<<"进行操作"<<endl;
long getmSN();
};
Account::Account(char name[],long num,float amount)
{
strcpy(mName,name);
mSN=num;
mBalance=amount;
}
Account::~Account()
{
//cout<<"析构函数被调用"<<endl;
{
public:
static float sum;
static int num;
static float avg();
student();//构造函数
student(student &p);//拷贝构造函数
~student();//析构函数
void setdata(long a,char *s,int t);//赋值
p->set_num(20);p->show_num(); //通过指针调用成员函数
return(0);
}
(3)#include<iostream.h>