天天看點

C語言 練習題

#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首元素的位址