Тема: Процедури в мові C

Дано три масиви А(8),В(9),С(10).
Відсортувати масиви так , щоб на початку стояли додатні числа , а в кінці - від'ємні .
Сортування виконати у вигляді підпрограми.

2

Re: Процедури в мові C

Що з цього завдання ви вже зробили самостійно? З чим виникли труднощі?

Подякували: sahanvalentun, koala, HetmanNet3

3

Re: Процедури в мові C

Я розумію , як зробити сортування , але не знаю , як оформити код з підпрограмою

4

Re: Процедури в мові C

Вам треба зробити функцію, що отримує два параметри: масив невизначеного розміру (тип int[] або float[]) та довжину масиву (тип int). Тип самої функції неважливий (як правило, роблять int або void) — результату вона не повертатиме, всі зміни вноситимуться безпосередньо в переданий масив. У цій функції робите сортування.

Далі, в main вам треба оголосити три масиви й задати їм початкові значення, напр.,

static int a[8]={1,4,8,5,-8-5,90,32};

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

5

Re: Процедури в мові C

void A[](int i,float A[])
{
    
}

приблизно так ?

6 Востаннє редагувалося P.Y. (07.12.2019 16:44:37)

Re: Процедури в мові C

sahanvalentun написав:
void A[](int i,float A[])
{
    
}

приблизно так ?

Незовсім — нащо там квадратні дужки після імені функції?.. Якщо це функція сортування (назвімо її краще не A, а sort), то квадратні дужки зайві (вони могли б стосуватися типу результату функції, який, у даному випадку, void — тобто, відсутній), тому, скоріш, так:

void sort(int i,float A[])
{
    
}

Ну і самі масиви в main тоді будуть float.

7

Re: Процедури в мові C

#include<stdio.h>
#include<math.h>
void A[](int j,float *A[]);
{
    for (int j=0;j<i;j++)
    {
        {
        if (A[j]<A[j+1])
            {
            tmp=A[j];
            A[j]=A[j+1];
            A[j+1]=tmp;
            }
        }
    }
    return A[];
}
int main ()
{
    int i;
    float A[8]={2.4, -5.3, 6.6, 0.3, -1.2, 4.4, 5.8, -1.1};
    float B[9]={-1.3, 3.3, 5.8, -2, -4.5, 2.3, 0.6, 6, -4.6};
    float d[10]={4.3, 5.9, -0.1, -3, 6.7, -2.4, 7.5, 5, -2, 5.7};
    for (int i=0;i<8;i++)
    {
        printf ("%.1f",S[j](&A[i]),8);
    }
    for (int i=0;i<9;i++)
    {
        printf ("%.1f",S[j](&B[i]),9);
    }
    for (int i=0;i<10;i++)
    {
        printf ("%.1f",S[j](&d[i]),10);
    }
    return 0;
}

8 Востаннє редагувалося P.Y. (07.12.2019 17:17:16)

Re: Процедури в мові C

void A[]

Ні! Перечитайте моє попереднє повідомлення — я там дописав, як треба.
Чи, краще, подумайте самі, що могло б те void A[] означати і чому в цьому нема сенсу.

Далі, якщо в нас функція має тип void, то результату вона не повертає, тому return A[]; також не має сенсу — треба або просто return; , або взагалі без нього — функція сама завершиться, коли дійде до кінця.

Ну і в самій функції main поки що не бачу викликів функції сортування.

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

9

Re: Процедури в мові C

Де помилка ?

10

Re: Процедури в мові C

sahanvalentun написав:

Де помилка ?

Як мінімум, у заголовку функції.

11

Re: Процедури в мові C

Вибачте , не помітив попереднього повідомлення , тож як викликати функцію сортування ?

12

Re: Процедури в мові C

Більш розгорнуто:

void A[](int j,float *A[]); — взагалі неробочий код.
Ви двічі використали ім'я A — замість імені функції та замість одного з її параметрів. Дайте функції ім'я, не схоже на A.
Квадратні дужки після імені функції зайві.
float *A[] — не масив float, а масив вказівників на float (теоретично, можна й так, але тоді вам доведеться дописати багато зайвого при виклику функції та при діях з масивами). Тому або float A[], або float *A — з точки зору компілятора, це одне й те ж.
Крапка з комою зайва.

13

Re: Процедури в мові C

