1.N 个整数的排序。
(1)要求
1)用一个数组存放各个整数
2)在主函数 main() 中实现数据的输入和输出操作,并用一个函数实现对数组元素的排序操作。
3 )排序函数为swap(inta[], intsize); (size为数组的长度)
算法如下:
第一步:从键盘输入5 个int数;
第二步:输出这五个数表示数已经被输入
第三步:调用排序算法(swap函数)对这5个数进行排序,并且输出这个5个排好序的数
以下是程序源代码加注释:
# include "iostream"
# include "cmath"
using namespace std;//头文件
void swap(int a[], int size); //排序函数声明
int *array= new int[5];//全局变量
void main()
{
inti;
//动态分配内存空间
cout<<"pleaseinput 5 nums int :"<<endl;
for(i=0;i<5;i++)
cin>>array[i];//从键盘输入5个数
cout<<"thereare 5 nums you inputed!!:"<<endl;
for(i=0;i<5;i++)
{
cout<<array[i]<<" ";
}//输出输入的五个数
swap(array,5);//进行排序
for(i=0;i<5;i++)
{
cout<<array[i]<<" ";
}//输出排好序的5个数
}
void swap(int a[], int size)//排序函数
{
inti,j;
for(i=0;i
{
for(j=i+1;j
{
if(a[i]//判断是否大于
{
a[i]= a[i] + a[j];
a[j]= a[i] - a[j];
a[i]= a[i] - a[j];//交换
}
}
}
}
运行结果:
心得:
在排序算法中,冒泡法,选择法,插入法,快速法,shell法用的比较多,其中冒泡法中还有一种叫做沉底法的排序方法,在小程序中,这些排序方法大同小异,而当排序元素非常多的时候,百度一个快速法排序能节约很多时间。。。
参考资料:http://blog.csdn.net/xdw1985829/article/details/6699224
2.输入一个n×n的矩阵,求出两条对角线元素值之和以及输出矩阵中最大值和最小值的下标。
算法如下:
1. 先从键盘输入数组的大小N。
2. 使用随机值给数组元素赋值。
3. 调用函数_angelAdd1(int **p),_angelAdd2(int **p)来求对角线元素的值。
4. 调用 trixMax(int **p)来求最大值元素的下标。
5. 调用 trixMin(int **p)来求最小值元素的下标。
6. 输出对应的值。
代码如下:
#include
#include
#include
usingnamespace std;
int N = 0;//全局变量N,用于存储数组的大小
//函数原型声明
voidiniTrix(int **p);
int_angelAdd1(int **p);
int_angelAdd2(int **p);
int*trixMax(int **p);
int*trixMin(int **p);
void _output(int**p);
intmain()
{
int i=0;//分配数组地址时用到的循环标志
int flag=0;//switch的使用标志
int *a;//用于装返回的下标的两个数
cout<<"how big the trixis?"<<endl;
cin>>N;
int **p;
p = new int *[N];
for(i=0;i
p[i] = new int[N];//分配数组大小
cout<<" input 1 to inittrix"<<endl<<" input 2 to output trix"<<endl<<" input 3 to output the max num'sposition"<<endl<<" input 4 to output the min num's position"<<endl<<" input 0 to exit"<<endl;
cout<<"--------------------------------"<<endl;
for(int oflag=0; oflag<100; oflag++)
{
cin>>flag;
switch(flag)//将switch嵌套到for循环,实现多次操作
{
case 1:
iniTrix(p);
break;
case 2:
_output(p);
break;
case 3:
a=trixMax(p);
cout<<"the maxnum'positinis:"<<endl<<"("<<a[1]<<","<<a[2]<<")"<<endl;
break;
case 4:
a=trixMin(p);
cout<<"the minnum'positinis:"<<endl<<"("<<a[1]<<","<<a[2]<<")"<<endl;
break;
case 0:
exit(0);
break;
default:
cout<<"don'tluanshuru OK??"<<endl;
}
}
return 0;
}
voidiniTrix(int **p)//初始化数组
{
srand(time(0));
int i = 0, j = 0;
for(i=0; i
{
for(j=0; j
{
p[i][j]=rand()0;
}
}
cout<<"initsuccessfully!"<<endl;//初始化成功标志
}
int_angelAdd1(int **p)//从对角线(0,0)加到(N,N)
{
int i=0, tmp=0;
for(i=0; i
{
tmp+=p[i][i];
}
return tmp;
}
int_angelAdd2(int **p)//从对角线(0,N)加到(N,0)
{
int i=0, j=0, tmp=0;
for(i=0; i
{
for(j=N-1; j>=0; j++)
{
tmp += p[i][j];
}
}
return tmp;
}
int*trixMax(int **p)//求数组中最大数的下标
{
int *a;
a = new int[2];
int i=0,j=0,tmp=0;
for(i=0;i
{
for(j=0; j
{
if(p[i][j]>tmp)
{
tmp = p[i][j];
a[1]=i;
a[2]=j;
}
}
}
return a;
}
int*trixMin(int **p)//求数组元素最小值得下表
{
int *a;
a = new int[2];
int i=0,j=0,tmp=100;
for(i=0;i
{
for(j=0; j
{
if(p[i][j]<=tmp)
{
tmp = p[i][j];
a[1]=i;
a[2]=j;
}
}
}
return a;
}
void_output(int **p)//遍历数组并输出数组元素
{
int i=0, j=0;
cout<<"----This is the trixcreated!-----"<<endl;
for(i=0; i
{
for(j=0;j
{
cout<<p[i][j]<<"";
}
cout<<endl;
}
cout<<"-----------------------------------"<<endl;
}
运行结果:
总结:
这道题是一个对二位数组的定义以及操作,其中用到了C++中动态分配new的使用方法,特别值得注意的是要理解指针的指针这个概念。指针在C/C++中使用方式特别灵活,用好的话能节约大部分空间,还能提高代码运行效率。另外指针在函数的使用中,若是函数要返回一个数组,则可以通过传递数组指针的方式来返回其值。
能够更好的使用指针是 是否能更加充分的掌握C++这门语言的一个评判标准,下面列举一些常用的比较难理解的指针方式:
1. int*a[10]; //指针数组
2. int (*a)[10]; //数组指针
3. int(*a)(int); //函数指针
4. int(*a[10])(int); //函数指针数组
5. int*a,**a; //指针和指向指针的指针
6. charstr[]; //字符串数组
7. char*str, **str; //字符指针和和指向字符串的指针
什么叫做函数指针数组:
如果一个指针指向某个函数,那么它便是函数指针。有时候我们如果需要在一个循环中,每次调用不同的函数(这些函数的返回值和参数相同,函数名不同,实现不同),那么就可以使用函数指针数组来使代码更加简练和易读。