2017-02-07 5 views
1

Итак, у меня это до сих пор. Я пытаюсь найти два больших числа в массиве и вернуть их. Я искал много ресурсов в Интернете, и большинство из них говорят, что «вызов по ссылке» - это путь. Но я не знаю, как заставить его работать с моей программой. Например, я видел этот пример в Интернете:Как вернуть наибольшие два числа в массиве в C?

void Calculate(int x, int y, int* prod, int* quot) 
{ 
    *prod = x*y; 
    *quot = x/y; 
} 

int x = 10,y = 2, prod, quot; 
Calculate(x, y, &prod, &quot) 

Как эта программа действительно «возвращается»? Как распечатать возвращаемые значения на консоли?

#include "stdio.h" 


void largest_two(int numbers[], int len, int *largest, int *next_largest){ 


    int i, temp; 

    *largest = numbers[0]; 
    *next_largest = numbers[1]; 

    if(*largest < *next_largest){ 
    temp = *next_largest; 
    *largest = *next_largest; 
    *next_largest = temp; 
    } 

    for (i=0; i<sizeof(numbers); i++) { 
    if(numbers[i]>= *largest){ 
     *largest = numbers[i]; 
     *next_largest = *largest; 
    } 
    else if (numbers[i] > *next_largest){ 
     *next_largest = numbers[i]; 
    } 
    } 
} 

int main() { 
    int numbers[] = {3, 1, 2, 3, 6, 2, 8, 0, 0, 0}; 
    int len = 3; 
    int largest, next_largest; 

    //==>??? printf("%d %d", largest_two(numbers, len, &largest, &next_largest)); 

    } 
+3

'for (i = 0; г ' for (i = 0; i LPs

+2

вызывается' most_two' так же, как вы это делали, а затем 'printf ("% d% d ", наибольший, next_largest)' , –

+0

'printf (" наибольший =% d \ nnext_largest =% d \ n ", самый большой, next_largest);' BTW вы должны купить/прочитать хорошую книгу c и изучить что-то о указателях ... – LPs

ответ

0

сторон от проблем указателя (вы должны прочитать учебник/книгу на них), ваша главная проблема заключается в том, что вы пытаетесь напечатать одно значение, возвращаемое функцией с возвращаемым типом void, что означает его не вернется вообще.

Ваш код:

int main() { 
    int numbers[] = {3, 1, 2, 3, 6, 2, 8, 0, 0, 0}; 
    int len = 10; // sizeof(numbers) 
    int largest, next_largest; 
    largest_two(numbers, len, &largest, &next_largest); 
    printf("%d %d", largest, next_largest); 
    } 

Имейте в виду, что это до сих пор не совсем правильно, но это адрес вашей проблемы печати чисел.

Кроме того, прохождение len означает, что вы не должны делать это for (i=0; i<sizeof(numbers); i++), но это вместо for (i=0; i<len; i++)

0

Во-первых, эта линия:

for (i=0; i<sizeof(numbers); i++) 

не является правильным. Вы хотите, чтобы это было вместо этого:

for (i=0; i<len; i++) 

, которые должны быть переданы largest_two() в sizeof numbers/sizeof numbers[0], что фактическая длина массива.

Я также предлагаю установки largest и next_largest в INT_MIN от <limits.h>, а затем найти эти значения из своих. Кажется, у вас также проблемы с указателями, и было бы лучше использовать их только тогда, когда это необходимо.

Вот пример, который упрощает ваш подход, который находит самый большой и второй по величине элемент в одном цикле массива. При необходимости он также использует указатели.

Код:

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

#define ARRAYSIZE(x) (sizeof x/sizeof x[0]) 

void largest_two(int numbers[], size_t len, int *largest, int *next_largest); 

int main(void) { 
    int numbers[] = {3, 1, 2, 3, 6, 2, 8, 0, 0, 0}; 
    int largest, next_largest; 

    largest_two(numbers, ARRAYSIZE(numbers), &largest, &next_largest); 

    printf("largest = %d\nnext_largest = %d\n", largest, next_largest); 
} 

void largest_two(int numbers[], size_t len, int *largest, int *next_largest) { 
    int max, smax; 

    max = smax = INT_MIN; 
    for (size_t i = 0; i < len; i++) { 
     if (numbers[i] > max) { 
      smax = max; 
      max = numbers[i]; 
     } else if (numbers[i] > smax && numbers[i] < max) { 
      smax = numbers[i]; 
     } 
    } 
    *largest = max; 
    *next_largest = smax; 
} 

Выход:

largest = 8 
next_largest = 6 

Второй набор данных:

int numbers[] = {3, 1, 6, 3, 6, 2, 8, 0, 8, 7}; 

Выход:

largest = 8 
next_largest = 7 
+0

Вы должны попробовать набор данных с двумя или тремя 8-ми, просто чтобы проверить ** номера [i] max **. – cup

+0

Код @cup, проверенный более чем с 8, работает отлично. Использование только этого условия испортит код. Вам нужно проверить 'numbers [i]' на 'smax'. – RoadRunner

+0

Спасибо @RoadRunner! Я понимаю ваш код, но как бы это сделать с указателями. Я прихожу с другого языка, и я пытался практиковать проблемы с указателями. Что-то не так с моей логикой? – nastypluto

Смежные вопросы