天天看點

一些小方法諸如:交換值,排序,查找等等

#include<iostream>
#include<windows.h>
//#include"c:\Users\Administrator\Desktop\dd\aaa.h"
//------strlen 沒有結束符,sizeof 有結束符
int a = 1;
int b = 2;
int arr[] ={1,2,6,4,8,9,11,55,23};
int mu[5]={23,24,65,76,98};
int shan[10]={3,4,87,23,8,90,20,54,26,94};
int shui[5]={67,45,34,78,37};
/*
1  交換2個變量的值 void ExChange(int* a, int* b);
void ExChange(int& a, int& b);	
*/
void ExChange(int *a,int *b)
{
	int c = *a;
	*a = *b;
	*b = c;
}
/*
2  傳回數組中最大的資料 int GetMax(int* arr,int len);
當隻傳回一個資料的時候通常用傳回值傳回出去!
*/
void ExChange1(int &a,int &b)
{
	int c = a;
	a = b;
	b = c;
}
/*
3  同時傳回數組中最大值 void GetMax(int* arr,int len);
*/
int GetMax(int *arr,int len)
{
	if(len == 1) return arr[0];
	for(int i =0 ; i < len-1; ++ i)
	{
		if(arr[i]>arr[i+1])
		{
			int a = arr[i];
			arr[i] = arr[i + 1];
			arr[i+1] = a;
		}
	}
	return arr[len - 1];
}
/*
3  同時傳回數組中最大值和最小值 
void GetMaxAndMin(int* arr,int len,int* max,int* min);
一般要傳回多個值都是通過形參傳回出去!
*/
void GetMx(int *arr,int len,int* max,int* min)
{
	if(len == 1) 
	{
		*min = arr[0];
		*max = arr[0];
	}
	for(int i =0 ; i < len-1; ++ i)
	{
		if(arr[i]>arr[i+1])
		{
			int a = arr[i];
			arr[i] = arr[i + 1];
			arr[i+1] = a;
		}
	}
	*max = arr[len - 1];
	for(int i =0 ; i < len-1; ++ i)
	{
		if(arr[i] < arr[i+1])
		{
			int a = arr[i];
			arr[i] = arr[i + 1];
			arr[i+1] = a;
		}
	}
	*min = arr[len - 1];
}
/*
4  數組升序排列 void Sort(int* arr,int len);      
注意循環次數!
*/
void Sort(int *arr,int len)//升序排列
{
	for(int i = 0 ; i < len ;++i)
	{
		for(int j = i + 1 ; j < len ;++j)
		{
			if( arr[i] > arr [j])
			{
				int a = arr[i];
				arr[i] = arr[j];
				arr[j] = a ;
			}
		}
	}
}

