注册 登录
编程论坛 C语言论坛

向排好序的数组中插入一个数字

wuxiami 发布于 2022-08-04 11:42, 1046 次点击

#include<stdio.h>

void main()
{
    int a[10];
    int i, j, x;
    printf("输入此数组");
    for (i = 0; i < 10; i++)
    {
        scanf_s("%d", &a[i]);
    }

     
    // for(i=0;i<10;i++)
    if (a[1]<a[2]);
    {
        printf("小到大排序");
    }
      if (a[1] > a[2])
    {
        
        printf("大到小排序");
    }

     
    printf("输入插入的数字");
    scanf_s("%d", &x);
    for (i = 0; i < 10; i++)
        if (a[i] > x)
        {
            break;
        }
    for (j = 9; j >= i; j--)
    {
        a[j + 1] = a[j];
    }
    a[i] = x;
    printf("插入后的数组为:");
    for (i = 0; i <= 10; i++)
        printf("%d     ", a[i]);
}
这个判断排好序的数组的排序顺序,   并按原有大到小或小到大规律在其中插入一个数字  
中间的判断始终达不到预想的效果    而且插入数字也只是可以实现小到大排序
大佬们  求解
4 回复
#2
rjsp2022-08-04 15:35
中间的判断始终达不到预想的效果
什么是你“预想的效果”,为什么要让别人猜,而不肯明确说出来呢?

而且插入数字也只是可以实现小到大排序
语言描述没这么复杂,你就告诉大家你 输入了什么,输出了什么,期待输出什么 就行了

程序代码:
#define _CRT_SECURE_NO_WARNINGS // 仅VC++需要定义这个累赘才能使得VC++符合标准规定
#include <stdio.h>
#include <stdbool.h>

int main( void )
{
    int a[10+1]; // 输入10个数,再插入1个,所以共11个
    printf( "输入10个元素的数组: " );
    for( size_t i=0; i!=10; ++i )
        scanf( "%d", &a[i] ); // 判断输入成功与否?你源代码中没写,那我也就略过

   
// 是不是有序数组?你源代码中没写,那我也就略过

   
// true:升序, false:降序
    bool asc = a[0]<=a[9]; // 我不明白你原代码中为什么用第二个数与第三个数相比,并且也不考虑第二个数与第三个数相等的情况。想不懂,我就不想了
    puts( asc ? "升序" : "降序" );

    int x;
    printf( "输入待插入的数字: " );
    scanf( "%d", &x );

    size_t index;
    if( asc )
        for( index=0; index!=10 && a[index]<=x; ++index );
    else
        for( index=0; index!=10 && a[index]>=x; ++index );

    for( size_t i=10; i!=index; --i )
        a[i] = a[i-1];
    a[index] = x;

    printf( "插入后的数组为: " );
    for( size_t i=0; i!=11; ++i )
        printf( "%d%c", a[i], " \n"[i==10] );
}
#3
wuxiami2022-08-04 17:33
回复 2楼 rjsp
多谢大佬
#4
chenyucheng2022-08-09 08:19
回复 2楼 rjsp
#define _CRT_SECURE_NO_WARNINGS // 仅VC++需要定义这个累赘才能使得VC++符合标准规定

什么意思?
#5
rjsp2022-08-09 09:05
按照标准,#include <stdio.h> 之后就可以使用 scanf/printf 等标准库函数,
但在VC中,需要在 #include <stdio.h> 之前定义 #define _CRT_SECURE_NO_WARNINGS 才可以使用 scanf/printf 等标准库函数。

------ 回答完毕 ------

VC认为 scanf/printf 等标准库函数不安全,于是搞了 scanf_s/printf_s 等私有函数,并且不让用 scanf/printf 等标准库函数。
后来VC说要支持C语言(说来话长,虽然之前的VC也能编译C,但VC其实是不支持C语言的,微软每年都要多次向公众重申VC不支持C语言),于是与C语言标准委员会有了一段蜜月期。
在这段蜜月期中,MS厚颜无耻地向标准委员会提交了 scanf_s/printf_s 等函数,标准委员会忍住恶心接受了它们,但这些函数实在粗劣,于是标准委员会帮它进行了完善后,作为可选附件进入了标准,名叫“Annex K”。
……,懒得把这些黑历史再讲下去了,我只总结一下现状吧:
a. 标准有个“Annex K”,但只是“可选”,而且没有任何一个编译器支持它。
b. VC 不支持 Annex K,VC 用的仍然是自己那套粗陋不堪,与标准不一致的东西
c. 其它所有编译器(严格来讲是库) 也不支持 Annex K。gcc/clang 都公开嘲笑过这些垃圾函数
1