解题思路:
详情请看代码注释
注意事项:
1、本程序不对序列全部元素相等的情况做处理,没意义。
2、输入序列的排序情况不清楚,程序需要判断。
3、待插入数据的插入位置有三个地方,分开处理
a:序列头部
b:序列中部
c:序列尾部
4、题目中明确要求在第二行输入待插入元素,所以必须处理第一行输入的超出部分,本程序会丢弃超出数据,并在下一行获取待插入元素。
5、输入序列排序错误会导致本程序最终结果错误。
参考代码:
#include<stdio.h> #include<stdlib.h> int main() { int i, j, x, n=0; /*本程序不对序列全部元素相等的情况做处理,所以为了避免此情况下程序结果输出随机值,特地对数组初始化.此情况下程序结果错误*/ int a[10] = {0,0,0,0,0,0,0,0,0,0}; for(i = 0; i < 9; i++) { scanf("%d", &a[i]); } /*输入的元素个数超过9个时,超出元素被抛弃,待插入元素必须另起一行输入*/ while(getchar() != '\n') continue; scanf("%d", &x); /*因为已经排序好的序列只有9个元素,我们只需要拿出前8个元素和紧邻它后面的元素做比较就能判断出序列的排序情况*/ for(i=0; i<8; i++) { if(a[i] != a[i+1] && a[i] > a[i+1]) //从大到小排序 { for(i = 0; i < 8; i++) //开始找位置 { if(x >= a[0]) //处理 x 比序列中最大的元素还大的情况 { n = 0; for(j = 9; j > 0; j--) { a[j] = a[j-1]; } i = 10; //已经完成工作,设置 i 使 for 循环结束(本程序中不小于 8 即可) } else if(x <= a[8]) //处理 x 比序列中最小的元素还小的情况 { n = 9; i = 10; //已经完成工作,设置 i 使 for 循环结束(本程序中不小于 8 即可) } else if(a[i] >= x && x >= a[i+1]) //找到插入位置 i+1 { n = i+1; //保存插入位置 for(j = 9; j > i; j--) //开始将插入位置之后的数据往后移动一位 { a[j] = a[j-1]; } i = 10; //已经完成工作,设置 i 使 for 循环结束(本程序中不小于 8 即可) } } } else if(a[i] != a[i+1] && a[i] < a[i+1]) //从小到大排序 { for(i=0; i<8; i++) { if(x >= a[8]) //处理 x 比序列中最大的元素还大的情况 { n = 9; i = 10; //已经完成工作,设置 i 使 for 循环结束(本程序中不小于 8 即可) } else if(x <= a[0]) //处理 x 比序列中最小的元素还小的情况 { n = 0; for(j = 9; j > 0; j--) { a[j] = a[j-1]; } i = 10; //已经完成工作,设置 i 使 for 循环结束(本程序中不小于 8 即可) } else if(a[i] <= x && x <= a[i+1]) { n = i+1; for(j = 9; j > i; j--) //开始将插入位置之后的数据往后移动一位 { a[j] = a[j-1]; } i = 10; //已经完成工作,设置 i 使 for 循环结束(本程序中不小于 8 即可) } } } } a[n] = x; for(i=0; i<10; i++) { printf("%d\n", a[i]); } return 0; }
0.0分
97 人评分
#include <stdio.h> int main() { int a[9] = { 0 }; int b[10] = { 0 }; int i, j; for (i = 0; i < 9; i++) { scanf("%d", &a[i]); } int n; scanf("%d", &n); for (i = 0; i < 9; i++) { if (n < a[i]) { j = i; //记录大于n的第一个元素的下标 break; } } for (i = 0; i < 9; i++) { if (i < j) b[i] = a[i]; else if (i == j) { b[i] = n; b[i + 1] = a[i]; } else b[i + 1] = a[i]; } for (i = 0; i < 10; i++) { printf("%d\n", b[i]); } return 0; }
可以直接拿一个全新数组 全部放进去 重新排序啊 逻辑好理解。嘻嘻嘻 #include"stdio.h" int main() { int arr[9]; int num=0; int temp = 0; for(int i=0;i<9;i++) { scanf("%d",&arr[i]); } scanf("%d",&num); int arr_1[10]; for(int i = 0;i< 10 ;i++) { arr_1[i]=arr[i]; arr_1[9] =num; } for(int i =0;i<10;i++) { for(int j = i+1;j<10;j++) { if(arr_1[i]>arr_1[j]) { temp =arr_1[j]; arr_1[j] = arr_1[i]; arr_1[i] =temp; } } } for(int i = 0;i<10;i++) { printf("%d\n",arr_1[i]); } return 0; }
bonfirelit 2020-03-01 11:38:31 |
第二个for循环里的arr数组越界了吧
半途而废柴 2020-03-04 22:26:13 |
你这没对呀!根本输不出来呢
袁浩然 2020-03-08 17:45:09 |
@btefc 我这边能运行啊 系统判断也是正确的
袁浩然 2020-03-08 17:46:59 |
@bloodborn 能说清楚一点嘛?
半途而废柴 2020-03-09 20:29:32 |
@yuanhaoran for(int i = 0;i< 10 ;i++) { arr_1[i]=arr[i];arr_1[9] =num; }这个当i=9时,i<10成立,继续执行语句,arr_[9]=arr[9];下面在执行arr_[9]=num;对吗?我觉得不对呀 !
袁浩然 2020-03-10 12:04:26 |
@btefc 你看一下啊,我没加注释:是这样的,当i=9,确实是在循环里面,但是num的值是我们添加进去的数值,且arr【9】是十个数字组成数组的最后一个数值啊。
半途而废柴 2020-03-10 20:11:43 |
@yuanhaoran 我验证了,你说的对的,
袁浩然 2020-03-11 13:11:13 |
@btefc OK 明白就好 我还以为我讲不清楚 下一次 我发 绝对会备注好
半途而废柴 2020-03-13 22:15:33 |
我觉得你挺厉害的,想拜你为师呢!
袁浩然 2020-03-14 15:40:05 |
@btefc 哈哈哈哈 一起进步一起进步
半途而废柴 2020-03-14 19:34:19 |
没有学习方法,很是难受啊。需要高人指点指点学习方法。
#include <stdio.h> #include <stdlib.h> int main(void){ int num[10]={0}; int i,x,pos; for(i=0;i<9;i++) scanf("%d",&num[i]); scanf("%d",&x); for(i=0;i<8;i++) if(num[i-1]<x && num[i]>x) pos = i; for(i=9;i>pos;i--) num[i] = num[i-1]; num[pos] = x; for(i=0;i<10;i++) printf("%d\n",num[i]); system("pause"); return 0; } 这个怎么老是提示错误50%啊
# include <stdio.h> int main(){ int a[10]; int i, t, k, l; int z = 1; for(i = 0; i < 10; i++) scanf("%d", a[i]); for(i = 0; i < 10; i++){ //这里i <10 或者i <9无区别 if(a[i] > a[9] && z==1){ t = a[9]; a[9] = a[i]; a[i] = t; z = 0; for(k = 9; k > i + 1; k--){ if(a[k] < a[k - 1]){ l = a[k]; a[k] = a[k - 1]; a[k - 1] = l; } } } } for(i = 0; i < 10; i++) printf("%d\n", a[i]); return 0; } 求大佬解释
//我这个简单一点 //只要多设置一个变量 跟元素比较大小 判断成立 直接插入输出就行 //题目要求插入 所以没有写插入的数是最大或最小的结果 //也没有判断大到小排的 能通过验证 正确 #include<stdio.h> int main() { int x,k,z=1,dd[10]; // 设置变量 和储存10个数的数组 for(k=0;k<9;k++) { scanf("%d ",&dd[k]); // 循环输入准备插入 数字的第一行 } scanf("%d",&x); // 输入要插入的数字 用变量 x储存 for(k=0;k<9;k++) { if(x<dd[k]&&z==1) // 判断 数组中后一个元素的值是否比 x 大 { printf("%d \n",x);//后一个元素的值比x大就是插入的位置 z=0; // 改变 z 的值 使判断不再重复进入 } printf("%d \n",dd[k]); // 输出输入时第一行元素的值 直到判断成立 插入 } return 0; }
zky123456 2019-12-13 14:43:37 |
可以不增加z值判断这一部分吗?
雷和兴的爸爸 2019-12-21 19:19:51 |
开关设置的真巧妙
大王叫我来巡山 2019-12-28 13:36:38 |
巧妙
机器不学习 2020-02-17 19:43:57 |
是不是没有考虑 x比数组里面的数字都大的情况
机器不学习 2020-02-17 19:51:03 |
再加一个 if else 就可以了
机器不学习 2020-02-17 19:51:56 |
@zky123456 不加z的话 x会重复输出
高什么远 2020-02-22 00:37:46 |
妙啊
包租公 2020-11-29 09:41:50 |
@uq_39086373604 我验证了,我也是这么想,但是验证了也对,怎么回事
这段代码犯了错误,比较细微,难以察觉,如下 else if(a[i] >= x && x >= a[i+1]) //找到插入位置 i+1 { n = i+1; //保存插入位置 for(j = 9; j > i; j--) //开始将插入位置之后的数据往后移动一位 { a[j] = a[j-1]; } i = 10; //已经完成工作,设置 i 使 for 循环结束(本程序中不小于 8 即可) 这段代码最后的循环意思是a[i+1]=a[i]; 其实在题目中应该表达的意思要是a[i+2]=a[i+1];a[i+1]=x; 所以就 j>i; 改成 j>i+1;
C语言考试练习题_排列 (C语言代码)浏览:767 |
printf基础练习2 (C语言代码)浏览:826 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:686 |
C语言训练-数字母 (C语言代码)浏览:670 |
WU-整数平均值 (C++代码)浏览:1307 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:350 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:821 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1496 |
C二级辅导-统计字符 (C语言代码)浏览:514 |
永远的丰碑 (C语言代码)浏览:608 |
半途而废柴 2020-03-02 20:56:34 |
请问需要对输入的数据进行排序吗?例题不是已经说正序排列了吗?
bonfirelit 2020-03-03 19:38:05 |
@btefc 这题目要求给的就是正序排好的
半途而废柴 2020-03-03 22:43:03 |
@bloodborn 知道了,谢谢您