c语言,数组的一道程序题

img

这应该是从a0 开始算还是从 a1 开始算呢,我觉着应该是从a0开始算的呀,因为++在后面不嘛,但是我搜的答案是从a1开始算的😭

从1开始算,因为执行到 a[i] 的时候 ++ 了
只是条件判断的时候从0-6(循环里i是1-7)

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7672520
  • 这篇博客你也可以参考下:编写程序,将用户输入的字符串中的所有的字符 a 用指定字符作代替,然后输出
  • 除此之外, 这篇博客: 4.1 C语言练习(计算车辆行驶的总距离;将字符常量‘A’赋给字符变量的四种方法;大写字母转换成小写字母)中的 【解法一】 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
    
    int main()
    {
    	char c1, c2, c3, c4;
    	
    	c1 = 'A';
    	c2 = 'B';
    	c3 = c1 + 32;
    	c4 = c2 + 32;
    	
    	printf("The capital letter: %-3c  %-3c\n",c1,c2);
    	printf("  Lowercase letter: %-3c  %-3c\n",c3,c4);
    
    	return 0;
    } 
    

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    从C语言的角度来看,数组的下标是从0开始的,因此应该从a[0]开始算。数组名代表数组的首地址,所以指向数组的指针也是指向数组的第一个元素的地址。在C语言中,数组名可以看做是指针变量,其指向数组的第一个元素,而不是数组中的第0个元素。

    对于题目中的代码,通过输入9个数,最终将一个数插入到这些数构成的升序数组中并保证数组依旧是升序的。其中,p为指向a[0]的指针,所以指针的自增操作是在a[0]、a[1]、a[2]...a[8]中依次移动。插入操作依次比较b和每个数的大小,找到b应该插入的位置,然后向后移动数组中的数,最终在b应该插入的位置插入b。下面是这段代码的注释和展示:

    #include <stdio.h>
    int main()
    {
        int a[10], b = 0, i = 0, *p = a; // 定义数组a、输入数b、循环计数器i和指向数组a[0]的指针p
        for (i = 0; i < 9; i++) // 输入9个数并存入数组a中
            scanf("%d", p++);
        scanf("%d", &b); // 输入待插入的数b
        p--; // 指针自减操作,使指针重新指向a[8]
        while (b < *p) // 在数组a中查找b应该插入的位置
            *(p + 1) = *p--; // 向后移动数组元素
        *(p + 1) = b; // 将b插入到指定位置
        for (i = 0; i < 10; i++) // 输出数组a
            printf("%d ", a[i]);
        return 0;
    }
    

    对于题目中的排序问题,可以使用快排或归并排序等算法进行解答。下面是一个简单的插入排序的例子,先输入n和n个整数,然后将一个新的数插入到这些整数中,最后输出新的序列。其中,动态分配内存使用malloc函数,排序部分使用两重循环,递增顺序遍历已有序列,找到第一个比待插入数大的位置,然后向后移动已有序列,最后在指定位置插入待排序数。在排序部分,通过申请数组的大小来创建待排序的数组,不改变原数组的大小,不需要在函数中修改其大小,也不会在函数执行后释放空间。下面是这段代码的注释和展示:

    #include <stdio.h>
    
    #define maxSize 100
    
    void sort(int* x, int n){ // 选择一种排序算法,例如插入排序
        for (int i = 0; i < n; i++){
            for (int j = 1+i; j < n; j++){
                if (x[i] < x[j]){
                    int temp = x[i];
                    x[i] = x[j];
                    x[j] = temp;
                }
            }
        }
    }
    
    int main(){
        int n = 0; // 数组大小
        scanf("%d", &n); // 输入数组大小
        int *x = (int*)malloc(n * sizeof(int)); // 动态分配n个整数的内存
        int i = 0;
        for (i = 0; i < n; i++) // 输入n个整数
            scanf("%d", &x[i]);
        int num = 0;
        scanf("%d", &num); // 输入待插入数字
        x = (int*)realloc(x, (n+1)*sizeof(int)); // 插入数字后大小加1,再次动态分配内存
        x[i] = num; // 插入数字
        sort(x, n+1); // 对新数组进行排序
        for (i = 0; i < n+1; i++) // 输出新数组
            printf("%d ", x[i]);
        return 0;
    }
    

    可以看到,在这个代码中,数组下标是从0开始的,因此x[0]代表数组的第一个元素,x[n-1]代表数组的最后一个元素。代码中采用了动态内存分配的方式,可以根据需要随时增加或减少内存。插入新数字后,通过选择排序算法对新数组进行排序,最终输出新数组。

    因此,对于C语言数组问题,需要注意数组的下标是从0开始的,而数组名可以看成指向数组的指针,指向数组的第一个元素。可以使用动态分配内存的方式创建数组,并且可以使用排序算法对数组进行排序。