#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);
}
}
}
}