🐛 修正习题1.16比较大小的逻辑

This commit is contained in:
康建伟
2020-03-20 13:18:00 +08:00
parent 200aad15b5
commit e1d3bdbe39
6 changed files with 169 additions and 56 deletions
@@ -7,9 +7,9 @@ int main(int argc, char *argv[])
{
int i, j, k;
i = 3;
j = 7;
k = 1;
i = 1;
j = 2;
k = 3;
printf("作为示范,设定依次读入的三个整数为:%d %d %d...\n", i, j, k);
printf("这三个数从大到小的顺序为:");
@@ -27,6 +27,7 @@ void Algo_1_16(int i, int j, int k)
{
int tmp;
// 1.确保i>=j
if(i<j)
{
tmp = i;
@@ -34,6 +35,7 @@ void Algo_1_16(int i, int j, int k)
j = tmp;
}
// 2.确保j>=k,这里如果j是小于k的,那么会对j和k的值进行交换
if(j<k)
{
tmp = j;
@@ -41,6 +43,8 @@ void Algo_1_16(int i, int j, int k)
k = tmp;
}
// 3.如果第2步中发现j<k,则会对j和k的值进行交换,这会导致j的值被更新。
// 如果j的值发生了更新,这可能会破坏第1步中i>=j的保证,所以此处需要再次验证i与j的关系。
if(i<j)
{
tmp = i;
+51 -15
View File
@@ -1,24 +1,32 @@
#include <stdio.h>
/*
* 题1.16
* 题1.16(直接比较)
*
* 将3个整数从大到小顺序输出
* 将3个整数从大到小排序,约定排序结果为x>y>z
*/
void Algo_1_16(int *x, int *y, int *z);
void Algo_1_16_1(int* x, int* y, int* z);
/*
* 题1.16(冒泡排序)
*
* 将3个整数从大到小排序,约定排序结果为x>y>z
*/
void Algo_1_16_2(int* x, int* y, int* z);
int main(int argc, char* argv[]) {
int x, y, z;
x = 3;
y = 7;
z = 1;
x = 1;
y = 2;
z = 3;
printf("作为示范,设定输入为:%d %d %d...\n", x, y, z);
// 进行排序
Algo_1_16(&x, &y, &z);
Algo_1_16_1(&x, &y, &z);
// Algo_1_16_2(&x, &y, &z);
printf("将其从大到小排序后为:%d %d %d...\n", x, y, z);
@@ -26,28 +34,56 @@ int main(int argc, char* argv[]) {
}
// 将3个整数从大到小顺序输出
void Algo_1_16(int *x, int *y, int *z) {
// 将3个整数从大到小排序,约定排序结果为x>y>z(直接比较)
void Algo_1_16_1(int* x, int* y, int* z) {
int tmp;
// 确保x>=y
// 1.确保x>=y
if(*x < *y) {
tmp = *x;
*x = *y;
*y = tmp;
}
// 确保z>=y
// 2.确保z>=y,这里如果y是小于z的,那么会对y和z的值进行交换
if(*y < *z) {
tmp = *y;
*y = *z;
*z = tmp;
}
// 确保x>=z
if(*x < *z) {
// 3.如果第2步中发现y<z,则会对y和z的值进行交换,这会导致y的值被更新。
// 如果y的值发生了更新,这可能会破坏第1步中x>=y的保证,所以此处需要再次验证x与y的关系。
if(*x < *y) {
tmp = *x;
*x = *z;
*z = tmp;
*x = *y;
*y = tmp;
}
}
// 将3个整数从大到小排序,约定排序结果为x>y>z(冒泡排序)
void Algo_1_16_2(int* x, int* y, int* z) {
int tmp;
int i, j;
int a[3];
a[0] = *x;
a[1] = *y;
a[2] = *z;
// 需要进行2轮比较
for(i = 1; i <= 2; i++) {
for(j = 0; j < 3 - i; j++) {
// 把小的往后挪
if(a[j] < a[j + 1]) {
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
*x = a[0];
*y = a[1];
*z = a[2];
}
+60 -23
View File
@@ -1,53 +1,90 @@
#include <stdio.h>
/*
* 题1.16
* 题1.16(直接比较)
*
* 将3个整数从大到小顺序输出
* 将3个整数从大到小排序,约定排序结果为x>y>z
*/
void Algo_1_16(int *x, int *y, int *z);
void Algo_1_16_1(int* x, int* y, int* z);
/*
* 题1.16(冒泡排序)
*
* 将3个整数从大到小排序,约定排序结果为x>y>z
*/
void Algo_1_16_2(int* x, int* y, int* z);
int main(int argc, char* argv[]) {
int x, y, z;
x = 3;
y = 7;
z = 1;
x = 1;
y = 2;
z = 3;
printf("作为示范,设定输入为:%d %d %d...\n", x, y, z);
// 进行排序
Algo_1_16(&x, &y, &z);
Algo_1_16_1(&x, &y, &z);
// Algo_1_16_2(&x, &y, &z);
printf("将其从大到小排序后为:%d %d %d...\n", x, y, z);
return 0;
}
// 将3个整数从大到小顺序输出
void Algo_1_16(int *x, int *y, int *z) {
// 将3个整数从大到小排序,约定排序结果为x>y>z(直接比较)
void Algo_1_16_1(int* x, int* y, int* z) {
int tmp;
// 确保x>=y
// 1.确保x>=y
if(*x < *y) {
tmp = *x;
*x = *y;
*y = tmp;
}
// 确保z>=y
// 2.确保z>=y,这里如果y是小于z的,那么会对y和z的值进行交换
if(*y < *z) {
tmp = *y;
*y = *z;
*z = tmp;
}
// 确保x>=z
if(*x < *z) {
// 3.如果第2步中发现y<z,则会对y和z的值进行交换,这会导致y的值被更新。
// 如果y的值发生了更新,这可能会破坏第1步中x>=y的保证,所以此处需要再次验证x与y的关系。
if(*x < *y) {
tmp = *x;
*x = *z;
*z = tmp;
*x = *y;
*y = tmp;
}
}
// 将3个整数从大到小排序,约定排序结果为x>y>z(冒泡排序)
void Algo_1_16_2(int* x, int* y, int* z) {
int tmp;
int i, j;
int a[3];
a[0] = *x;
a[1] = *y;
a[2] = *z;
// 需要进行2轮比较
for(i = 1; i <= 2; i++) {
for(j = 0; j < 3 - i; j++) {
// 把小的往后挪
if(a[j] < a[j + 1]) {
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
*x = a[0];
*y = a[1];
*z = a[2];
}
+51 -15
View File
@@ -1,24 +1,32 @@
#include <stdio.h>
/*
* 题1.16
* 题1.16(直接比较)
*
* 将3个整数从大到小顺序输出
* 将3个整数从大到小排序,约定排序结果为x>y>z
*/
void Algo_1_16(int *x, int *y, int *z);
void Algo_1_16_1(int* x, int* y, int* z);
/*
* 题1.16(冒泡排序)
*
* 将3个整数从大到小排序,约定排序结果为x>y>z
*/
void Algo_1_16_2(int* x, int* y, int* z);
int main(int argc, char* argv[]) {
int x, y, z;
x = 3;
y = 7;
z = 1;
x = 1;
y = 2;
z = 3;
printf("作为示范,设定输入为:%d %d %d...\n", x, y, z);
// 进行排序
Algo_1_16(&x, &y, &z);
Algo_1_16_1(&x, &y, &z);
// Algo_1_16_2(&x, &y, &z);
printf("将其从大到小排序后为:%d %d %d...\n", x, y, z);
@@ -26,28 +34,56 @@ int main(int argc, char* argv[]) {
}
// 将3个整数从大到小顺序输出
void Algo_1_16(int *x, int *y, int *z) {
// 将3个整数从大到小排序,约定排序结果为x>y>z(直接比较)
void Algo_1_16_1(int* x, int* y, int* z) {
int tmp;
// 确保x>=y
// 1.确保x>=y
if(*x < *y) {
tmp = *x;
*x = *y;
*y = tmp;
}
// 确保z>=y
// 2.确保z>=y,这里如果y是小于z的,那么会对y和z的值进行交换
if(*y < *z) {
tmp = *y;
*y = *z;
*z = tmp;
}
// 确保x>=z
if(*x < *z) {
// 3.如果第2步中发现y<z,则会对y和z的值进行交换,这会导致y的值被更新。
// 如果y的值发生了更新,这可能会破坏第1步中x>=y的保证,所以此处需要再次验证x与y的关系。
if(*x < *y) {
tmp = *x;
*x = *z;
*z = tmp;
*x = *y;
*y = tmp;
}
}
// 将3个整数从大到小排序,约定排序结果为x>y>z(冒泡排序)
void Algo_1_16_2(int* x, int* y, int* z) {
int tmp;
int i, j;
int a[3];
a[0] = *x;
a[1] = *y;
a[2] = *z;
// 需要进行2轮比较
for(i = 1; i <= 2; i++) {
for(j = 0; j < 3 - i; j++) {
// 把小的往后挪
if(a[j] < a[j + 1]) {
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
*x = a[0];
*y = a[1];
*z = a[2];
}
Binary file not shown.
Binary file not shown.