iOS开发之c语言基础Lesson-04 数组(Arrary) 上课笔记与习题作业

//数组, 可以快速创建多个变量, 数组本质上就是一个大容器
//数组的缺点:数组中定义的所有的变量数据类型都是相同的
//注意:1.定义数组时,数组元素个数必须是常量或者常量表达式
//2.数组所占的存储空间 = 数组元素个数 * 每个元素所在的空间大小
//3.定义数组时, 数组的元素个数是可以省略的.

//系统不会检测数组下标越界  0-(数组元素个数-1)

//
 //    //求最大,第二大, 最小
    //    int max = 0;
    //    int min = 40;
    //    int secondMax = 0;
    //    int a[7] = {0};
    //    for (int i = 0; i < 7; i++) {
    //        a[i] = arc4random() % (40-20+1)+20;
    //        printf("%d ", a[i]);
    //        if (min > a[i]) {
    //            min = a[i];
    //        }
    //        if(a[i] > max)
    //        {
    //            secondMax = max; //先把max的值给secondMax
    //            max = a[i];     //在存储当前最大值
    //        }else if (a[i] != max && a[i] > secondMax){
    //            secondMax = a[i];
    //            //第二大值存储当前值需要满足的条件:
    //            //1 当前值不能和最大值相等,
    //            //2 当前值必须大于第二大值.
    //        }
    //
    //    }
    //    printf("
最大:%d ", max );
    //    printf("
第二大:%d ", secondMax);
    //    printf("
最小:%d", min);
    //    for (int i = 0; i < 4; i++) {
    //        for (int j = i + 1; j < 5; j++) {
    //            if(a[i] > a[j])
    //            {
    //                int temp = a[i];
    //                a[i] = a[j];
    //                a[j] = temp;
    //            }
    //        }
    //    }
    //    printf("
最大:%d ", a[4]);
    //    printf("
第二大:%d ", a[3]);
    //    printf("
最小:%d", a[0]);

    ////////////////////////////////
    ///2个数组的和,放到第三个数组中
    //    int a[10] = {0};
    //    int b[10] = {0};
    //    int c[10] = {0};
    //    for (int i = 0; i < 10; i++) {
    //        a[i] = arc4random() % (40-20+1) + 20;
    //        b[i] = arc4random() % (40-20+1) + 20;
    //        c[i] =a[i] + b[i];
    //        printf("%d ", a[i]);
    //    }
    //    printf("
+");
    //    for (int i = 0; i < 10; i++) {
    //        printf("%d ", b[i]);
    //    }
    //    printf("
=");
    //    for (int i = 0; i < 10; i++) {
    //        printf("%d ", c[i]);
    //    }

    //冒泡排序思想:每趟排序都将最大的数放到右边, 右边是有序区, 左边是无序区;


    //数组a排成升序序列,  冒泡采用双层for循环

    //**外层 -1 可以不减, 减 1 的目的是为了缩短排序的趟数, 提高程序的执行效率,最后一个数的时候,就没有必要在比较了
    //**内层 -i 可以不减, 减 i 的目的是为了缩小无序的范围, 提高程序的执行效率
    //**内层 -1 必须要减, 减 1 的目的是防止比较越界,和一个不属于数组范围内的数进行比较,, 即,最后一个数与不在数组内的数比较

    //
    //    int  a[10] = {23, 24, 11, 15, 16, 25, 17, 26, 18, 10};
    //    for (int i = 0; i < 10; i++) {
    //        a[i] = arc4random() % (30 - 10 + 1) + 10;
    //        printf("%d, ", a[i]);
    //    }
    //    int num = 0, num1 = 0;
    //        for (int i = 0; i < 10 - 1; i++) {
    //            for (int j = 0; j < 10 - 1 - i; j++) {
    //                if(a[j] > a[j+1] ) {
    //                    int temp = a[j];
    //                    a[j] = a[j+1];
    //                    a[j+1] = temp;
    //                    num++;
    //                }
    //
    //            }
    //        }
    //
    //
    //        for (int i = 0; i < 10 - 1; i++) {
    //            for (int j = i + 1; j < 10; j++) {
    //                if(a[i] > a[j] ) {
    //                    int temp = a[i];
    //                    a[i] = a[j];
    //                    a[j] = temp;
    //                    num1++;
    //                }
    //
    //            }
    //        }
    //
    //        printf("
");
    //        for (int i = 0; i < 10; i++) {
    //            printf("%d ", a[i]);
    //        }
    //        printf("
");
    //        printf("num = %d, num1 = %d", num, num1);



    //随机产出20个数, 从小到大排序
    //    int b[20] = {0};
    //    for (int i = 0; i < 20; i++) {
    //        b[i] = arc4random() % (40 - 20 + 1) + 20;
    //        printf("%d, ", b[i]);
    //    }
    //
    //
    //    for (int i = 0; i < 20 - 1; i++) {
    //        for (int j = 0; j < 20 - 1 - i; j++) {
    //            if(b[j] > b[j + 1])
    //            {
    //                int temp = b[j];
    //                b[j] = b[j + 1];
    //                b[j + 1] = temp;
    //
    //            }
    //        }
    //    }
    //
    //    //    for (int i = 0; i < 20 - 1; i++) {
    //    //        for (int j = i + 1; j < 20; j++) {
    //    //            if (b[i] > b[j]) {
    //    //                int temp = b[i];
    //    //                b[i] = b[j];
    //    //                b[j] = temp;
    //    //            }
    //    //        }
    //    //    }
    //
    //    printf("
