Skip to content

Latest commit

 

History

History
314 lines (240 loc) · 5.68 KB

l_02.md

File metadata and controls

314 lines (240 loc) · 5.68 KB

Lesson 2



1. 一维数组 二维数组

  • 数组的定义 变量类型 数组名称[数组长度];

[] 内为常量 在C99标准可放入变量
定义数组后再改变n的值后 数组长度不改变
但是无论如何,数组长度必须确定

int arr1[10];
int n=10;
int arr2[n];
n++; // arr2 的长度仍为10

数组内所有元素的变量地址是连续的

  • 数组的赋值

    • 将数组内元素按顺序赋值
      int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    • arr[1] 元素赋值为2
      int arr[1] = 2;
    • 自动推断数组长度 []内不写长度 长度由{}内值的个数决定
      int arr[] = {1,2,3,4,5};
  • 访问数组 数组下标从 0 开始到 n-1
    不可以越界访问数组

    int arr[10];
    arr[10] = 1; //编译通过 但是很危险
  • 二维数组的定义 变量类型 数组名[行数][列数];

    int arr[5][5];
    arr[1][2] = 2; //将第2行第3列的元素赋值为2
    arr[5][5] 0 1 2 3 4
    0
    1 2
    2
    3
    4

    最直观

    int arr[3][3] = {{1,2,3},
                     {4,5,6},
                     {7,8,9}};

    变量类型 数组名[行数][列数]={数据1,数据2,数据3,数据4...};

    int arr[2][3] = {1, 2, 3, 4, 5, 6}; 

    变量类型 数组名[][列数]={数据1,数据2,数据3,数据4...}; 可以省略行数,不可省略列数

    int arr[][3] = {1, 2, 3, 4, 5, 6}; 
  • 通过嵌套循环遍历二维数组

    for (int i = 0; i < 2; i++) {
      for (int j = 0; j < 3; j++){
        printf("%d ", arr[i][j]);
      }
      printf("\n");
    }
  • 数组名的意义

    • 数组名存储数组首地址

      int arr[10];
      printf("%p", arr);
    • sizeof 关键字求数组长度

      int arr[10];
      int length = sizeof(arr) / sizeof(arr[0]);
      // or
      int length = sizeof(arr) / sizeof(int);
      printf("%d", length);

2. 函数的定义和调用 & 函数的常见样式

返回值类型 函数名(参数类型 参数名){
  code;
  return 返回值;
}
  • 函数名驼峰命名法则

    void iAmAFunction(int a);
  • 无参无返

    void function(){
      printf("this is a function\n"); 
      return; //返回值为void时 return;可以不写
    }
  • 有参无返

    void function(int a) {
      printf("this is a function\n");
      printf("a = %d\n", a);
    }
  • 无参有返

    int function() {
      printf("this is a function\n");
      return 1000;
    }
    
    int main() {
      printf("%d", function());
      return 0;
    }
  • 有参有返

    int function(int a) {
      printf("this is a function\n");
      return a;
      }
    
    int main() {
      printf("%d", function(100));
      return 0;
    }

3. 值传递

当值传递时,函数的形参发生改变,并不会影响实参

原因:实参和形参的内存是分别单独开辟

//定义函数 实现两个数字进行交换函数
void swap(int num1, int num2) {
   printf("before:\n");
   printf("a = %d\n", a);
   printf("b = %d\n", b);

   int tmp = num1;
   num1 = num2;
   num2 = tmp;

   printf("after:\n");
   printf("a = %d\n", a);
   printf("b = %d\n", b);

   // return:返回值不需要的时候,可以不写return
}

int main() {
   int a = 10;
   int b = 20;

   printf("a = %d\n", a);
   printf("b = %d\n", b);

   swap(a, b); // 执行时未改变a b的值

   printf("a = %d\n", a); // 10
   printf("b = %d\n", b); // 20

   return 0;
}

4. 函数的声明

提前告诉编译器函数的存在,可以利用函数的声明
定义在main函数前可以不写声明
声明可以写多次,定义只能写一次

int max(int a, int b);

int main()
{
    int a = 10;
    int b = 20;
    printf("%d", max(a, b));

    return 0;
}

//比较函数,实现两个整型数字进行比较,返回较大的值
int max(int a, int b) //定义
{
    return a > b ? a : b;
}

案例1 五只小猪称体重

给定五只小猪的体重,利用一维数组存储,经过循环比较后,输出最大和最小体重。

input

300 350 200 400 250

output

max = 350, min = 200

//code

案例2 排序算法

  • 冒泡排序
int arr[9] = {4, 2, 8, 0, 5, 7, 1, 3, 9};

//开始冒泡排序 升序排列
//总共排序轮数为 元素个数-1
for (int i = 0; i < 8; i++) {
   //内层循环对比次数=元素个数-当前轮数-1
   for (int j = 0; j < 8 - i; j++) {
      //如果第一个数字大于第二个数字,交换
      if (arr[j] > arr[j + 1]) {
         int tmp = arr[j];
         arr[j] = arr[j + 1];
         arr[j + 1] = tmp;
      }
   }
}

//循环遍历数组
for (int i = 0; i < 9; i++) {
   printf("%d", arr[i]);
}

案例3 二维数组

已知三人三次考试成绩,利用二维数组存储成绩,并输出每人考试总分,平均分。

example

int arr[3][3] = {{100, 100, 100},
                  {90, 50, 100},
                  {60, 70, 80}};
int name[3] = {1, 2, 3}

output

1: sum = 300, ave = 100
2: sum = 240, ave = 180
3: sum = 210, ave = 70

//code