1

Тема: Одновимірний масив у С

Надано одновимірний масив. Всі його елементи, що не дорівнюють
нулю, переписати у початок масиву, не порушуючи порядку. Нульові –
в кінець масиву. Новий масив не створювати.
Привіт. Є ось таке завдання. Ми вводимо кількість елементів масиву, потім самі значення масиву,  потім потрібно зробити переписування масиву, я розумію, що потрібно створити цикл, але як саме зробити це завдання ні. Дайте будь ласка пораду як зробити переписування масиву.

2

Re: Одновимірний масив у С

Вам потрібні два індекси - один, скажімо i, за яким ви ідете по масиву, і другий, наприклад j - за яким записуєте. Коли array[i] буде не 0 - записуєте його в array[j] і збільшуєте j. Коли масив закінчиться (i досягне кінця) - всі елементи, починаючи з j, замінюєте на 0.
Якщо так складно уявити - випишіть на аркуші який масив (раджу для кращого розуміння почати його з 0), поставте вказівні пальці на початок масиву як індекси і спробуйте виконати цей алгоритм (один палець рухається на кожному кроці, другий - лише коли перший зустрів не нуль, і тоді переписуєте значення з першого пальця на другий).

Тему перенесено в "Алгоритми та структури даних, технології", нічого специфічного для мови C я тут не бачу.

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

3 Востаннє редагувалося koala (22.11.2022 10:04:29)

Re: Одновимірний масив у С

А де тут помилка, тому що при введенні всіх даних програма не виводить кінцевий результат(тобто переписування масиву)?

printf("Enter %d array elements \n", n);
    for(i=0; i<n; i++){
       scanf("%lf", &arr[i]);}
    }
    
    for ( i = 0; i < n; i++) {
        if (arr[i]!=0) {
            for ( j = 0; j < i; j++) {
                if (arr[j] == 0) {
                    x = arr[i];
                    arr[i] = arr[j];
                    arr[j] = x;
                }
            }
        }
    }
     printf("Array:\n", &arr[i]);

4 Востаннє редагувалося koala (22.11.2022 10:05:09)

Re: Одновимірний масив у С

У C немає засобів виведення масиву, лише окремих елементів. От по елементах і виводьте.
І ні, вам не потрібен цикл по j та обмін. Вам треба в циклі по i іноді збільшувати j і перезаписувати елементи масиву, а потім вписувати нулі. Ви ж напевне знаєте, що в кінці будуть нулі - то нащо вам їх зберігати?

Додав вам теги code (кнопка <>) і повернув тему назад у C/C++. І, будь ласка, вирівнюйте код уважніше. Ви псуєте життя передусім самому собі, коли робите код складночитаним.

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

5

Re: Одновимірний масив у С

А зараз де помилка, просто в кінці виводить просто нулі

    for (int i = 0; i < n; i++) {
        if (arr[\i] != 0) {
            int temp = arr[\i]; 
            arr[\i] = arr[j];
            arr[j] = temp;
            j++;
        }
    }
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[\i]); 
    }
 return 0;
}

6

Re: Одновимірний масив у С

carti538 написав:

в кінці виводить просто нулі

Хіба це не за умовою так має бути?

carti538 написав:

. Всі його елементи, що не дорівнюють
нулю, переписати у початок масиву, не порушуючи порядку. Нульові –
в кінець масиву

7

Re: Одновимірний масив у С

То воно виводить всі 0, а я вводю масив, наприклад, {0, 9, 0, 8, 1}, а виводить просто 0 0 0 0 0, і от я намагаюся зрозуміти чому?

8 Востаннє редагувалося koala (24.11.2022 12:24:30)

Re: Одновимірний масив у С

https://ideone.com/5H46yj
Не виходить відтворити.
Проблема, можливо, не в цьому коді.
В тегах code не треба нічого змінювати, ніяких \.

9

Re: Одновимірний масив у С

Але діло в тому, що кожного разу потрібно вводити розмірність масиву, потім елементи масиву, тобто кожний раз різний, наприклад, вводю масив 0 9 0 2 1 2 3, а виводить 0 0 0 0 0 0 0.

10

Re: Одновимірний масив у С

Ось так, звичайно без \i, але все таки в кінці виводить тільки нулі

#include <stdio.h>

int main() {
int  i,  n, j;
double arr[n];
    printf("Enter n: \n");
scanf("%d", &n);

{printf("Enter %d array elements \n", n);
    for(i=0; i<n; i++){
    
       scanf("%lf", &arr[\i]);}
    }
    for (int i = 0; i < n; i++) {
        if (arr[\i] != 0) {
            int temp = arr[\i]; 
            arr[\i] = arr[j];
            arr[j] = temp;
            j++;
        }
    }
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[\i]); 
    }
    return 0;
}

11

Re: Одновимірний масив у С

printf("%d ", arr[i]);

Якого типу arr[i] і який специфікатор виведення для цього типу?

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

12

Re: Одновимірний масив у С

типу int, специфікатор %lf
Можливо вам кинути весь код, тому що я міг десь ще допустити помилку?

13 Востаннє редагувалося koala (25.11.2022 09:27:47)

Re: Одновимірний масив у С

carti538 написав:

типу int, специфікатор %lf

Неправильна відповідь в обох випадках. Будь ласка, уважніше. arr[i] - типу double (чому ви взагалі вирішили, що int?), специфікатор виведення для double - %lf, %d - для int.

carti538 написав:

Можливо вам кинути весь код, тому що я міг десь ще допустити помилку?

І очевидно, що так. Як ми можемо вам допомогти з кодом, якщо ви не надаєте нам цей код? Якщо ви локалізували проблему - тобто абсолютно певні, що проблема в певному місці - тоді можете кидати тільки це місце, але й тоді бажано його оформити так, щоб можна було запустити.

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

14

Re: Одновимірний масив у С

Все, я зрозумів помилку, все діло в специфікаторах. Дякую Вам!