我在這個問題上遇到了一些麻煩。問題全文如下:“撰寫一個函式,回傳給定非負整數陣列的一個版本,其中陣列中的每個零值都被陣列中零右側的最小奇數值替換. 如果零的右邊沒有奇數,則將零作為零。
這是我的代碼:
#include <stdio.h>
void lowestOdd(int num[], int size) {
int i, temp;
for (i = 0; i < size; i ) {
if (num[i] % 2 != 0 && num[i] < num[i 1]) {
temp = num[i];
}
}
for (i = 0; i < size; i ) {
if (num[i] = 0) {
num[i] = temp;
}
}
}
void printArray(int array[], int size) {
int i;
for (i = 0; i < size; i ) {
printf("%d/n", array[i]);
}
}
int main() {
int i, size;
int myarr[20];
printf("What is the size of your array? \n");
scanf("%d", &size);
for (i = 0; i < size; i ) {
scanf("%d", &myarr[i]);
}
lowestOdd(myarr[20], size);
printArray(myarr[20], size);
return 0;
}
我嘗試在最低奇函式中實作指標,但無濟于事。我確實認為他們在這里是必要的,但我并不擅長指標。我得到的警告主要是“警告:傳遞 'lowestOdd' 的引數 1 使指標從整數而不進行強制轉換 [-Wint-conversion]”。另外,在我的代碼中,我沒有添加陳述句來檢查數字是否為零或零右側是否有任何奇數值。
uj5u.com熱心網友回復:
在宣告中
int myarr[20];
myarr是識別符號- 用于參考陣列本身的名稱。myarr有型別 int [20]。
在此運算式中使用時
lowestOdd(myarr[20], size);
[20]是陣列下標運算子,訪問索引20。這是索引超出范圍,因為該型別 int [20]的有效索引是0to 19。這種越界訪問將導致Undefined Behavior。
這個警告
warning: passing argument 1 of 'lowestOdd' makes pointer from integer without a cast [-Wint-conversion]
給出是因為,盡管要訪問的索引無效,但運算式 myarr[20]的計算結果為int. lowestOdd期望 anint *作為它的第一個引數。
與之前類似,在
if (num[i] % 2 != 0 && num[i] < num[i 1])
num[i 1]將訪問num[size]when iis size - 1(同樣,有效索引是0to size - 1)。
這是任務
if (num[i] = 0)
你想比較的地方
if (num[i] == 0)
注意
scanf("%d", &size);
for (i = 0; i < size; i ) {
scanf("%d", &myarr[i]);
如果用戶輸入的值大于20for ,則存在相同的越界訪問風險size。
暫時忽略越界訪問,lowestOdd嘗試從陣列中的每對數字中找到較小數字的最后一次出現,其中左邊的數字必須是奇數。
然后它用這個值替換陣列中的所有零。
有機會temp永遠不會分配任何東西,因此具有不確定的價值。
這是不正確的。
這是一個示例程式(使用可變長度陣列)。
請注意,語法array i等價于&array[i].
? :是條件運算子:在 中a ? b : c,如果a為非零,則運算式計算為b,否則計算為c。
#include <stdio.h>
int min(int a, int b)
{
return a < b ? a : b;
}
int find_lowest_odd(int *base, size_t len)
{
int value = 0;
for (size_t i = 0; i < len; i )
if (base[i] & 1) /* base[i] % 2 != 0 */
value = value ? min(value, base[i]) : base[i];
return value;
}
void mutate_array(int *a, size_t len)
{
for (size_t i = 0; i < len; i )
if (0 == a[i]) /* search from the next position */
a[i] = find_lowest_odd(a i 1, len - i - 1);
}
void print_array(int *a, size_t len)
{
for (size_t i = 0; i < len; i )
printf("%d ", a[i]);
putchar('\n');
}
int main(void) {
size_t size;
printf("What is the size of your array?: ");
if (1 != scanf("%zu", &size))
return 1;
int array[size];
for (size_t i = 0; i < size; i ) {
printf("#%zu: ", i 1);
if (1 != scanf("%d", array i))
return 1;
}
print_array(array, size);
mutate_array(array, size);
print_array(array, size);
}
輸入/輸出:
What is the size of your array?: 10
#1: 0
#2: 2
#3: 0
#4: 5
#5: 3
#6: 0
#7: 7
#8: 2
#9: 0
#10: 0
0 2 0 5 3 0 7 2 0 0
3 2 3 5 3 7 7 2 0 0
uj5u.com熱心網友回復:
一旦你可以試試這個。
這是我天真的方法。對于陣列中的每個零,它會檢查從該位置到最后一個索引的最小奇數元素,并將其存盤在名為 small 的變數中。檢查后,它將該索引的原始值替換為較小的值。
#include<stdio.h>
void lowestOdd(int *num, int size){
int i, j;
for(i = 0; i < size - 1; i ){
if (num[i] != 0) continue;
int smaller = 99998;
for(j = i 1; j < size; j ){
if (num[j] % 2 != 0 && num[j] < smaller) smaller = num[j];
}
if (smaller != 99998) num[i] = smaller;
}
}
void printArray(int *array, int size){
int i;
for (i=0; i<size; i ){
printf("%d\n", array[i]);
}
}
int main()
{
int i, size;
int myarr[20];
printf("What is the size of your array? \n");
scanf("%d", &size);
for (i=0; i<size; i ){
scanf("%d", &myarr[i]);
}
lowestOdd(myarr, size);
printArray(myarr, size);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/492277.html
上一篇:三個用戶輸入三個全域變數
