Передача выходных данных функции неверна в C

0

Эта программа будет запрашивать у пользователя цифры, а затем сортирует их и отображает, сколько триплетов находится в массиве. Если я введу {1,2,3,3,3,4,5,3,3,6,7}, это будет 3 триплета.

Я не знаю, что происходит в моей функции void triplet(int count, int uin[]); это не работает. Пожалуйста, помогите мне исправить это.

#include "stdafx.h"
#include <stdio.h>

void sorting(int count, int uin[]);
void triplet(int count, int uin[]);

int uin[30];
int i;
int done;
int count = 0;

int main()
{
    for (i = 0; i < 30; i++)
    {
        printf("plase input the number: ");
        done = scanf_s("%d", &uin[i]);

        if (done != EOF)
        {
            count++;
        }
        else
        {
            break;
        }
    }
    sorting(count, uin);
    triplet(count, uin);
    return 0;
}    

void sorting(int count, int uin[])
{
    int i, j, temp;
    for (i = 0; i < count; i++)
    {
        for (j = 0; j < count - 1; j++)
        {
            if (uin[i]<uin[j])
            {
                temp = uin[i];
                uin[i] = uin[j];
                uin[j] = temp;
            }
        }
    }
}    

void triplet(int count, int uin[])
{
    int i;
    int counter = 0;
    for (i = 0; i < count; i++)
    {
        if (uin[i] == uin[i + 1] && uin[i + 2])
        {
            counter++;
        }
        printf("\n%d\n", counter);
    }
}
  • 0
    Когда цикл находится на последней итерации (когда i равен count - 1 ), как вы думаете, uin[i + 1] и uin[i + 2] получат свои числа?
  • 0
    Две ошибки Слишком много итераций в цикле и отсутствие левой части во втором тесте.
Показать ещё 1 комментарий
Теги:
arrays

2 ответа

2
Лучший ответ

uin[i] == uin[i + 1] && uin[i + 2] должно быть uin[i] == uin[i + 1] && uin[i] == uin[i + 2]. Изучите эти два тщательно и убедитесь, что вы понимаете разницу!

Кроме того, как указал Йоахим, условие цикла должно быть i < count - 2.

  • 0
    спасибо, исправили
1

Обычно, когда массивы используются в качестве параметров функций, первым параметром является сам массив, а второй параметр - количество элементов в массиве. Поэтому вместо

void triplet(int count, int uin[]);

Я бы объявил функцию следующим образом

void triplet( const int uin[], int n );

Неверное определение функции. Прежде всего он использует недопустимое условие в выражении if

if (uin[i] == uin[i + 1] && uin[i + 2])

и, во-вторых, есть попытка получить доступ к памяти за пределами массива.

Функция может быть определена как

void triplet( const int uin[], int n )
{
    int i;
    int counter = 0;

    for ( i = 0; i + 2 < n; i++ )
    {
        counter += uin[i] == uin[i + 1] && uin[i + 1] == uin[i + 2];
    }

    printf( "\n%d\n", counter );
}
  • 0
    Ваше предложение о порядке аргументов является классическим способом сделать это, но есть основания полагать, что C99 меняет это и void triplet(int count, int uin[count]); будет иметь некоторый смысл (а затем count должен предшествовать uin в списке аргументов).
  • 0
    @ Джонатан Леффлер: Я не вижу смысла в обратном порядке.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню