Тема: Замінити одиницями елементи масиву

Усім привіт! Маю одновимірний масив в якому потрібно замінити одиницями елементи масиву, які знаходяться після найменшого елементу, та знайти суму всіх елементів які знаходяться до найменшого елементу, але не знаю як це зробити  допоможіть будь-ласка.

#include <stdio.h>
#include <stdlib.h>
void main()
{
    float X[16] = {
        2.34, -3.42, 0.56, -3.71, 1.25, 6.37, 0.123, -45.821,
        32.5, 0.94, 0.54, -1.26, 2.36, 4.32, -5.345, 4.876
    };
    int sum;
    float min;
    float Y[16];
    printf("Масив Х\n");
    for(int i = 0; i < 16; i++) {
        printf("%2.3f\t",X[i]);
    }
    for(int i = 0; i < 16; i++) {
        if(min > X[i]) {
            Y[i] = X[i];
            min = X[i];
        }
    }
    printf("\nMin = %2.3f", min);
}

2

Re: Замінити одиницями елементи масиву

Спершу треба знайти індекс найменшого елемента, а потім уже від цього індексу шукати решту.

Подякували: Who is Antonio, leofun012

3

Re: Замінити одиницями елементи масиву

koala написав:

Спершу треба знайти індекс найменшого елемента, а потім уже від цього індексу шукати решту.

Дякую за пораду! Код принципі працює але є одна проблема, наступне число після мінімального (32.5) не переводиться в 1, не підкажете де тут помилка?

#include <stdio.h>
#include <stdlib.h>
void main() {
  float X[16] = {2.34, -3.42, 0.56, -3.71, 1.25, 6.37, 0.123,  -45.821,
                 32.5, 0.94,  0.54, -1.26, 2.36, 4.32, -5.345, 4.876};
  float sum;
  float min;
  float Y[16];
  printf("Масив Х\n");
  for (int i = 0; i < 16; i++) {
    printf("%2.3f\t", X[i]);
  }
  for (int i = 0; i < 16; i++) {
    if (min > X[i]) {
      min = X[i];
    }
  }
  printf("\nMin= %2.3f", min);
  printf("\nМасив \n");
  for (int i = 0; i < 16; i++) {
    printf("%2.3f\t", X[i]);
    int after_min = 0;
    float minn = X[0];
    for (int i = 0; i < 16; i++)
      if (minn < X[i]) minn = X[i];
    for (int i = 0; i < 16; i++) {
      if (after_min)
        X[i] = 1;
      else if (X[i] == minn)
        after_min = 1;
    }
  }
  sum = 0;
  for (int i = 0; i < 7; ++i) {
    if (X[i]) {
      sum += X[i];
    }
  }
  printf("\nSum= %2.3f\t", sum);
}

4

Re: Замінити одиницями елементи масиву

Код у принципі не працює. У мене таке враження, що ви навмання намагаєтеся різні шматки коду збити до купи, сподіваючися, що воно запрацює.

Who is Antonio написав:
for (int i = 0; i < 7; ++i) 

Звідки ви оце 7 взяли?

Подякували: leofun011

5

Re: Замінити одиницями елементи масиву

koala написав:

Звідки ви оце 7 взяли?

Це щоб суму рахувало до 7 елементу, оскільки в завданні мені потрібно вивести суму елементів до мінімального елемента.

6

Re: Замінити одиницями елементи масиву

Знаю, що так не робиться але для написання нормального коду не маю ні часу ні знань.

7

Re: Замінити одиницями елементи масиву

Who is Antonio написав:

замінити одиницями елементи масиву

для цього треба створити функцію

void update_array_values(float *arr, int count, float value) {
    for(int i = 0; i < count; ++i)
        arr[i] = value;
}
Who is Antonio написав:

, які знаходяться після найменшого елементу,

я би формулював інакше, ", індекс яких більший ніж індекс мінімального елемента",
пошуком індекса мінімального елемента займеться окрема функція

