我遇到了一个问题,即在给定的一组数字中互换最大和最小数字的位置,并打印出旧的排列和新的排列
旧的是这样的: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;
我应该能够实现切换最大和最小数字位置的目的,但是我也想打印出结果,使得中间的两个数字仅第一个和最后一个不变。
旧的是这样的:5,5678,62,6000
,并且新的版本应如下所示:6000,5678,62,5
答案 0 :(得分:0)
您应该从编译器获得警告(如果没有,请启用警告标志,例如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
答案 1 :(得分:0)
尝试此代码
# 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;
}
答案 2 :(得分: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 ++程序。