/*
5  用折半查找的方法傳回資料在升序數組中的下标,無則傳回-1 
*/
int ZBchazhao(int *arr,int len,int data)//折半查找,升序或降序數組
{
	int a = 0;
	int b = len-1;
	while(a <= b)
	{
		int m = (a+b)/2;
		if(data < arr[m])
			b = m - 1 ;
		else if(data > arr[m])
			a = m + 1 ;
		else
			return m ;
	}
	return -1;
}
/*
6  strlen("abc")和sizeof("abc") 到底算不算結束符?strlen算長度不算結束符,sizeof算結束符
7  計算一個字元串的長度  int Strlen(const char* s);
*/
int Strlen(const char*s)
{
	int len = 0 ;
	while(s[len])len++;
	return len;
}
/*
8  字元串拷貝功能,傳回拷貝之後的字元串  char* Strcpy(char* dest,const char* src);
*/
char*Strcpy(char*dest,const char*src)
{
	int len = 0 ;
	while(src[len])dest[len] = src[len++];
	dest[len] = 0;
	return dest;
}
/*
9  字元串連接配接功能,傳回連結之後的字元串  char* Strcat(char* dest, const char* src);
*/
char*Strcat(char*dest,const char*src)
{
	int len = 0 ;
	int len1 = 0 ;
	while(dest[len])len++;
	while(src[len1])dest[len+len1] = src[len1++];
	dest[len+len1] = 0 ;
	return dest ;
}
/*
10 字元串比較功能,相等傳回0,第一個大于第二個傳回1,
	第一個小于第二個傳回-1	int Strcmp(const char* s1,const char* s2);
*/
int Strcmp(const char*s1,const char *s2)
{
	int len = 0 ;
	while(s1[len] || s2[len])
	{
		if(s1[len] > s2[len])
			return 1;
		else if(s1[len] < s2[len])
			return -1;
		len++;
	}
	return 0 ;
}
/*
11 字元串s1中查找字元串s2,傳回第一個找到的首位址
	const char* Strstr(const char* s1, const char* s2);  
	注意傳回的是位址,不是下标!
*/
const char* Strstr(const char*s1,const char *s2)
{
	int len1 = 0 ;
	int len2 = 0 ;
	while(s1[len1])len1++;
	while(s2[len2])len2++;
	bool T = true;
	for(int i = 0 ; i < len1 - len2 ; ++i )
	{
		for(int j = 0 ; j < len2 ; ++j )
		{
			if(s1[i+j] != s2[j])
			{
				T = false;
				break;
			}
			else T = true;
		}
		if(T)
		{
			return &s1[i];
		}
	}
	return 0;
}
/*
12 字元串數組排序,交換s中的資料 char s[5][128]; 
*/
void strpaixu(char**arr,int a)
{
	for(int i=0;i<a-1;++i)
	{
		for(int j= i+1;j<a;++j)
		{
			if(Strcmp(arr[i],arr[j]) > 0)
			{
				char *a = arr[i];
				arr[i] = arr[j];
				arr[j] = a;
			}
		}
	}
}
/*
13 字元串數組排序,s中的資料不變,通過交換p中資料,
	通過輸出p得到升序排列的5個字元串 char s[5][128]; 
	char* p[5]={s[0],s[1],s[2],s[3],s[4]};
*/
void strpaixu_zhizhen(char**arr,char**p,int a)
{
	for(int i=0;i<a;++i)
		p[i] = arr[i];
	for(int i=0;i<a-1;++i)
	{
		for(int j= i+1;j<a;++j)
		{
			if(Strcmp(p[i],p[j]) > 0)
			{
				char *a = p[i];
				p[i] = p[j];
				p[j] = a;
			}
		}
	}
}
/*
14 字元串轉整數,如果s是非法的字元串則傳回假  bool Atoi(const char* s,int* i);
*/
bool Atoi(const char* s,int* a)
{
	int len = 0 ;
	*a = 0 ;
	while(s[len])len++;
	if(s[0] == '-' || s[0] == '+')
	{
		for(int i = 1 ; i  < len ;++i)
		{
			if(s[i] >= '0' && s[i] <= '9')
				*a = *a * 10 + s[i]-'0';
			else
				return false;
		}
		if(s[0] == '+')
			*a = *a;
		else if(s[0] == '-')
			*a = -*a;	
		return true;
	}
	else
	{
		for(int i = 0 ; i  < len ;++i)
		{
			if(s[i] >= '0' && s[i] <= '9')
				*a = *a * 10 + s[i]-'0';
			else
				return false;
		}
		return true;
	}
}
/*
15 	int shan[10]={3,4,87,23,8,90,20,54,26,94};//這幾個下标位置繪制'山'
	int shui[5]={67,45,34,78,37};//這幾個下标位置繪制'水'
	int mu[5]={23,24,65,76,98};//這幾個下标位置繪制'木'
	地圖寬高是10*10,如果同個位置既是山也是水或者木,按照木》山》水 的優先級繪制,完成繪制函數
	void Draw();
*/
//int * h;static int mm = 120202;h = &mm;
void draw()
{
	int map[100]={};
	for(int i = 0 ; i < 100 ; ++i)
	{
		for(int j = 0 ; j < 10 ; ++j)
		{
			if(i == mu[j] && j < 5 )		  map[i] = 1 ;
			else if(i == shan[j] && map[i] != 1) map[i] = 2 ;
			else if(i == shui[j] && j < 5 && map[i] != 1 && map[i] != 2) map[i] = 3 ;
		}
	}
	for(int i = 0 ; i < 100 ;++i)
	{
		switch (map[i])
		{
		case 0:std::cout<<"口";break;
		case 1:std::cout<<"木";break;
		case 2:std::cout<<"山";break;
		case 3:std::cout<<"水";break;
		}
		if(i%10==9)std::cout<<std::endl;
	}
}

void main1()
{	
	
	//draw();
	//char s[]="-230123";
	//int a = 0;
	//bool b=Atoi(s,&a);
	//if(b == false)
	//{
	//	std::cout<<"feifa";
	//	system("pause");
	//}
	//std::cout<<*h<<std::endl;
	//system("pause");


}
/*
16	棧記憶體區、靜态記憶體區、堆記憶體區、常量記憶體區
	1怎麼定義?
		棧記憶體:就是那些由編譯器在需要的時候配置設定,在不需要的時候自動清楚的變量的存儲區。
		堆記憶體區:記憶體使用new進行配置設定,使用delete或delete[]釋放。如果未能對記憶體進行正确
			的釋放,會造成記憶體洩漏。但在程式結束時,會由作業系統自動回收。
		靜态記憶體區:靜态的記憶體使用的是棧空間記憶體,不用程式員自己來配置設定。因為靜态變量占
			用的存儲空間對于編譯器而言是可預計的,靜态記憶體隻需要程式設計的時候直接聲明就可以了。
		常量記憶體區:存儲常量,不允許被修改。
	2是否初始化?
	棧記憶體:否
	堆記憶體:否
	靜态記憶體:是
	常量記憶體:否
	3何時開辟記憶體?
	棧記憶體:函數調用時
	堆記憶體:執行malloc或new時
	靜态記憶體:編譯時候
	常量記憶體:編譯時候
	4何時銷毀記憶體?
	棧記憶體:函數結束
	堆記憶體:執行free或new時候
	靜态記憶體:程式結束
	常量記憶體:程式結束
	5寫f函數分别傳回這4種記憶體區的位址
	int* f1()
	{
		int a = 10;
		return &a;
	}
	
	int* f2()
	{
		int *p = (int*)malloc(10);
		return p ;
	}
	int* f3()
	{
		static int b = 20 ;
		return &b;
	}
	char* f()
	{
		char *p = "adfsdfsd";
		return p;
	}
//main.cpp 


//int a = 0; 全局初始化區 
//char* p1; 全局未初始化區 
//main() 
//{ 
//int b; 棧 
//char s[] = "abc"; 棧 
//char* p2; 棧 
//char* p3 = "123456"; 123456\0在常量區,p3在棧上。 
//static int c =0; 全局(靜态)初始化區 
//p1 = (char*)malloc(10); 
//p2 = (char*)malloc(20); 
//配置設定得來得10和20位元組的區域就在堆區。 
//strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會将它與p3所指向的"123456"優化成一個地方。 


17 生成可執行程式的步驟?每個步驟做的事情?
	1)預編譯:宏和包含檔案;過後隻剩.cpp
	2)編譯:定義語句;過後生成.obj
	3)連接配接:生成.exe


18 static的三種用法和各種功能?
//static 的用法:
//1)修飾局部變量 将局部變量存入靜态記憶體區,程式結束才銷毀,操作隻能用指針;
//2)修飾全局變量 将全局變量作用域限定在該源檔案
//3)修飾函數     将函數調用範圍限定在該源檔案中

19	全局變量的定義和聲明寫法是什麼? 
	:都在函數外		定義:int a 或 int a = 10  或 extern int a = 10; 
					聲明:extern int a ;
	哪種寫法不算聲明而算定義?
	: extern int a = 10
	函數的定義和聲明寫法是什麼?
	定義:有函數體   聲明:沒有函數體
	int fire()				int fire();
	{
		return 0 ;
	}
	局部變量有聲明嗎?
	:沒有,用不着
	局部變量和全局變量可以同名嗎?如果可以同名怎麼區分?
	:可以,臨近原則;

	20 内聯函數和普通函數的差別?
	:内聯函數隻能在目前源檔案中調用,普通函數則是整個工程檔案都可以
   什麼情況下寫為内聯函數更好?
	:該函數通用度不高
   内聯函數的定義和聲明是否應該像普通函數那樣一個寫.h一個寫.cpp ?
	:不;

	21	常量指針和指針常量分别怎麼定義?
		1)常量指針:指向常量的指針
		2)指針常量:該指針為常量
		以及操作規則是怎樣的?
		1)常量指針:不能修改指向内容,可以修改指向
		2)指針常量:不能修改指向,可以修改指向内容
		哪個必須初始化?
		:指針常量必須初始化
		哪種有兩種寫法?
		:常量指針  如:const int* p  /  int const* p ;


	22	指針函數 和 函數指針 分别指什麼?
		用具體代碼舉例一下。


		22	指針函數 和 函數指針 分别指什麼?
		用具體代碼舉例一下。
		1)指針函數:傳回值為指針類型的函數
			int* fun()
			{
				static int a = 90 ;
				return &a ;
			}
		2)函數指針:指向函數的指針
			int fire()
			{
				int (*p)(const char a,const char b);
				p = strcmp ;
				return 0 ;
			}


	23	typedef和引用分别是給什麼取别名?
		用具體代碼舉例一下。
		1)typedef:給類型取别名
			typedef int A ;
			A a = 10 ;// a 為int類型;
		2) 引用:給變量取别名
			int a = 5 ;
			int &b = a ;
			b = 1 ;
			cout<<a<<b;//結果都為1;

		24	完成無限添加整數 
			void Add(int a); 
			void Print(); 
			void Save(const char* filename);
			void Load(const char* filename);
			必須先存整數的個數,再存資料!
*/
int size = 4 ;
int len = 0 ;
int *p = (int*)malloc(4);
char filename[60];
void Add(int a)
{
	p[len++] = a ;
	if(size == 4*len)
	{
		size*=2;
		int *np = (int*)malloc(size);
		for(int i = 0 ; i < len ; ++i)
			np[i] = p[i];
		free (p);
		p = np ;
	}
}
void Print()
{
	for(int i = 0 ; i < len ; ++i )
		std::cout<<p[i]<<"  ";
}
void Save(const char* filename)
{
	FILE *fp ;
	fopen_s(&fp,filename,"wb");
	if(fp == 0)return;
	fwrite(&len,4,1,fp);
	fwrite(p,4,len,fp);
	fclose(fp);
}
void Load(const char* filename)
{
	FILE*fp;
	fopen_s(&fp,filename,"rb");
	fread(&len,4,1,fp);
	p = (int*)malloc(len*4);
	fread(p,4,len,fp);
	fclose(fp);
}
void main2()
{
	while(1)
	{
		system("cls");
		int aa ;
		std::cout<<"請輸入1~4,添加/儲存/檢視/load";
		std::cin>>aa;
		std::cout<<std::endl;
		if(aa == 1) 
		{
			int a;
			std::cin>>a;
			Add(a);
		}
		if(aa == 2)
		{
			std::cout<<"輸入檔案名";
			std::cin>>filename;
			Save(filename);
		}
		if(aa == 3)
		{
			Print();
			system("pause");
		}
		if(aa == 4)
		{
			std::cout<<"請輸入需要的檔案";
			std::cin>>filename;
			Load(filename);
		}
	}
}


}


           

繼續閱讀