我是 C 的初學者,我想撰寫一個程式,用陣列中的最小值替換最大值,反之亦然。
#include<iostream>
using namespace std;
int main(){
int num, arr[200],max,min,max_pos,min_pos;
cout <<"enter array size: ";
cin >> num;
for (int i=0; i<num; i ){
cout<<"Enter a value in array position "<<i<<" : ";
cin>>arr[i];
}
for(int i=1, max=arr[0], min=arr[0]; i<num; i ){
if(arr[i]>arr[i-1] && arr[i]>max){
max = arr[i];
max_pos = i;
}
if(arr[i]<arr[i-1] && arr[i]<min){
min = arr[i];
min_pos = i;
}
cout<<"max_in "<<max<<"||"<<"min_in "<<min<<endl;
}
cout<<"max_out "<<max<<"||"<<"min_out "<<min<<endl;
// arr[min_pos] = max;
// arr[max_pos] = min;
// cout<<"max: "<<arr[min_pos]<<" || min: "<<arr[max_pos];
// cout<<"array is ";
// for(int i =0; i<num;i ){
// cout<<arr[i];}
}
這是輸出
enter how many number you want inside :4
Enter a value in array position 0 : 2
Enter a value in array position 1 : 1
Enter a value in array position 2 : 4
Enter a value in array position 3 : 6
max_in 2||min_in1
max_in 4||min_in1
max_in 6||min_in1
max 561||min -1343285512
我不知道為什么回圈外的值會發生變化,錯誤在哪里?
uj5u.com熱心網友回復:
這里
for (int i=1, max=arr[0], min=arr[0] ;...
您宣告了 3 個變數,它們被稱為i和。并隱藏在回圈外宣告的同名變數。maxminmaxmin
不要宣告同名的變數,而是使用您已經宣告的變數:
int max = arr[0];
int min = arr[0];
for(int i=1; i<num; i ){
這是您可以通過閱讀編譯器警告來避免的錯誤:https ://godbolt.org/z/aT753e4nh 。同樣總是初始化變數,并且只有在可以初始化變數時才宣告變數,這樣可以減少發生此類錯誤的機會。
uj5u.com熱心網友回復:
在這個 for 回圈中
for(int i=1, max=arr[0], min=arr[0]; i<num; i ){
if(arr[i]>arr[i-1] && arr[i]>max){
max = arr[i];
max_pos = i;
}
if(arr[i]<arr[i-1] && arr[i]<min){
min = arr[i];
min_pos = i;
}
cout<<"max_in "<<max<<"||"<<"min_in "<<min<<endl;
}
您宣告了區域變數max和minfor 回圈的塊范圍
for(int i=1, max=arr[0], min=arr[0]; i<num; i ){
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
隱藏函式塊作用域中宣告的同名變數main
int num, arr[200],max,min,max_pos,min_pos;
^^^^^^^
您需要洗掉 for 回圈中的冗余宣告并初始化您忘記初始化max_pos的min_pos變數
max=arr[0]; min=arr[0];
max_pos = 0; min_pos = 0;
for(int i=1; i<num; i ){
if 陳述句中的條件也可以寫得更簡單
if( arr[i]>max){
max = arr[i];
max_pos = i;
}
else if( arr[i]<min){
min = arr[i];
min_pos = i;
}
請注意std::minmax_element,可以使用標準演算法代替 for 回圈。
例如
#include <algorithm>
//...
auto p = std::minmax_element( arr, arr num );
if ( p.first != p.second ) std::iter_swap( p.first, p.second );
這是一個演示程式。
#include <iostream>
#include <algorithm>
int main()
{
enum { num = 10 };
int arr[num] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (size_t i = 0; i < num; i )
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
auto p = std::minmax_element( arr, arr num );
if (p.first != p.second) std::iter_swap( p.first, p.second );
for (size_t i = 0; i < num; i )
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
}
程式輸出為
0 1 2 3 4 5 6 7 8 9
9 1 2 3 4 5 6 7 8 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/485817.html
上一篇:最大加權匈牙利法使用最小匈牙利法
