正确的代码打印互换的最大值和最小值
Correct Code to Print the interchanged max and min values
我遇到了一个问题,要在给定的一组数字中交换最大数字和最小数字的位置,并打印出旧排列和新排列
老的是这样的:5,5678,62,6000
而新的预计是这样的:6000,5678,62,5
我已经尝试 运行 打印代码的不同变体来打印它,但都无济于事,因为我已经能够互换数字的最大和最小位置
int main () {
int m [4] = {5,5678,62,6000};
int i;
int max=m[0];
int min=m[0];
int pMin = 0;
int pMax = 0;
int temp = 0;
{
printf( "%d\n", m[i]) ;
}
for (i=0; i<4; i++){
{
printf( "%d\n", m[i]) ;
}
if ( m[i] > max )
{
max = m[i] ;
}
}
for (i=0; i<4; ++i){
if ( m[i] < min )
{
min = m[i] ;
}
}
temp = min;
min = max;
max = temp;
printf ("min = %d\n", min);
printf ("max = %d\n", max);
printf( "%d\n", m[i]) ;
getch();
}
如果我只输入这行代码就能正确完成
temp = min;
min = max;
max = temp;
我应该可以达到交换最大和最小数字位置的目的,但我也想打印出结果,使得中间的2个数字保持不变,只是第一个和最后一个。
老的是这样的:5,5678,62,6000
而新的预计是这样的:6000,5678,62,5
你应该从你的编译器那里得到一个警告(如果没有,启用警告标志,比如 GCC 中的 -Wall
),关于这个打印语句,在它自己的块中:
{
printf( "%d\n", m[i]) ;
}
我想你的意思是在数组上循环并打印它的内容,然后你再做。但是当你试图找到 max
时,你似乎忘记了遍历数组。
您的代码在此处调用 未定义行为 (UB):
printf("%d\n", m[i]) ;
因为你超出了范围,因为 i
在前一个 for 循环(找到 min
)之后有最后一个值,它是 4(数组的大小)。所以你索引数组超出了它的末尾,即 m[4]
,这解释了输出的垃圾值。
这是您接近的计划,但让我们在这里列出它:
- 找到数组的最大元素,并记住它的索引
元素.
- 找到数组的最小元素,并记住它的索引
元素.
- 交换数组的最小和最大元素。
注意:如果有多个最大元素,请考虑最后看到的一个。对于最小元素也是如此。
将所有内容放在一起,您会得到:
#include <cstdio>
int main () {
int m [4] = {5,5678,62,6000};
int i;
int max=m[0], max_idx;
int min=m[0], min_idx;
int temp = 0;
for(int i = 0; i < 4; ++i)
{
printf( "%d\n", m[i]) ;
}
for (i=0; i<4; i++)
{
if ( m[i] > max )
{
max = m[i];
max_idx = i;
}
}
for (i=0; i<4; ++i)
{
if ( m[i] < min )
{
min = m[i];
min_idx = i;
}
}
temp = min;
m[min_idx] = max;
m[max_idx] = temp;
printf ("min = %d\n", min);
printf ("max = %d\n", max);
printf("The new array is:\n");
for(int i = 0; i < 4; i++)
printf("%d\n", m[i]);
}
输出:
5
5678
62
6000
min = 5
max = 6000
The new array is:
6000
5678
62
5
试试这个代码
# include<stdio.h>
int main () {
int m [4] = {5,5678,62,6000};
int i;
int max=m[0];
int min=m[0];
int pMin = 0;
int pMax = 0;
int temp = 0;
// print before swap
for (i=0; i<4; i++){
{
printf( "%d\n", m[i]) ;
}
if ( m[i] > max )
{
max = m[i] ;
pMin = i;
}
}
for (i=0; i<4; ++i){
if ( m[i] < min )
{
min = m[i] ;
pMax = i;
}
}
m[pMax] = max;
m[pMin] = min;
// print after swap
for (i=0; i<4; i++)
{
printf( "%d\n", m[i]) ;
}
return 0;
}
如果确实是 C++ 程序,则使用 C++ 功能。
程序可以如下所示。
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
int m[] = { 5, 5678, 62, 6000 };
for ( const auto &item : m ) std::cout << item << ' ';
std::cout << '\n';
auto minmax = std::minmax_element( std::begin( m ), std::end( m ) );
if ( minmax.first != minmax.second ) std::iter_swap( minmax.first, minmax.second );
for ( const auto &item : m ) std::cout << item << ' ';
std::cout << '\n';
}
它的输出是
5 5678 62 6000
6000 5678 62 5
至于你的代码,那么它至少在这个代码片段中没有意义
int main () {
int m [4] = {5,5678,62,6000};
int i;
// ...
int temp = 0;
{
printf( "%d\n", m[i]) ;
}
// ...
不是说变量i
没有初始化。
并且您的代码不会交换数组中的最大元素和最小元素。
如果是C程序那么可以这样看。
#include <stdio.h>
int main( void )
{
int m[] = { 5, 5678, 62, 6000 };
const size_t N = sizeof( m ) / sizeof( *m );
for ( size_t i = 0; i < N; i++ ) printf( "%d ", m[i] );
putchar( '\n' );
size_t min_i = 0;
size_t max_i = 0;
for ( size_t i = 1; i < N; i++ )
{
if ( m[i] < m[min_i] ) min_i = i;
if ( m[max_i] < m[i] ) max_i = i;
}
if ( min_i != max_i )
{
int tmp = m[min_i];
m[min_i] = m[max_i];
m[max_i] = tmp;
}
for ( size_t i = 0; i < N; i++ ) printf( "%d ", m[i] );
putchar( '\n' );
}
程序输出同上图
5 5678 62 6000
6000 5678 62 5
您可以使用程序中使用的循环将此 C 程序重写为 C++ 程序。
我遇到了一个问题,要在给定的一组数字中交换最大数字和最小数字的位置,并打印出旧排列和新排列
老的是这样的:5,5678,62,6000
而新的预计是这样的:6000,5678,62,5
我已经尝试 运行 打印代码的不同变体来打印它,但都无济于事,因为我已经能够互换数字的最大和最小位置
int main () {
int m [4] = {5,5678,62,6000};
int i;
int max=m[0];
int min=m[0];
int pMin = 0;
int pMax = 0;
int temp = 0;
{
printf( "%d\n", m[i]) ;
}
for (i=0; i<4; i++){
{
printf( "%d\n", m[i]) ;
}
if ( m[i] > max )
{
max = m[i] ;
}
}
for (i=0; i<4; ++i){
if ( m[i] < min )
{
min = m[i] ;
}
}
temp = min;
min = max;
max = temp;
printf ("min = %d\n", min);
printf ("max = %d\n", max);
printf( "%d\n", m[i]) ;
getch();
}
如果我只输入这行代码就能正确完成
temp = min;
min = max;
max = temp;
我应该可以达到交换最大和最小数字位置的目的,但我也想打印出结果,使得中间的2个数字保持不变,只是第一个和最后一个。
老的是这样的:5,5678,62,6000
而新的预计是这样的:6000,5678,62,5
你应该从你的编译器那里得到一个警告(如果没有,启用警告标志,比如 GCC 中的 -Wall
),关于这个打印语句,在它自己的块中:
{
printf( "%d\n", m[i]) ;
}
我想你的意思是在数组上循环并打印它的内容,然后你再做。但是当你试图找到 max
时,你似乎忘记了遍历数组。
您的代码在此处调用 未定义行为 (UB):
printf("%d\n", m[i]) ;
因为你超出了范围,因为 i
在前一个 for 循环(找到 min
)之后有最后一个值,它是 4(数组的大小)。所以你索引数组超出了它的末尾,即 m[4]
,这解释了输出的垃圾值。
这是您接近的计划,但让我们在这里列出它:
- 找到数组的最大元素,并记住它的索引 元素.
- 找到数组的最小元素,并记住它的索引 元素.
- 交换数组的最小和最大元素。
注意:如果有多个最大元素,请考虑最后看到的一个。对于最小元素也是如此。
将所有内容放在一起,您会得到:
#include <cstdio>
int main () {
int m [4] = {5,5678,62,6000};
int i;
int max=m[0], max_idx;
int min=m[0], min_idx;
int temp = 0;
for(int i = 0; i < 4; ++i)
{
printf( "%d\n", m[i]) ;
}
for (i=0; i<4; i++)
{
if ( m[i] > max )
{
max = m[i];
max_idx = i;
}
}
for (i=0; i<4; ++i)
{
if ( m[i] < min )
{
min = m[i];
min_idx = i;
}
}
temp = min;
m[min_idx] = max;
m[max_idx] = temp;
printf ("min = %d\n", min);
printf ("max = %d\n", max);
printf("The new array is:\n");
for(int i = 0; i < 4; i++)
printf("%d\n", m[i]);
}
输出:
5
5678
62
6000
min = 5
max = 6000
The new array is:
6000
5678
62
5
试试这个代码
# include<stdio.h>
int main () {
int m [4] = {5,5678,62,6000};
int i;
int max=m[0];
int min=m[0];
int pMin = 0;
int pMax = 0;
int temp = 0;
// print before swap
for (i=0; i<4; i++){
{
printf( "%d\n", m[i]) ;
}
if ( m[i] > max )
{
max = m[i] ;
pMin = i;
}
}
for (i=0; i<4; ++i){
if ( m[i] < min )
{
min = m[i] ;
pMax = i;
}
}
m[pMax] = max;
m[pMin] = min;
// print after swap
for (i=0; i<4; i++)
{
printf( "%d\n", m[i]) ;
}
return 0;
}
如果确实是 C++ 程序,则使用 C++ 功能。
程序可以如下所示。
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
int m[] = { 5, 5678, 62, 6000 };
for ( const auto &item : m ) std::cout << item << ' ';
std::cout << '\n';
auto minmax = std::minmax_element( std::begin( m ), std::end( m ) );
if ( minmax.first != minmax.second ) std::iter_swap( minmax.first, minmax.second );
for ( const auto &item : m ) std::cout << item << ' ';
std::cout << '\n';
}
它的输出是
5 5678 62 6000
6000 5678 62 5
至于你的代码,那么它至少在这个代码片段中没有意义
int main () {
int m [4] = {5,5678,62,6000};
int i;
// ...
int temp = 0;
{
printf( "%d\n", m[i]) ;
}
// ...
不是说变量i
没有初始化。
并且您的代码不会交换数组中的最大元素和最小元素。
如果是C程序那么可以这样看。
#include <stdio.h>
int main( void )
{
int m[] = { 5, 5678, 62, 6000 };
const size_t N = sizeof( m ) / sizeof( *m );
for ( size_t i = 0; i < N; i++ ) printf( "%d ", m[i] );
putchar( '\n' );
size_t min_i = 0;
size_t max_i = 0;
for ( size_t i = 1; i < N; i++ )
{
if ( m[i] < m[min_i] ) min_i = i;
if ( m[max_i] < m[i] ) max_i = i;
}
if ( min_i != max_i )
{
int tmp = m[min_i];
m[min_i] = m[max_i];
m[max_i] = tmp;
}
for ( size_t i = 0; i < N; i++ ) printf( "%d ", m[i] );
putchar( '\n' );
}
程序输出同上图
5 5678 62 6000
6000 5678 62 5
您可以使用程序中使用的循环将此 C 程序重写为 C++ 程序。