#include<stdio.h>
//return 隻能傳回一個數!!!!!
//函數不可以嵌套調用!!!!! 但是可以嵌套定義
//函數必須保證 先 聲明 後 使用
//函數的設計應該盡量 高内聚 低耦合!!!!!!
//函數應該盡量 少 的去使用全局變量!!!!!
//函數當中形參是在棧當中儲存的!!!!!
//逗号表達式-(a,b,c,d,e,f。。n)整個表達式結果是()裡最後一個表達式的結果 n
//sizeof函數求的是數組的位元組大小 -cahr 當中\0也是一個大小!!!!!
//stelen char當中不算\0所占字元串大小!!!!!
//随着數組下标由小到大變化 -位址由低到高變化 (數組裡面相鄰元素的位址是連續的)
//表達式求值先看是否存在整形提升與算術裝換 後進行計算!!!!!
//在32位下 :int類型:占 4 個位元組;指針占 4 個位元組;作業系統可以使用的最大記憶體空間 2^32!!!!!!!!!!
//在64位下 :int類型:占 4 個位元組;指針占 8 個位元組;作業系統可以使用的最大記憶體空間 2^64
//定義全局變量一般不初始化預設是0 !!!!!(定義在main()之前的變量)
//遞歸是不能無限遞歸下去的
//定義一個函數Init()使得函數初始化全為0
//定義函數daying()使得函數列印數組當中的元素
//定義函數nizi()實行數組元素的逆置(數組元素倒放) 再列印數組元素
//void Init(int arr[], int sz)//因為不用傳回值 是以定義為void
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// arr[i] = 0;
// }
//
//}
//void daying(int arr[],int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
//}
//void nizi(int arr[], int sz)//其實逆置可以把元素兩兩交換
//{
// int left = 0;
// int right = sz-1;
// int i ;
// while (left < right)
// {
// i = arr[left];
// arr[left] = arr[right];
// arr[right] = i;
// left++;//記得要left與right移動!!!!!
// right--;
// }
// printf("\n");//使得兩組資料不同行
//}
//int main()
//{
// int arr[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// //Init(arr, sz);//初始化
// daying(arr, sz);//列印數組元素
// nizi(arr, sz);//逆置數組
// daying(arr, sz);//列印逆置數組元素
// return 0;
//}
//交換數組a與b(數組a b一樣大)的元素
//void jh(int a[], int b[],int sz)
//{
// int i= 0;
// for (i = 0; i < sz; i++)
// {
// int temp= a[i];
// a[i] = b[i];
// b[i] = temp;
// }
//}
//void daying(int arr[],int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
// printf("\n");
//}
//int main()
//{
// int a[] = { 1, 3, 5, 7, 9 };
// int b[] = { 2, 4, 6, 8, 10 };
// int sz = sizeof(a) / sizeof(a[0]);
// jh(a, b,sz);
// daying(a, sz);//列印數組當中的元素
// daying(b, sz);
// return 0;
//}
//int a[]={1,1,1,1,1}
//short* p=(short*)a --把 int a 強制類型轉換成 short a 類型 !!!!!(short一個占2個位元組)
//int a =0x11223344 --在記憶體當中是到着存放的 44 33 22 11 -4個位元組
//cahr* p=(cahr*)&a;*p=0; --因為char是一個位元組 是以隻改變了 44 這個位元組使得其變成了 00;!!!!! 是以輸出 11223300;
//int i;//定義全局變量 -不初始化預設為 0
//int main()
//{
// i--;//-1
// if (i > sizeof(i))//sizeof()是計算變量、類型所占記憶體的大小 一定是>=0的!!!!!并且是無符号的 !!!!!是以 i也會轉化成無符号表達的!!!!!
// {
// printf(">\n");
// }
// else{
// printf("<\n");
// }
// return 0;
//}
//統計變量當中二進制當中1的個數!!!!!
//#include<stdlib.h>
//int count_bit_one(unsigned int n)//如果n是負數的話把其換成 無符号來計算 最高位不是符号位
//{
// int count = 0;
// //可利用二進制/2 %2來判斷1的個數
// while (n)//while不為0即可以運作
// {
// if (n % 2 == 1)
// {
// count++;
// }
// n = n / 2;
// }
// return count;
//}
//int count_bit_oneer(int n)
//{
// int count = 0;
// int i = 0;
// for (i = 0; i < 32; i++)//因為int 是4個位元組 32位編譯器當中是 32 位的
// {
// if (((n >> i) & 1) == 1)//不斷向右移動 i位 與上1 看其是否!=1;
// {
// count++;
// }
// }
// return count;
//}
//int count_bit_onesahng(int n)//最好的方法!!!!!
//{
// int count = 0;
// while (n)
// {
// n = n&(n - 1);
// count++;
// }
// return count;
//}
//int main()
//{
// int a = 0;
// scanf_s("%d", &a);
// //寫一個函數求二進制表示當中有幾個一 -該變量的二進制表示是 補碼!!!!!
// //int count = count_bit_one(a);//法一 :循環法
// //int count = count_bit_oneer(a);//法二 :按位與
// int count = count_bit_onesahng(a);//法三:n&n-1
// printf("%d\n", count);
// //system("pause");//system庫函數-執行系統指令-pause(暫停) 要加上頭檔案#include<stdlib.h> 此代碼與系統當中的應用台是功能一樣的!!!!!
// return 0;
//}
//統計兩個int變量當中的二進制有多少位是不同的
//int get_diff_bit(int m, int n)
//{
// int count = 0;
// int tmp = m^n;//異或 相同為0,不同為1
// while (tmp)//利用上面的函數 求其中二進制位有多少個1 !!!!!
// {
// tmp = tmp&(tmp - 1);
// count++;
// }
// return count;
//}
//int main()
//{
// int m = 0;
// int n = 0;
// scanf_s("%d%d", &m, &n);
// int count = get_diff_bit(m, n);
// printf("%d\n", count);
// return 0;
//}
//擷取int 變量當中的二進制的 奇數位與偶數位 并且分别列印!!!!!
//void print(int m)
//{
// int i = 0;
// printf("列印的是奇數位");
// for (i = 30; i >= 0; i -= 2)
// {
// printf("%d", (m >> i) & 1);
// }
// printf("\n");
// printf("列印的是偶數位");
// for (i = 31; i >= 1; i -= 2)
// {
// printf("%d", (m >> i) & 1);
// }
//}
// int main()
// {
// int m = 0;
// scanf_s("%d", &m);
// print(m);
// return 0;
// }
//輸出乘法口訣表
//void print_table(int n)
//{
// int i = 0;
// for (i = 1; i <= n; i++)//表示的是行
// {
// int j = 0;
// for (j = 1; j <= i; j++)//表示列 (<=i可以控制其列印的項數)
// {
// printf("%d * %d = %-3d ", i, j, i*j); //%-3d表示的是 輸出之間相隔3個字元位
// }
// printf("\n");//列印完一行之後換行
// }
//}
//int main()
//{
// int n = 0;
// scanf_s("%d", &n);
// print_table(n);
// return 0;
//}
//逆序字元串數組
//#include<string.h>
//如果不能使用C語言原本的庫函數
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')//其不等于\0就是有效字元
{
count++;
str++;
}
return count;
}
void reverse_string(char* arr)
{
int left = 0;
//int right = strlen(arr)-1;//strlen是計算字元串的長度 應該包含頭檔案#include<string.h>
int right = my_strlen(arr) - 1;
while (left < right)
{
int tep = arr[left];
arr[left] = arr[right];
arr[right] = tep;
left++;
right--;
}
}
int main()
{
char arr[] = "hello world";
reverse_string(arr);//傳遞的是arr首元素的位址