int get_index_of_minimum(float *const arr, int const count) {
    int i_min = 0;
    for(int i = 1; i < count; ++i)
        if(arr[i] < arr[i_min])
            i_min = i;
    return i_min;
}
Who is Antonio написав:

та знайти суму всіх елементів

для цього теж треба створити функцію

float get_sum_of_array(float *const arr, int const count) {
    float sum = 0.f;
    for(int i = 0; i < count; ++i)
        sum += arr[i];
    return sum;
}
Who is Antonio написав:

які знаходяться до найменшого елементу

", індекс яких менший ніж індекс мінімального елемента". Вже маємо функцію для цього.

Як користувач я хочу мати можливість вивести масив одним рядком коду. Для цього треба функцію

void print_array_values(char const *const pre, float *const arr, int const count, char const *const post) {
    printf_s("%s[ ", pre);
    for(int i = 0; i < count; ++i)
        printf_s("%6.3f ", arr[i]);
    printf_s("]%s", post);
}

, яку можна буде викликати одним рядком

print_array_values("_text_pre_", arr, SIZE, "_text_post_");

Тепер збираємо все це в 1 файл (*.c)

#include <stdio.h>

void update_array_values(float *const arr, int const count, float const value);
int get_index_of_minimum(float *const arr, int const count);
float get_sum_of_array(float *const arr, int const count);
void print_array_values(
    char const *const pre,
    float *const arr, int const count,
    char const *const post
);

#define SIZE 16
int main(int argc, char *argv[]) {
    float arr[SIZE] = {
        2.34f, -3.42f, 0.56f, -3.71f, 1.25f, 6.37f, 0.123f, -45.821f,
        32.5f, 0.94f, 0.54f, -1.26f, 2.36f, 4.32f, -5.345f, 4.876f
    };
    int i_min = get_index_of_minimum(arr, SIZE);
    print_array_values("Before : ", arr, SIZE, "\r\n");
    update_array_values(arr + (i_min + 1), SIZE - (i_min + 1), 1.f);
    print_array_values("After  : ", arr, SIZE, "\r\n");
    float sum = get_sum_of_array(arr, i_min);
    printf_s("%4.3f is the sum ", sum);
    print_array_values("of ", arr, i_min, "\r\n");
    return 0;
}
void update_array_values(float *const arr, int const count, float const value) {
    for(int i = 0; i < count; ++i)
        arr[i] = value;
}
int get_index_of_minimum(float *const arr, int const count) {
    int i_min = 0;
    for(int i = 1; i < count; ++i)
        if(arr[i] < arr[i_min])
            i_min = i;
    return i_min;
}
float get_sum_of_array(float *const arr, int const count) {
    float sum = 0.f;
    for(int i = 0; i < count; ++i)
        sum += arr[i];
    return sum;
}
void print_array_values(
    char const *const pre,
    float *const arr, int const count,
    char const *const post
) {
    printf_s("%s[ ", pre);
    for(int i = 0; i < count; ++i)
        printf_s("%6.3f ", arr[i]);
    printf_s("]%s", post);
}
Секрет успіху

Декомпозиція задачі (про яку koala часто згадує). Розбивай програму на функції. Кожна з них має виконувати тільки одну корисну дію. Тоді програмуваня принесе задоволеня.

8

Re: Замінити одиницями елементи масиву

leofun01, ну які функції? Він у циклах плаває.
Як ми шукаємо мінімум?

int min = arr[0];
for(int i=1;i<SIZE;++i)
    if(arr[i] < min)
        min = arr[i];

Спершу min дорівнює першому елементу масиву. Далі він порівнюється з кожним елементом, і якщо зустрічний елемент менший за поточний мінімум - змінюємо значення мінімуму. Тоді після циклу значення min буде точно дорівнювати одному з елементів і точно буде менше за всі інші, тобто буде мінімумом. Це ви розумієте? А тепер шукаємо індекс мінімума:

