1、排序函数
void order(int* p1, int* p2){
if(*p1 > *p2){
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
}
voidsort (int *p , int len , int perLen , void (*pOrder)(void* , void*)){
char* pt = (char*)p;
for(int i = 0 ; i < len ; i++){
for(int j = i ; j < len ; i ++){
pOrder(pt+i*perLen ,pt+j*perLen);
}
}
}
(1)将输入参数int*-> void* (void* 可以存储任何类型的地址,可以通用 )
(2)表示数组的第i个元素,事先要知道数组每个元素的大小(参数传入)
i*perLen => 当不知道指针类型时,表示走一步,应越过的字节数
p+i*perLen => 表示第i个元素的地址
(3)具体的数组要有具体的排序方法
调用函数,当不知道函数名时,可以通过函数指针调用
==================================================
sort.h
==================================================
void sort( void * p , int len , int perLen ,
void (*pOrder)(void * , void * ) );
==================================================
sort.cc
==================================================
void sort( void * p , int len , int perLen ,
void (*pOrder)(void * , void* ) ){
char* pt = (char*)p ;
for( int i = 0 ; i < len ; i++ ){
for( int j = i ; j < len ;j++ ){
pOrder(pt+i*perLen,pt+j*perLen ) ;
}
}
}
==================================================
main.cc
==================================================
#include <iostream>
#include "sort.h"
using namespace std;
void orderInt( void * p1 , void * p2 ){
int * t1 = (int*)p1 ;
int * t2 = (int*)p2 ;
if( *t1 > *t2 ){
int temp = *t1 ;
*t1 = *t2 ;
*t2 = temp ;
}
}
struct Person{
char name[ 40 ] ;
int age ;
int id ;
};
void orderByAge( void * p1 , void* p2 ){
Person * t1 = (Person*)p1 ;
Person * t2 = (Person*)p2 ;
if( t1->age > t2->age ){
Person t = *t1 ;
*t1 = *t2 ;
*t2 = t ;
}
}
void orderById( void *p1 , void* p2 ){
Person* t1 = (Person*)p1 ;
Person* t2 = (Person*)p2 ;
if( t1->id > t2->id ){
Person t = *t1 ;
*t1 = *t2 ;
*t2 = t ;
}
}
void orderByName( void * p1 , void* p2 ){
Person* t1 = (Person*)p1 ;
Person* t2 = (Person*)p2 ;
if( strcmp( t1->name , t2->name ) > 0 ){
Person t = *t1 ;
*t1 = *t2 ;
*t2 = t ;
}
}
int main(){
int ia[] = { 3,1,6,3,6,8,3,468,89 };
sort( ia , 9, sizeof(int), orderInt );
for( int i = 0 ; i < 9 ; i++ ){
cout<<ia[i]<<" " ;
}
cout<<endl;
Person pers[ 3 ] ;
pers[0].id = 1 ;
pers[0].age = 29 ;
strcpy( pers[0].name , "liucy" ) ;
pers[1].id = 2 ;
pers[1].age = 28 ;
strcpy( pers[1].name , "huxinzhe" ) ;
pers[2].id = 3 ;
pers[2].age = 26 ;
strcpy( pers[2].name , "xuehailu" ) ;
sort( pers , 3 , sizeof(Person), orderByAge );
for( int i = 0 ; i < 3 ; i++ ){
cout<<pers[i].name<<","<<pers[i].age<<",";
cout<<pers[i].id<<endl ;
}
sort( pers, 3, sizeof( Person) , orderById ) ;
for( int i = 0 ; i < 3 ; i++ ){
cout<<pers[i].name<<","<<pers[i].age<<",";
cout<<pers[i].id<<endl;
}
sort( pers , 3 , sizeof( Person ) , orderByName );
for( int i = 0 ; i < 3 ; i++ ){
cout<<pers[i].name<<","<<pers[i].age<<",";
cout<<pers[i].id<<endl;
}
return 0 ;
}
2、面向对象
封装:对象表示
继承:更好的代码重用
多态
对象的组成: 属性 成员变量
行为 函数
面向过程的表示方法:
数据与函数分离,关系松散
封装的作用,把数据和函数封装到一起,保证数据专用
全局函数:在类外面的函数,要使用成员变量,要通过参数传进来
成员函数:在类内,可直接使用自己类的成员变量
对于类的变量的初始化:
Person p ;
strcpy(p.name , "liucy");
p.age = 23;
p.speak();
对成员变量和成员函数的使用都要通过类的对象
public 关键字,表示在其他地方可以使用
默认是私有的,在main函数中不能使用
成员变量和成员函数依赖于类的对象(实例)
类型是对对象的描述
对象是类型的实例
对象自己的成员函数访问自己的成员变量
什么是类?类由什么组成?
怎么使用类?及类和对象的关系?
成员变量和成员函数归谁所有?
面向对象的方法写程序
(1)首先写一个类,描述对象
用变量表示属性,函数表示行为
(2)调用函数
创建一个类的对象,通过对象调用函数