编程,C语言,希望可以有人帮一下

img


编写程序:从10个元素的整型数组中删除下标为 k的元素
(k由用户输入)。
提示:从第k+1个元素到最后一个元素依次向前移动。

    for (int i = k; i < 9; i++) {
        arr[i] = arr[i + 1];
    }

从下标为k的元素开始,逐个将下一个往前移,下标为k的被覆盖。
如需完整可执行程序请评论说明

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7469950
  • 这篇博客你也可以参考下:[C语言实现]给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
  • 除此之外, 这篇博客: 【C语言】实现一个函数,可以左旋字符串中的K个字符中的 解法一: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 解题思路:

    拿到一组字符串之后,我们首先设置一个临时变量,存放字符串中的第一个字符。
    然后把字符串中的其余字符通过循环依次前移一位,最后再把临时变量的值赋给字符串的最后的一位。

    以上是字符串的一次左旋,要左旋几次就可以通过循环重复以上过程几次就可以了。

    图解如下所示:

    这里写图片描述

    程序源码:

    #include<iostream>
    #include<assert.h>
    #include<stdio.h>
    #include<Windows.h>
    
    using namespace std;
    
    void string_reverse(char* arr, int len){
        assert(arr);
        assert(len > 0);
        char temp;
        temp = arr[0];
        for (int i = 0; i < len - 1; ++i){
            arr[i] = arr[i + 1];
        }
        arr[len - 1] = temp;
    }
    
    void Print(char* arr, int len){
        for (int i = 0; i < len; ++i){
            cout << arr[i] << "   ";
        }
        cout << endl;
    }
    
    void test(){
        char arr[] = { 'A', 'B', 'C', 'D', '1', '2', '3', '4' };
        //这里用数组来表示字符串,如果用字符串来表示字符串会产生一个错误
        //char *arr = "ABCD1234";
        int count = 0;
        int len = 0;
        len = sizeof(arr) / sizeof(arr[0]);
        //len = strlen(arr);
        Print(arr, len);
        cout << "请输入要左旋的次数:>" << endl;
        cin >> count;
        count %= len;
        while (count--){
            string_reverse(arr, len);
        }
        Print(arr, len);
    }
    
    int main(){
        test();
        system("pause");
        return 0;
    }

    程序运行结果:

    这里写图片描述

    【注意】

    如果向程序中所标注的直接用字符串来表示的话,会造成以下后果:

    这里写图片描述

    原因:

    我们先来看一个内存分配示意图:
    这里写图片描述

    假如现在执行以下代码:

       int a,b,c,d;
       a=0;
       b=1;
       c=2;
       d=3;

    这里写图片描述

    则a的地址最高,d的地址最低,因为这是一个压栈的过程。

    这里写图片描述

    但是如果执行以下语句的话:

    char arr[] = { 'A', 'B', 'C', 'D', '1', '2', '3', '4' };

    内存分配如图所示:

    这里写图片描述

    这时我们可以发现数组内存放的数据的地址是依次增加的,也就是说开始的元素地址最小,结束的元素地址最大。这是为什么呢?

    原来数组在申请内存的时候不是为他的元素一个个申请内存,而是一次性的把数组所需要的内存申请好,再依次存放数组元素。

    而如果我们在代码中用的是以字符串的形式的话,就会造成问题了:

    char *arr = "ABCD1234";

    这里写图片描述


  • 您还可以看一下 李飞老师的C语言开发之数据结构与算法四课程中的 查找无序数组中第K大元素小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    我会解决该问题。

    解题思路: 1. 用户指定删除的下标k; 2. 把第k+1个元素到最后一个元素逐次向前移动,即 从a[k+1]开始到a[9],把每个元素向前都移动一位,变成a[k]到a[8]; 3. 再输出 a[0]到a[8]的元素。

    代码如下:

    #include<stdio.h>
    int main(){
        int a[10], i, k;
        printf("请向数组中输入数据:\n");
        for(i=0; i<10; i++){
            scanf("%d", &a[i]);
        }
        printf("请输入要删除的下标k:\n");
        scanf("%d", &k);
        for(i=k; i<9; i++){
            a[i] = a[i+1];
        }
        printf("删除k后的数组为:\n");
        for(i=0; i<9; i++){
            printf("%d,", a[i]);
        }
        // 注意最后一个元素后没有逗号
        printf("%d", a[i]);
        return 0;
    }
    

供参考:

#include <stdio.h>
#define N 10
int main()
{
    int a[N], n, i, k;
    scanf("%d", &n);        // 输入数组长度
    for (i = 0; i < n; i++) // 输入数组元素
        scanf("%d", &a[i]);
    do {
        printf("输入待删除元素下标(0 =< k < %d):",n);
        scanf("%d", &k);        //输入待删除元素下标 
    } while (k < 0 || k > n - 1);

    for (i = k; i < n - 1; i++)//删除下标为 k 的元素
        a[i] = a[i + 1];
    n--;
    for (i = 0; i < n; i++)//输出删除元素后的数组
        printf("%d ", a[i]);
    return 0;
}