关于四个数从大到小的错误算法思想
#include<iostream>
using namespace std;
int main() {
int a, b, c, d, t;
cin >> a >> b >> c>>d;
if (a < b) {//这一步走完a>=b
t = a;
a = b;
b = t;
}
if (c < d) {//这一步走完c>=d
t = c;
c = d;
d = t;
}
if (b < c) {//这一步走完b>=c
t = b;
b = c;
c = t;
}
cout << a << ' ' << b << ' ' << c << ' ' << d << ' ';
}
误以为程序走完后a>=b>=c>=d;这是不对的,因为随着abcd位置的交换,会导致相对位置的变换。
有一个已经排好序的数组,现输入一个数,要求按原来的规律将它插入数组中。
错误代码1:
#include <iostream>
using namespace std;
void insert(int [],int);
int main() {
int a[5]={1,2,3,4};
insert(a,5);
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){
cout<<a[i]<<' ';
}
}
void insert(int a[],int data){
//先判断数组是升序还是降序
int result=0;
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){
if(a[i]<a[i+1]){ //数组是升序
result=1;
break;
}
if(a[i]>a[i+1]){ //数组是降序
result=0;
break;
}
}
int temp; //用于元素向后挪位
if(result==1){
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){
if(a[i]<data);
else{ //a[i]的位置就是插入data的位置,之后元素向后挪位
temp=a[i+1];
a[i+1]=a[i];
a[i]=data;
}
}
}
if(result==0){
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){
if(a[i]>data);
else{ //a[i]的位置就是插入data的位置,之后元素向后挪位
temp=a[i+1];
a[i+1]=a[i];
a[i]=data;
}
}
}
}
错误原因:
数组作为函数参数传递的时候,sizeof()将数组看作指针,结果是指针的大小,而非整个数组所占内存
错误代码2:
#include <iostream>
using namespace std;
void insert(int[], int, int);
int main() {
int a[6] = { 1,2,3,4 };
int count = sizeof(a); //用于计算数组的字符数
insert(a, 5, count);
for (int i = 0; i < count / sizeof(a[0]); i++) {
cout << a[i] << ' ';
}
}
void insert(int a[], int data, int size) {
//先判断数组是升序还是降序
int result = 0;
for (int i = 0; i < size / sizeof(a[0]); i++) {
if (a[i] < a[i + 1]) { //数组是升序
result = 1;
break;
}
if (a[i] > a[i + 1]) { //数组是降序
result = 0;
break;
}
}
int temp; //用于元素向后挪位
if (result == 1) {
for (int i = 0; i < size / sizeof(a[0]); i++) {
if (a[i] < data) {
continue;
}
else {//走到这里时,a[i]>=data,a[i]的位置就是插入data的位置
for (int j = i; j < size / sizeof(a[0]); j++) { //元素向后挪位
temp = a[j + 1];
a[j + 1] = a[j];
}
}
a[i] = data;
}
}
if (result == 0) { //数组是降序
for (int i = 0; i < size / sizeof(a[0]); i++) {
if (a[i] > data) {
continue;
}
else { //走到这里时,a[i]<=data,a[i]的位置就是插入data的位置
for (int j = i; j < size / sizeof(a[0]); j++) { //元素向后挪位
temp = a[j + 1];
a[j + 1] = a[j];
}
}
a[i] = data;
}
}
}
错误原因:
数组a初始化之后,其内的元素分别为:a={1,2,3,4,0,0};该数组原来并不是有序的
正确代码:
#include<stdio.h>
void insert(int a[], int b[], int data, int size);
int main()
{
int a[11] = { 2,3,4,5,6,7,8,13,18,20 };//初始化十个元素
int b[11],data;
printf("请输入待插入的值:");
scanf_s("%d", &data);
insert(a, b, data, 10);
return 0;
}
void insert(int a[],int b[], int data, int size) {
int i = 0;
//待插入元素比最后一个元素大
if (a[size-1] <= data) {
for (int j = 0; j < size; j++) { //复制a数组元素到b数组中来
b[j] = a[j];
}
b[size] = data; //插入元素
}
else {
for (int j = 0; j < size; j++) { //找到待插入位置
if (a[i] < data) {
continue;
}
}
for (int j = size; j > i; j--) { //元素向后移位
a[j] = a[j - 1];
}
a[i] = data;
for (int j = 0; j <= size; j++) { //复制a数组元素到b数组中来
b[j] = a[j];
}
}
for (int j = 0; j <= size; j++) { //复制a数组元素到b数组中来
printf("%d ", b[j]);
}
}
采用一个辅助数组b,来避免a数组中未初始化的元素自动初始化为0