[英]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;
我應該能夠達到切換最大和最小位數的目的,但是我也想打印出結果,使得中間的兩個數字僅第一個和最后一個不變。
舊的是這樣的: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 ++程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.