");
    //    for (int i = 0; i < 20; i++) {
    //        printf("%d ", b[i]);
    //    }


    //随机产生5个数, 从大到小排序.
    //    int a[5] = {0};
    //    for (int i = 0; i < 5; i++) {
    //        a[i] = arc4random() % (40 - 20 + 1 ) + 20;
    //        printf("%d ", a[i]);
    //    }
    //    for (int i = 0; i < 5 - 1;  i++) {
    //        for (int j = 0; j < 5 - 1 -i; j++) {
    //            if (a[j] < a[j + 1]) {
    //                int temp = a[j];
    //                a[j] = a[j + 1];
    //                a[j + 1] = temp;
    //            }
    //        }
    //    }
    //    printf("
");
    //    for (int i =0 ; i < 5; i++) {
    //        printf("%d ", a[i]);
    //    }
    //    

    ///////////////////
    //字符数组
    //char str[4] = {'a', 'b', 'c', 'd'};
    //字符串, 结束标志: '' 对应的整数值是 0
    char str[10] = "hello";
    //输出字符串格式, %s,数组名; %s的工作原理: 从第一个字符开始, 一个字符一个字符的输出,直到遇到 '' 结束
    printf("%s", str);

    /////字符数组所占的内存空间////
    //1.指定元素个数.
    char str1[10] = "iPhone";

    //unsigned long(lu),
    //sizeof() 可以用来求变量, 数组, 数据类型, 所占存储空间大小
    printf(" %lu
", sizeof(str1));
    //2.不指定元素个数, 字符串结束标志 '' 也是占存储空间
    char str2[] = "iPhone";
    printf(" %lu
", sizeof(str2));

//
//*************Lesson-04 作业*****************
//

   //1.打印数组
    //    int a[SIZE] = {0},i = 0;
    //    for(i = 0; i < SIZE; i++)
    //    {
    //        a[i] = i+10;
    //        printf("a[%d] = %d
", i, a[i]);
    //    }
    //    2. (*)将第一题中的数组a反向输出。
    //            for(i = SIZE-1;i>=0;i--)
    //            {
    //                printf("a[%d] = %d
", i, a[i]);
    //            }
    //   3. (*)对第一题中的数组进行求和操作,打印计算结果。
    //    int sum = 0;
    //    for(i = 0; i < SIZE; i++)
    //    {
    //        a[i] = i+10;
    //        sum = sum + a[i];
    //    }
    //    printf("sum = %d", sum);
    //
    ////    4. (**)计算第一题数组连减,打印计算结果。
    //
    //    int sub = 0;
    //    for(i = 0; i < 2; i++)
    //    {
    //        a[i] = i+10;
    //        sub = sub - a[i];
    //    }
    //    printf("sub = %d", sub + 2 * a[0]);

    //    5. (**)随机产生 20 个 10~50 的正整数存放到数组中,并求数组中的多有 元素最大值、最小值、平均值及各元素之和。
    //    int i = 0, max = 0, min = 50, avg = 0, sum = 0;
    //    int num[20] = {0};
    //    for(i = 0; i < 20; i++)
    //    {
    //        num[i] = arc4random()%(50-10+1)+10;
    //        printf("%d ", num[i]);
    //        sum = sum + num[i];
    //        if(num[i] > max)
    //            max = num[i];
    //
    //        if(num[i] < min)
    //            min = num[i];
    //    }
    //    avg = sum/20;
    //    printf("
 max = %d",max);
    //    printf(" min = %d", min);
    //    printf(" avg = %d", avg);
    //    printf(" sum = %d", sum);

    //    6. 编写一个程序,输入两个包含 5 个元素的数组,先将两个数组升序排序,然 后将这两个数组合并成一个升序数组。
    //
    //    int a[5] = {0}, b[5] = {0};
    //    int i = 0, j = 0, temp;
    //    printf("Input a 数组的5个元素:");
    //    for(i = 0;i < 5;i++)
    //    {
    //        scanf("%d", &a[i]);
    //    }
    //    printf("Input b 数组的5个元素:");
    //    for(i = 0;i < 5;i++)
    //    {
    //        scanf("%d", &b[i]);
    //    }
    //
    //    //利用冒泡排序,将a数组升序排序
    //    for (i = 0; i < 4; i++) {
    //        for(j = i + 1; j < 5; j++)
    //        {
    //            if(a[i] > a[j])
    //            {
    //                temp = a[i];
    //                a[i] = a[j];
    //                a[j] = temp;
    //            }
    //        }
    //    }
    //    //冒泡排序,将b数组升序排序
    //    for (i = 0; i < 4; i++) {
    //        for(j = i + 1; j < 5; j++)
    //        {
    //            if(b[i] > b[j])
    //            {
    //                temp = b[i];
    //                b[i] = b[j];
    //                b[j] = temp;
    //            }
    //        }
    //    }
    //    for (i = 0; i < 5; i++) {
    //        printf("%d ",a[i]);
    //    }
    //    printf("
");
    //    for (i = 0; i < 5; i++) {
    //        printf("%d ",b[i]);
    //    }
    //    int c[10] = {0};
    //    int k = 0;
    //    //组合新数组
    //    for(i = 0; i < 10; i++)
    //    {
    //        if(i < 5)
    //        {
    //            c[k++] = a[i];
    //        }
    //        else
    //        {
    //            c[k++]=b[i-5];
    //        }
    //    }
    //
    //    //冒泡排序,将c数组升序排序
    //    for (i = 0; i < 9; i++) {
    //        for(j = i + 1; j < 10; j++)
    //        {
    //            if(c[i] > c[j])
    //            {
    //                temp = c[i];
    //                c[i] = c[j];
    //                c[j] = temp;
    //            }
    //        }
    //    }
    //    printf("
");
    //
    //    for(k = 0; k < 10; k++)
    //    {
    //        printf("%d ", c[k]);
    //    }

    //    7. (***)给定某年某月某日,输出其为这一年的第几天。
    //    闰年:能被 4 整除, 且不能被 100 整除 或者 能被 400 整除
    //    int year = 0, mon = 0, day = 0;
    //    printf("Enter  year-mon-day:");
    //    scanf("%d-%d-%d", &year, &mon, &day);
    //
    //   //1,3,5,7,8,10,12是31天,  4,6,9,11是30天,  2月闰年29,平年28
    //    int isNonleap = 28;
    //
    //    isNonleap = ((year%4==0 && year%100!=0)||(year%400==0)) ? 29 : isNonleap;
    //
    //    int monDays[12] = {31, isNonleap, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    //
    //    int count = day;
    //    for (int i = 0; i < mon - 1;i++) {
    //        count += monDays[i];
    //
    //    }
    //printf("给定的日期是这一年的第 %d 天",count);

    // 8. (**)编写整型值数组排序程序(冒泡排序、选择排序、快速排序--升序)
    //int a[] = {3,-9,32,77,63,-24,14,0,21,45};

    //冒泡排序法
    //    for( int i = 0; i < 9; i++)
    //    {
    //        for( int j = i + 1; j < 10; j++)
    //        {
    //            if(a[i] > a[j])
    //            {
    //                int temp = a[i];
    //                a[i] = a[j];
    //                a[j] = temp;
    //            }
    //        }
    //    }
    //    for (int i = 0; i < 10; i++) {
    //        printf("%d ",a[i]);
    //    }

    //选择排序
    //    int min = 0;
    //    for(int i = 0;i < 9; i++)
    //    {
    //        min = i;//查找最小值
    //        for(int j = i + 1;j < 10;j++){
    //            if(a[min] > a[j])
    //                min = j;//交换
    //        }
    //        if(min != i)
    //        {
    //            int t = a[min];
    //            a[min] = a[i];
    //            a[i] = t;
    //        }
    //    }
    //    for (int i = 0; i < 10; i++) {
    //        printf("%d ",a[i]);
    //    }

    //快速排序
    //quicksort(a, 0, 9);
    //for (int i = 0; i < 10; i++) {
    //    printf("%d ",a[i]);
    //}

    //    9、(***)找出下列整型数组中最大和最小值及其所在位置 i。

    //            int a[] = {5,-9,32,77,64,-24,84,0,21,45};
    //            int i = 0, max = 0, min = 100, maxaddress = 0, minaddress = 0;
    //            for(i = 0; i < 10; i++)
    //            {
    //                if(a[i] > max)
    //                {
    //                    max = a[i];
    //
    //                    maxaddress = i;
    //                }
    //                if(a[i] < min)
    //                {
    //                    min = a[i];
    //                    minaddress = i;
    //                }
    //
    //            }
    //            printf("最大值%d,位置%d
最小值%d,位置%d", max, maxaddress+1, min, minaddress + 1 );


    //   10、(*)把 str1, str2, str3 合并到 result 数组中。结果:“Lanou 23_class is niu best!”
    //    char result[50] = {0};
    //    char str1[] = "Lanou ";
    //    char str2[] = "23_class ";
    //    char str3[] = " is niu best!";
    //    strcat(result, str1);
    //    strcat(result, str2);
    //    strcat(result, str3);
    //    printf("%s",result);


    return 0;
}


//快速排序  函数
void quicksort(int a[],int low,int high)
{
    int i = low;
    int j = high;
    int temp = a[i];

    if( low < high)
    {
        while(i < j)
        {
            while((a[j] >= temp) && (i < j))
            {
                j--;
            }
            a[i] = a[j];
            while((a[i] <= temp) && (i < j))
            {
                i++;
            }
            a[j]= a[i];
        }
        a[i] = temp;
        quicksort(a,low,i-1);
        quicksort(a,j+1,high);
    }
}
原文地址:https://www.cnblogs.com/zhaoashen/p/4370512.html