int min = arr[0];
int min_i = 0;
for(int i=1;i<SIZE;++i)
    if(arr[i] < min) {
        min = arr[i];
        min_i = i;
    }

Додали змінну min_i і кожного разу, коли змінюємо min, змінюємо min_i. Тепер в min буде значення мінімального елемента, а в min_i - індекс. А тепер хутко всі елементи після min_i замініть на 1.

Подякували: wander, Who is Antonio, leofun013

9

Re: Замінити одиницями елементи масиву

Дякую Вам за допомогу, вибачайте, що мені потрібні настільки дрібні пояснення, але що зі студента візьмеш... 
С почав вивчати тільки на першому курсі, викладачі доволі поверхнево пояснюють теми, тому іноді із завданнями буває складно, а оскільки про використання  const* і char* нам взагалі не розказували, мені варто вивчати цю мову детальніше поза навчанням.

Re: Замінити одиницями елементи масиву

koala написав:
int min = arr[0];
int min_i = 0;
for(int i=1;i<SIZE;++i)
    if(arr[i] < min) {
        min = arr[i];
        min_i = i;
    }

Для чого змінна min ... якщо не секрет?
min_i як на мене більш ніж достатньо....
Чесно кажучи не раз бачив саме такий приклад в книжках...так і не зрозумів для чого дублювати min...

Re: Замінити одиницями елементи масиву

float get_sum_of_array(float *const arr, int const count) {
    float sum = 0.f;
    for(int i = 0; i < count; ++i)
        sum += arr[i];
    return sum;
}

А чому саме float *const arr?
Чому не  const float* arr?

12

Re: Замінити одиницями елементи масиву

Олександр Ковальчук написав:

Для чого змінна min ... якщо не секрет?
min_i як на мене більш ніж достатньо....
Чесно кажучи не раз бачив саме такий приклад в книжках...так і не зрозумів для чого дублювати min...

Бо звертання до пам'яті не миттєве. Загалом на сучасних комп'ютерах з великим кешем не буде особливої різниці між

        if(arr[i] < arr[i_min])
            i_min = i;

та

    if(arr[i] < min) {
        min = arr[i];
        min_i = i;
    }

У першому випадку буде додаткове звернення до пам'яті, у другому - використаний один зайвий регістр процесора.
Але конкретно тут я намагався мінімально змінити попередній код, щоб унаочнити різницю.

Подякували: leofun011

13 Востаннє редагувалося Олександр Ковальчук (28.12.2022 22:52:12)

Re: Замінити одиницями елементи масиву

koala написав:

У першому випадку буде додаткове звернення до пам'яті, у другому - використаний один зайвий регістр процесора.

Ясно...

14

Re: Замінити одиницями елементи масиву

Олександр Ковальчук написав:
float get_sum_of_array(float *const arr, int const count) {
    float sum = 0.f;
    for(int i = 0; i < count; ++i)
        sum += arr[i];
    return sum;
}

А чому саме float *const arr?
Чому не  const float* arr?

Тут я мав написати всі const (до * і після *), але чомусь я затупив. Має бути так :

float get_sum_of_array(float const *const arr, int const count) { ... }

const після * (float *const arr) треба для того, щоб не можна було змінити значеня вказівника arr.

    arr = NULL; // error is ok
    arr[i] = 0.f; // allowed

const перед * (float const *arr) треба для того, щоб не можна було змінити значеня елементів масиву arr[i].

    arr = NULL; // allowed
    arr[i] = 0.f; // error is ok

Синтаксично const float *arr - те саме що float const *arr. Я використовую останній варіант, бо він легше читається, і я зразу розумію хто const. А const перед типом, на який будемо вказувати, мене тільки конфузить.

Re: Замінити одиницями елементи масиву

leofun01 написав:

Тут я мав написати всі const (до * і після *), але чомусь я затупив.

Зрозуміло....