首页 > 代码库 > 【学习ios之路:C语言】数组.循环.语句总和运用试题练习

【学习ios之路:C语言】数组.循环.语句总和运用试题练习

1).求一个数组中的第二大值.数组中的值范围10 - 30 ,存储空间大小为10.

代码如下:

    int a[10] = {0};
    int max = 0, secMax = 0; //定义第一大值,第二大值.
    
    for (int i = 0; i< 10; i++) {
        a[i] = arc4random() %(30 - 10 + 1) + 10;//随机值 10-30
        printf("a[%d] = %d\n" ,i ,a[i]);
    }
    for (int i = 0 ; i < 10; i++) {
        if (max < a[i]) {
            secMax = max ;  //先将手中的第二大值给 secMax.然后在保存当前最大值.
            max = a[i];
        } else if (a[i] > secMax && max != a[i]) { //为了不出现 max= 30 ,sexMax =30 现象. 即  a[i] < secMax < max
            secMax = a[i];  //如果当前值比sexMax要大,比max小,则是第二大值.
        }
    }
    printf("max = %d,sexMax = %d \n" ,max ,secMax);

2.)随机产生20 个10~50的正整数存放到数组中,并求数组中的多有元素最大值、最小值、平均值及各元素之和。

代码如下:

    int m[20] = {0};
    for (int i = 0; i < 20; i++) {
        m[i] = arc4random() % (50 - 10 + 1) + 10;
        printf("%d\n", m[i]);
    }
    int max = 0, min = 0 , sum = 0; float avg = 0;
    
    //最大值
    for (int i = 0; i < 20; i++) {
        if (max < m[i]) {
            max = m[i];
        }
    }
    printf("max = %d\n", max);
    
    //最小值
    for (int i = 0; i < 20; i++) {
        if ( i == 0) {
           min = m[i];
        } else {
            if (min > m[i]) {
                min = m[i];
            }
        }
    }
    printf("min = %d\n", min);
    
    //和
    for (int i = 0; i < 20; i++) {
        sum += m[i];
    }
    printf("sum = %d\n", sum);
    
    //平均数
    avg = sum / 20;
    printf("avg = %.2f\n",avg);

 

3).将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的(归并排序)。

    //定义两个数组m,n
    int m[10] = {0};
    int n[10] = {0};
    
    //给数组赋值,随机值范围[20,40]之间
    for (int i = 0; i < 10; i++) {
         m[i] = arc4random() % (40 - 20 + 1) + 20;
         n[i] = arc4random() % (40 - 20 + 1) + 20;
    }
    //对数组m升序排列
    for (int i = 0; i < 10 - 1; i++) {
        for (int j = 0; j < 10 - i - 1; j++) {
            if (m[j] > m[j+1]) {
                int temp = m[j];
                m[j] = m[j+1];
                m[j+1] = temp;
            }
        }
    }
     //对数组n升序排列
    for (int  i = 0; i < 10 - 1; i++) {
        for (int j = 0; j < 10 - i - 1; j++) {
            if (n[j] > n[j+1]) {
                int temp = n[j];
                n[j] = n[j+1];
                n[j+1] = temp;
            }
        }
    }
      //排序后打印结果
    for (int i = 0; i < 10 ; i++) {
        printf("m[%d] = %d,n[%d] = %d \n", i, m[i], i, n[i]);
    }     int c[10] ={0};//定义第三个数组.两个数组合并.归并排序    int k = 0, i = 0, j = 0;    while (i < 10 && j < 10 ) {        if (a[i] < b[j]) {            c[k++] = a[i++];        } else {            c[k++] = b[j++];        }    }    while(i < 10){        c[k++] = a[i++];    }    while (j < 10) {         c[k++] = b[j++];    }    for (int i = 0; i< 10; i++) {    printf("%d\n",c[i]); //输出结果    }

 

4).在一个已知的字符串中,查找最长单词,并且输出最长单词.

    char str[] =  "name is a mk fuckd is fucshish";
    int len = 0;//存储当前单词的长度
    int max = 0;//存储最长单词的长度
    int maxIndex = 0;//存储最长单词的位置
    
    int i = 0;//循环变量初始值
    while (str[i] != '\0') {
        if (str[i] != ' ') {
              //如果去到的字符不是空格
            len++;
        } else {
             //获取到的是字符是空格.
            if (len > max) {
                max = len;
                maxIndex = i - len;
            }
            len = 0;//将单词长度清零,计算新的单词.
        }
        i++;
    }
    //如果最后一个单词是最长单词,不会遇到空格,则不会和maxLength 比较.所以我们只需要在循环外部比较一次即可.
    if (len > max) {
        max = len;
        maxIndex = i - len;
    }
    
    for (int i = maxIndex; i < maxIndex + max ; i++) {
        printf("%c",str[i]);//最长单词
    }

5).耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,最后留在圈子内的人就是出卖耶稣的叛徒。请找出它原来的序号。


       思路:
         1.如何描述13个人? 定义数组
         2.如何报数? 定义变量 count记录报数
         3.一旦报数为3,做什么处理?
         4.如何剔除一个人? 将该元素置0
         5.表示当前或者的人数? 定义变量number;
         6.因为不确定循环次数,用whlie循环 循环条件 number > 1
         7.如何循环报数?  如果 i = 13 ,就转到第一个人继续报数.

  代码如下:

    int arr[13] ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
    int count = 0, number = 13,i = 0 ;
    
    while (number > 1) {
        if (arr[i] != 0) {
            count++;
        if (count == 3) {
                arr[i] = 0;
                number--;
                count = 0;
            }
        }
         i++;
    if (i == 13) { //下标
            i = 0;//及第一个个人
        }
       
    }
    
    //对数组遍历,找到活着的人
    for ( int i = 0; i < 13; i++) {
        if (arr[i] != 0) {
            printf("当前活着的人:%d\n",arr[i]);
        }
    }


6),有1000000个数,每个数取值范围是0-999999找出其中重复的数,重复次数。

     
    int n[1000000];
    for (int i = 0; i < 1000000; i++) {
        //随机产生1000000个数,范围0-999999
        n[i] = arc4random() % 999999 ;
        printf("%d ", n[i]);
    }
     printf("\n");
    int count = 0; int temp = 0;
    for (int i = 0; i < 1000000; i++) {
             count = 0;
        for (int j = i; j < 1000000  ; j++) {
            if (n[i] == n[j] && i != j && n[i] != -1) {
                count++;
                temp = n[i];
                n[j] =  -1;
            }
        }
        n[i] = -1;
        if (count > 0) {
            printf("重复数为:%d,重复次数为:%d\n",temp,count);
        }
    }


【学习ios之路:C语言】数组.循环.语句总和运用试题练习