Тема: Процедури в мові C
Дано три масиви А(8),В(9),С(10).
Відсортувати масиви так , щоб на початку стояли додатні числа , а в кінці - від'ємні .
Сортування виконати у вигляді підпрограми.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Процедури в мові C
Для відправлення відповіді ви повинні увійти або зареєструватися
Дано три масиви А(8),В(9),С(10).
Відсортувати масиви так , щоб на початку стояли додатні числа , а в кінці - від'ємні .
Сортування виконати у вигляді підпрограми.
Що з цього завдання ви вже зробили самостійно? З чим виникли труднощі?
Я розумію , як зробити сортування , але не знаю , як оформити код з підпрограмою
Вам треба зробити функцію, що отримує два параметри: масив невизначеного розміру (тип int[] або float[]) та довжину масиву (тип int). Тип самої функції неважливий (як правило, роблять int або void) — результату вона не повертатиме, всі зміни вноситимуться безпосередньо в переданий масив. У цій функції робите сортування.
Далі, в main вам треба оголосити три масиви й задати їм початкові значення, напр.,
static int a[8]={1,4,8,5,-8-5,90,32};
Або ж циклічно вводити значення елементів з консолі.
Потім тричі викликати функцію сортування, передаючи їй масиви та їх розміри. Після чого вивести на друк вміст трьох масивів.
void A[](int i,float A[]) { }
приблизно так ?
Незовсім — нащо там квадратні дужки після імені функції?.. Якщо це функція сортування (назвімо її краще не A, а sort), то квадратні дужки зайві (вони могли б стосуватися типу результату функції, який, у даному випадку, void — тобто, відсутній), тому, скоріш, так:
void sort(int i,float A[])
{
}
Ну і самі масиви в main тоді будуть float.
#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;
}
void A[]
Ні! Перечитайте моє попереднє повідомлення — я там дописав, як треба.
Чи, краще, подумайте самі, що могло б те void A[] означати і чому в цьому нема сенсу.
Далі, якщо в нас функція має тип void, то результату вона не повертає, тому return A[]; також не має сенсу — треба або просто return; , або взагалі без нього — функція сама завершиться, коли дійде до кінця.
Ну і в самій функції main поки що не бачу викликів функції сортування.
Де помилка ?
Як мінімум, у заголовку функції.
Вибачте , не помітив попереднього повідомлення , тож як викликати функцію сортування ?
Більш розгорнуто:
void A[](int j,float *A[]); — взагалі неробочий код.
Ви двічі використали ім'я A — замість імені функції та замість одного з її параметрів. Дайте функції ім'я, не схоже на A.
Квадратні дужки після імені функції зайві.
float *A[] — не масив float, а масив вказівників на float (теоретично, можна й так, але тоді вам доведеться дописати багато зайвого при виклику функції та при діях з масивами). Тому або float A[], або float *A — з точки зору компілятора, це одне й те ж.
Крапка з комою зайва.
Вибачте , не помітив попереднього повідомлення , тож як викликати функцію сортування ?
Напишіть ім'я функції і після неї в дужках вкажіть фактичні параметри. Наприклад, sort(10, d); чи sort(d, 10); — дивлячись в якому порядку там ідуть формальні параметри в заголовку функції. Аналогічно з двома іншими масивами.
Я нібито все зробив , але ще дись є помилка
#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;
}
Якщо я правильно розумію, ви намагаєтесь викликати функцію так, ніби вона називається так само, як масив, і повертає результат, хоча вона void і має ім'я sort. Вірніше, я взагалі не розумію, як ви додумалися так викликати функцію.
1) Спершу викликаєте функцію сортування, потім робите цикл виводу. Ніяких викликів сортування всередині циклу не має бути.
2) Просто виведіть усі елементи масивів, не роблячи при цьому ніяких збочень. Як отримати елемент масиву — знаєте, як викликати printf — знаєте, як зробити цикл — знаєте.
Якщо я все правильно зрозумів , то потрібно спочатку відсортувати значення масиву , а потім просто його вивести .
Якщо так , то я не до кінця розумію як викликати функцію
Якщо так , то я не до кінця розумію як викликати функцію
Якщо функція результату не повертає, то див. вище — просто пишете окремим рядком:
sort(10, d);
Якби функція не була void і повертала результат через return, то його можна було б присвоїти якійсь змінній, напр., y=f(x); — але, в нашому випадку, результат не повертається, тому присвоювати його кудись непотрібно.
Так виводить тільки масиви , невідсортовані
#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;
}
З викликами функції все гаразд ніби. Шукайте помилку в алгоритмі сортування. Як мінімум, там якась фігня з j (що має містити довжину масива, але навіщось використана як лічильник у циклі сортування, тоді як i взагалі сидить без діла).
Для відправлення відповіді ви повинні увійти або зареєструватися