sahanvalentun написав:

Вибачте , не помітив попереднього повідомлення , тож як викликати функцію сортування ?

Напишіть ім'я функції і після неї в дужках вкажіть фактичні параметри. Наприклад, sort(10, d); чи sort(d, 10); — дивлячись в якому порядку там ідуть формальні параметри в заголовку функції. Аналогічно з двома іншими масивами.

14

Re: Процедури в мові C

Я нібито все зробив , але ще дись є помилка

#include<stdio.h>
#include<math.h>
void sort(int j,float *S)
{
    int i;
    float tmp;
    for (int j=0;j<i;j++)
    {
        {
        if (S[j]<S[j+1])
            {
            tmp=S[j];
            S[j]=S[j+1];
            S[j+1]=tmp;
            }
        }
    }
}
int main ()
{
    int i;
    float A[8]={2.4, -5.3, 6.6, 0.3, -1.2, 4.4, 5.8, -1.1};
    float B[9]={-1.3, 3.3, 5.8, -2, -4.5, 2.3, 0.6, 6, -4.6};
    float d[10]={4.3, 5.9, -0.1, -3, 6.7, -2.4, 7.5, 5, -2, 5.7};
    for (int i=0;i<8;i++)
    {
        printf ("%.1f",A(sort(8,A)));
    }
    for (int i=0;i<9;i++)
    {
        printf ("%.1f",B(sort(9,B)));
    }
    for (int i=0;i<10;i++)
    {
        printf ("%.1f",d(sort(10,d)));
    }
    return 0;
}

15 Востаннє редагувалося P.Y. (07.12.2019 18:42:47)

Re: Процедури в мові C

Якщо я правильно розумію, ви намагаєтесь викликати функцію так, ніби вона називається так само, як масив, і повертає результат, хоча вона void і має ім'я sort. Вірніше, я взагалі не розумію, як ви додумалися так викликати функцію.

1) Спершу викликаєте функцію сортування, потім робите цикл виводу. Ніяких викликів сортування всередині циклу не має бути.
2) Просто виведіть усі елементи масивів, не роблячи при цьому ніяких збочень. Як отримати елемент масиву — знаєте, як викликати printf — знаєте, як зробити цикл — знаєте.

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

16

Re: Процедури в мові C

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

17

Re: Процедури в мові C

sahanvalentun написав:

Якщо так , то я не до кінця розумію як викликати функцію

Якщо функція результату не повертає, то див. вище — просто пишете окремим рядком:

 sort(10, d);

Якби функція не була void і повертала результат через return, то його можна було б присвоїти якійсь змінній, напр., y=f(x); — але, в нашому випадку, результат не повертається, тому присвоювати його кудись непотрібно.

18

Re: Процедури в мові C

Так виводить тільки масиви , невідсортовані

#include<stdio.h>
#include<math.h>
void sort(int j,float *S)
{
    int i;
    float tmp;
    for (int j=0;j<i;j++)
    {
        {
        if (S[j]<S[j+1])
            {
            tmp=S[j];
            S[j]=S[j+1];
            S[j+1]=tmp;
            }
        }
    }
}
int main ()
{
    int i;
    float A[8]={2.4, -5.3, 6.6, 0.3, -1.2, 4.4, 5.8, -1.1};
    float B[9]={-1.3, 3.3, 5.8, -2, -4.5, 2.3, 0.6, 6, -4.6};
    float d[10]={4.3, 5.9, -0.1, -3, 6.7, -2.4, 7.5, 5, -2, 5.7};
    sort(8,A);
    sort(9,B);
    sort(10,d);
    for (int i=0;i<8;i++)
    {
        printf ("%.1f  ",A[i]);    
        
    }
    printf ("\n");
    for (int i=0;i<9;i++)
    {
        printf ("%.1f  ",B[i]);
    }
    printf ("\n");
    for (int i=0;i<10;i++)
    {
        printf ("%.1f  ",d[i]);
    }
    return 0;
}

19

Re: Процедури в мові C

З викликами функції все гаразд ніби. Шукайте помилку в алгоритмі сортування. Як мінімум, там якась фігня з j (що має містити довжину масива, але навіщось використана як лічильник у циклі сортування, тоді як i взагалі сидить без діла).

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

20

Re: Процедури в мові C

Що пропонуєте зробити ?