C语言入门(十一)之数组与函数、排序查找初次接触

版权声明:如果觉得文章对你有用,转载不需要联系作者,但请注明出处 https://blog.csdn.net/jinxin70/article/details/83244354

数组名作为函数的参数传递, 传递的是数组的地址。

因为数组名就是数组的地址 &number = &number[0] == number。

如果数组作为函数的形参, 元素的个数可以省略。

void change2(int values[2]);

void change2(int values[]);//数组作为形参可以省略元素个数
void change2(int values[])
{
    values[0] = 99;
}
int main(int argc, const char * argv[]) {
    
    int nums[2] = {1, 5};

    change2(nums); // 相当于传递了数组的地址
    printf("nums[0] = %i\n", nums[0]);
    return 0;
}

练习

1、定义一个函数, 实现遍历数组

#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));
    
    // 1.动态计算数组的元素个数
//    int length = sizeof(values) / sizeof(values[0]);
    // 2.遍历数组
    for (int i = 0; i < length; i++) {
        printf("values[%i] = %i\n", i,values[i]);
    }
}

2、设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值

#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 max =  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;
}

3、从键盘输入3个0~9的数字,然后输出0~9中哪些数字没有出现过(桶排序)

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // 从键盘输入3个0~9的数字,然后输出0~9中哪些数字没有出现过
    // 从键盘输入100个0~2000的数字,然后输出0~2000中哪些数字没有出现过
    /*
     输入: 1, 3 ,5
     输出: 0, 2, 4, , 6, 7, 8, 9
     */
    /*
    // 1.接收用户输入的数据
    int num1, num2, num3;
    printf("输入三个整数, 用逗号隔开\n");
    scanf("%i,%i,%i", &num1, &num2, &num3);
    
    // 2.遍历打印0~9
    for (int i = 0; i <= 9; i++) {
        // 3.判断当前打印的值是否是用户输入的值, 如果是就不打印
        if (num1 != i &&
            num2 != i &&
            num3 != i) {
            
            printf("%i\n", i);
        }
    }
     */
    
    // 空间换时间
    // 1.定义数组保存所有用户输入的数
    int nums[10] = {0};
    // 2.接收用户输入的数据
    int value = -1;
    for (int i = 0; i < 3; i++) {
        printf("请输入%i个整数\n", i+1);
        scanf("%i", &value);
        nums[value] = 1;
    }
    
    for (int i = 0; i < 10; i++) {
//        printf("nums[%i] = %i\n", i , nums[i]);
        if (nums[i] != 1) {
            printf("%i\n", i);
        }
    }
    
    return 0;
}

4、从键盘输入6个0~9的数字,排序后输出(桶排序)

#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 == 1
            printf("%i\n", i); // 1, 1, 2, 3, 3, 6
        }
    }
    
    return 0;
}

5、选择排序

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // 已知一个无序的数组, 里面有8个元素, 要求对数组进行排序
    int nums[8] = {99, 12, 88, 34, 5, 44, 12, 100};

    int length = sizeof(nums) / sizeof(nums[0]);
    printf("length = %i\n", length);
    for (int i = 0; i < length; i++) {
        printf("nums[%i] = %i\n", i, nums[i]);
    }
    
    // length - 1是为了防止角标越界
    // length - 1因为最后一个元素已经没有可以比较的了
    // 0, 1, 2, 3, 4
    for (int i = 0; i < length - 1; i++) {
        for (int j = i+1; j < length; j++) {
            if (nums[i] > nums[j]) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }
        }
    }
    
    printf("--------------\n");
    for (int i = 0; i < length; i++) {
        printf("nums[%i] = %i\n", i, nums[i]);
    }
    
    return 0;
}

6、冒泡排序

#include <stdio.h>

int main(int argc, const char * argv[]) {
    /*
     思路: 
     1.先分析如何比较
     2.找出比较的规律比较完一次之后第二次比较会少一次
     3.打印倒三角
     4.打印需要比较的角标
     5.比较并交换位置
     6.将常量替换为变量(length)
     */
    // 已知一个无序的数组, 里面有5个元素, 要求对数组进行排序
    int nums[6] = {99, 12, 88, 34, 5, 7};
    int length = sizeof(nums) / sizeof(nums[0]);
    for (int i = 0; i < length; i++) {
        printf("nums[%i] = %i\n", i, nums[i]);
    }
    for (int i = 0; i < length - 1; i++) {
        for (int j = 0; j < length - 1 - i; j++) {
//            printf("*");
//            printf("%i == %i\n", j, j+1);
            if (nums[j] > nums[j + 1]) {
                int temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
            }
        }
//        printf("\n");
    }
    printf("----------\n");
    for (int i = 0; i < length; i++) {
        printf("nums[%i] = %i\n", i, nums[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jinxin70/article/details/83244354