c13--数组
//
// main.c
// 進制查表法
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
//
#include <stdio.h>
void printfBinary(int value);
void printfBinary2(int value);
void printOct(int value);
void printfHex(int value);void printfHex2(int value);
void printfOct2(int value);
void printfBinary3(int value);int main(int argc, const char * argv[]) {/*000000000000000000000000000000000000000000000000000000000111*/int num = 10;// 1010;
// printfBinary2(num);
// printOct(num);
// printfHex2(num);
// printfOct2(num);
printfBinary3(num);return 0;
}void printfBinary3(int value)
{// 1.定義一個數組, 用于保存二進制中所有的取值char charValues[] = {'0', '1'};// 2.定義一個數組, 用于保存查詢后的結果char results[32] = {'0'};// 3.定義一個變量, 用于記錄當前需要存儲到查詢結果數組的索引int pos = 32;while (value != 0) {// 1.取出1位的值int res = value & 1;// 2.利用取出來得值到表中查詢對應的結果char c = charValues[res];// 3.存儲查詢的結果results[--pos] = c;// 4.移除二進制被取過的1位value = value >> 1;}// 4.打印結果for (int i = pos; i < 32; i++) {printf("%c", results[i]);}printf("\n");}void printfOct2(int value)
{// 1.定義一個數組, 用于保存八進制中所有的取值char charValues[] = {'0', '1', '2', '3', '4', '5', '6', '7'};// 2.定義一個數組, 用于保存查詢后的結果char results[11] = {'0'};// 3.定義一個變量, 用于記錄當前需要存儲到查詢結果數組的索引int pos = 11;while (value != 0) {// 1.取出3位的值int res = value & 7;// 2.利用取出來得值到表中查詢對應的結果char c = charValues[res];// 3.存儲查詢的結果results[--pos] = c;// 4.移除二進制被取過的三位value = value >> 3;}// 4.打印結果for (int i = pos; i < 11; i++) {printf("%c", results[i]);}printf("\n");}void printfHex2(int value)
{// 1.定義一個數組, 用于保存十六進制中所有的取值// 規律: 取出的4個二進制位得到的值, 正好是數組中角標對應的值char charValues[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
// '', '', '', '', '', '', '', ''char results[8] = {'0'};int pos = 8;while (value != 0) {// 取出4位的值int res = value & 15;// 利用這個值作為索引去數組中查詢對應的十六進制的值char c = charValues[res];
// printf("%c", c);// 將取出來得值放到用于存儲結果數組中results[--pos] = c;// 每取完一次就干掉它最低的4位value = value >> 4;
// printf("pos = %i\n", pos);
}for (int i = pos; i < 8; i++) {printf("%c", results[i]);}printf("\n");
}void printfHex(int value)
{for (int i = 0; i <= 8; i++) {int res = value & 15; // 1111// 對十六進制進行特殊處理if (res > 9) {// 11 - 10 1 + achar c = res - 10 + 'a';printf("%c", c);}else{printf("%i", res);}value = value >> 4;}
}void printOct(int value)
{for (int i = 0; i <= 11; i++) {int res = value & 7; // 111printf("%i", res);value = value >> 3;}
}void printfBinary2(int value)
{for (int i = 0; i <= 32; i++) {int res = value & 1;printf("%i", res);value = value >> 1;}printf("\n");
}void printfBinary(int value)
{
// int offset = sizeof(value) * 8 - 1;int offset = (sizeof(value) << 3) - 1;while (offset >= 0) {int res = (value >> offset) & 1;printf("%i", res);offset--;}printf("\n");
} //
// main.c
// 進制查表法優化
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
//
#include <stdio.h>
void total(int value, int base, int offset);
void ptintBinary(int num);
void printfOct(int num);
void printfHex(int num);int main(int argc, const char * argv[]) {// insert code here...
// ptintBinary(10);
// printfOct(10);printfHex(10);return 0;
}void printfHex(int num)
{total(num, 15, 4);
}void printfOct(int num)
{total(num, 7, 3);
}void ptintBinary(int num)
{total(num, 1, 1);
}// 轉換所有的進制
// value就是需要轉換的數值
// base就是需要&上的數
// offset就是需要右移的位數
void total(int value, int base, int offset)
{// 1.定義一個數組, 用于保存十六進制中所有的取值char charValues[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};// 2.定義一個數組, 用于保存查詢后的結果char results[32] = {'0'};// 3.定義一個變量, 用于記錄當前需要存儲到查詢結果數組的索引int pos = sizeof(results)/ sizeof(results[0]);while (value != 0) {// 1.取出1位的值int res = value & base;// 1 7 15// 2.利用取出來得值到表中查詢對應的結果char c = charValues[res];// 3.存儲查詢的結果results[--pos] = c;// 4.移除二進制被取過的1位value = value >> offset;// 1 3 4
}// 4.打印結果for (int i = pos; i < 32; i++) {printf("%c", results[i]);}printf("\n");} //
// main.c
// 練習4
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
//
#include <stdio.h>int main(int argc, const char * argv[]) {// 要求從鍵盤輸入6個0~9的數字,排序后輸出// 0~9999// 1.定義數組保存用戶輸入的數據int nums[10] = {0};// 2.接收用戶的數據int value = -1;for (int i = 0; i < 6; i++) {printf("請輸入第%i個數據\n", i + 1);scanf("%i", &value); // 2, 2, 1, 2// 7, 3, 6, 1
// nums[value] = 1;nums[value] = nums[value] + 1;}for (int i = 0; i < 10; i++) { // i == 7
// printf("nums[%i] = %i\n", i , nums[i]);/*if (nums[i] != 0) {printf("%i\n", i); // 1, 2, 2, 2}*/for (int j = 0; j < nums[i]; j++) { // j == 1printf("%i\n", i); // 1, 1, 2, 3, 3, 6
}}return 0;
} //
// main.c
// 數組的注意點
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
//
#include <stdio.h>int main(int argc, const char * argv[]) {char nums[2] = {1, 5};
// 0 , 1 , 2char values[3] = {7, 8, 9};// 注意點: 在使用數組的時候, 一定不要訪問不屬于字節的存儲空間, 這樣會導致數據混亂// 有時候如果訪問了不屬于自己的存儲空間, 程序會報錯
// values[3] = 44;
// printf("values[3] = %i\n", values[3]);
// printf("nums[0] = %i\n", nums[0]);
nums[-1] = 88;printf("values[2] = %i\n", values[2]);return 0;
} //
// main.c
// day07
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
//
#include <stdio.h>int main(int argc, const char * argv[]) {// 變量在內存中的存儲// 由于變量的內存尋址是從大到小, 所以存儲數據時會從高字節開始存儲int num = 10; // 0000 0000 0000 0000 0000 0000 0000 1010// 注意: 數組的存儲和變量有點不一樣, 數組存儲元素, 是從所占用的低字節開始存儲char charValues[4] = {'l', 'u', 'c', 'k'};printf("charValues[0] = %p\n", &charValues[0]);printf("charValues[1] = %p\n", &charValues[1]);printf("charValues[2] = %p\n", &charValues[2]);printf("charValues[3] = %p\n", &charValues[3]);/*charValues[0] = 0x7fff5fbff7c8charValues[1] = 0x7fff5fbff7c9charValues[2] = 0x7fff5fbff7cacharValues[3] = 0x7fff5fbff7cb*/// &charValues == &charValues[0] == charValuesprintf("&charValues = %p\n", &charValues);// 數組名,保存的是數組的首地址,是第0個元素的地址,printf("charValues = %p\n", charValues);// 00000000 00000000 00000000 00000101
// 00000000 00000000 00000000 00000110int nums[2] = {5, 6};return 0;
} //
// main.c
// 數組練習1
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
//
#include <stdio.h>int main(int argc, const char * argv[]) {// 從鍵盤錄入當天出售BTC的價格并計算出售的BTC的總價和平均價(比如說一天出售了3個比特幣)// 1.接收數據
printf("請輸入第1個比特幣的價格\n");int value1 = -1;scanf("%i", &value1);printf("請輸入第2個比特幣的價格\n");int value2 = -1;scanf("%i", &value2);printf("請輸入第3個比特幣的價格\n");int value3 = -1;scanf("%i", &value3);// int value3 = -1;int sum = 0;int value = -1;for (int i = 0; i < 3; i++) {printf("請輸入第3個比特幣的價格\n");scanf("%i", &value);sum += value;}// 1.1定義數組保存每個比特幣的價格int values[4] = {-1};// 1.2動態計算數組的元素個數int length = sizeof(values) / sizeof(values[0]);// 1.3定義變量保存總和int sum = 0;for (int i = 0; i < length; i++) {printf("請輸入第%i個比特幣的價格\n", i + 1);scanf("%i", &values[i]);sum += values[i];}// 2.計算總和
// int sum = value1 + value2 + value3;int sum = 0;for (int i = 0; i < length; i++) {sum += values[i];}// 3.計算平局值int average = sum / length;// 4.輸出結果printf("sum = %i, average = %i\n", sum, average);return 0;
} //
// main.c
// 數組和函數
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
//
#include <stdio.h>// 基本數據類型作為函數的參數是值傳遞
// 如果形參是基本數據類型, 在函數中修改形參的值不會影響到實參的值
void change(int value)
{value = 55;
}// 注意: 數組名作為函數的參數傳遞, 是傳遞的數組的地址
// 因為數組名就是數組的地址 &number = &number[0] == number
// 注意: 如果數組作為函數的形參, 元素的個數可以省略
// 如果形參是數組, 那么在函數中修改形參的值, 會影響到實參的值
//void change2(int values[2])
void change2(int values[])
{values[0] = 88;values[1] = 99;
}
int main(int argc, const char * argv[]) {/*int num = 10;change(num);printf("num = %i\n", num);*/int nums[2] = {1, 5};change2(nums); // 相當于傳遞了數組的地址printf("nums[1] = %i\n", nums[1]);change(nums[0]);printf("nums[0] = %i\n", nums[0]);return 0;
} //
// main.c
// 數組和函數2
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
//
#include <stdio.h>
//void printArray(int values[5]);
void printArray(int values[5], int length);int main(int argc, const char * argv[]) {// 要求定義一個函數, 實現遍歷數組. (只要別人傳遞數組給函數, 就要求輸出數組中所有元素的值)int nums[3] = {1 , 3 , 5};printf("size = %i\n", sizeof(nums));int length = sizeof(nums) / sizeof(nums[0]);printArray(nums, length); // 數組名稱保存的是數組的地址return 0;
}// 如果傳遞的數組的名稱, 其實傳遞的是地址
// 如果傳遞的是地址, 其實傳遞的是指針
// 指針在64位編譯環境占8個字節// 注意: 如果數組作為形參, 那么在函數中就不能通過數組的名稱計算出數組元素的個數
// 因為系統會自動將數組形參轉換為指針, 指針占用8個字節
void printArray(int values[5], int length)
{printf("size = %i\n", sizeof(values));//8,指針類型// 1.動態計算數組的元素個數,sizeof(values)獲取的是字節的大小,int length1 = sizeof(values) / sizeof(values[0]);//8/4=2// 永遠只有2個for (int i = 0; i < length; i++) {printf("values[%i] = %i\n", i,values[i]);}
} //
// main.c
// 數組練習2
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
//
#include <stdio.h>int arrayMax(int values[], int length);
int arrayMax2(int values[], int length);int main(int argc, const char * argv[]) {// 設計一個函數int arrayMax(int a[], int count)找出數組元素的最大值int nums[5] = {-99, -188, -5, -100, -77};int length = sizeof(nums) / sizeof(nums[0]);int max1 = arrayMax(nums, length);int max = arrayMax2(nums, length);printf("max = %i\n", max);return 0;
}int arrayMax2(int values[], int length)
{// 1.定義變量, 保存數組中最大值的角標(索引)int max = 0;// 2.遍歷數組for (int i = 1; i < length; i++) {// 3.取出數組中對應角標的元素的值進行比較if (values[max] < values[i]) {// 如果當前遍歷到的角標對應的元素的值大于max這個角標對應元素的值// 那么就將當前的角標最為最大值的角標max = i;}}return values[max];
}int arrayMax(int nums[], int length)
{// 1.定義一個變量, 假設為最大值
// int max = 0; // 注意: 不能假設一個不是數組中的值最為最大int max = nums[0];// 2.遍歷數組for (int i = 1; i < length; i++) {// 3.依次取出數組中每一個元素的值, 和假設的最大值進行比較// 如果數組的元素大于假設的最大值, 就讓當前元素的值作為最大值if (max < nums[i]) {max = nums[i];}}return max;
}
?
總結
- 上一篇: 线上操作与线上问题排查实战
- 下一篇: PHP对象的遍历