1

Тема: Підпрограма. Мова С

Не виходить програма, незнаю як правильно писати, умову кину нижче.
Код:

#include<stdio.h>
#include<math.h>
int Massiv(double A[8][8],int S)
{int max1=0, max2=0;
int i,j;
for (i=0; i<1;i++){
    for (j=0; j<8;j++){
        if(max1<A[i][j])
        printf("max1=%i", max1);
    }
    }
    for (i=7; i<8;i++){
    for (j=0; j<8;j++){
        if(max2<A[i][j])
        printf("\n");
        printf("max2=%i", max2);
    }
    }
}
    int main ()
{
    double A[8][8]={{1,3,4,5,6,1,4,9},
                {18,13,2,8,6,16,6,19},
                {1,3,7,5,14,5,17,10},
                {9,7,6,1,0,18,7,9},
                {17,2,6,7,6,9,19,9},
                {10,8,8,7,5,3,7,4},
                {5,4,2,2,1,6,1,19},
                {1,3,4,15,12,13,14,9}};
int max1,max2,i,j,S;
switch (S)
{
case 1:
if(max1>max2)
S=-1;
case 2:
if(max1=max2)
S=0;
case 3:
if(max1<max2)
S=1;
printf("S=%i",S);
}
Massiv(A,S);
}

https://replace.org.ua/uploads/images/9731/58c64518c3b5bee5727ecb9976aa6920.jpg

2

Re: Підпрограма. Мова С

І що вам не зрозуміло?
Ви знаєте як знайти максимальний елемент серед двох змінних?

P.S. - привиділося O(нуль), типу як асимптотична складність :)

3

Re: Підпрограма. Мова С

adziri написав:

І що вам не зрозуміло?
Ви знаєте як знайти максимальний елемент серед двох змінних?

P.S. - привиділося O(нуль), типу як асимптотична складність :)

Мабуть саме це :D  , дойшов тільки до такого варіанту:

int Massiv(double A[8][8])
{int max1=0, max2=0;
for (int i=0; i<1;i++){
        for (int j=0; j<8;j++){
        if(max1<A[i][j])
        max1=A[i][j];
        printf("max1=%d\t", max1);
    }}
    for (int i=7; i<8;i++){
            for (int j=0; j<8;j++){
        if(max2<A[i][j])
        max2=A[i][j];
        printf("max2=%d\t", max2);

4

Re: Підпрограма. Мова С

У вас там switch не по канону зроблений. Сішний switch має таку підступну особливість, що коли написати його так, як він у вас написаний, то після виконання одного з кейсів виконуються всі кейси, що йдуть після нього. Напр., якщо у вас S дорівнює 1, то замість лише оцього:

//case 1:
if(max1>max2)
    S=-1;

виконається увесь блок:

//case 1:
if(max1>max2)
    S=-1;
//case 2:
if(max1=max2)
    S=0;
//case 3:
if(max1<max2)
    S=1;
printf("S=%i",S);

Щоб цього не сталось, укінці кожного кейс-розділу треба явним чином робити вихід з допомогою break:

switch (S)
{
case 1:
    if(max1>max2)
      S=-1;
    break;
case 2:
    if(max1=max2)
      S=0;
    break;
case 3:
    if(max1<max2)
      S=1;
    printf("S=%i",S);
}

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

5 Востаннє редагувалося wander (08.12.2019 21:33:57)

Re: Підпрограма. Мова С

Знаєте, навіть я би зробив помилку, якби писав код у такому ж стилі як і ви.
Вам не розповідали, що його варто форматувати перш ніж передавати читати іншим?
C++ Coding Standards Part 1: Style.

Потім, вам варто було б ознайомитися з тим, що такий запис double A[8][8] у функції не має сенсу.
Це до речі зовсім недавно обговорювали в сусідній темі тут, можете ознайомитися.

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

6

Re: Підпрограма. Мова С

P.Y. написав:

У вас там switch не по канону зроблений. Сішний switch має таку підступну особливість, що коли написати його так, як він у вас написаний, то після виконання одного з кейсів виконуються всі кейси, що йдуть після нього. Напр., якщо у вас S дорівнює 1, то замість лише оцього:

//case 1:
if(max1>max2)
    S=-1;

виконається увесь блок:

//case 1:
if(max1>max2)
    S=-1;
//case 2:
if(max1=max2)
    S=0;
//case 3:
if(max1<max2)
    S=1;
printf("S=%i",S);

Щоб цього не сталось, укінці кожного кейс-розділу треба явним чином робити вихід з допомогою break:

switch (S)
{
case 1:
    if(max1>max2)
      S=-1;
    break;
case 2:
    if(max1=max2)
      S=0;
    break;
case 3:
    if(max1<max2)
      S=1;
    printf("S=%i",S);
}

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

Візьми до уваги. Дякую.

7 Востаннє редагувалося wander (08.12.2019 21:46:56)

Re: Підпрограма. Мова С

case 3:
    if(max1<max2)
      S=1;
    printf("S=%i",S);

Тут теж треба break;
A printf("S=%i",S) тре винести зі switch-блоку.

8

Re: Підпрограма. Мова С

adziri написав:

Знаєте, навіть я би зробив помилку, якби писав код у такому ж стилі як і ви.
Вам не розповідали, що його варто форматувати перш ніж передавати читати іншим?
C++ Coding Standards Part 1: Style.

Потім, вам варто було б ознайомитися з тим, що такий запис double A[8][8] у функції не має сенсу.
Це до речі зовсім недавно обговорювали в сусідній темі тут, можете ознайомитися.

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

Я візьму до уваги Ваші зауваження. Дуже дякую.
Але я все ж немогу додуматись, як ж правильно знайти :D
Якщо б Ви мені пояснили, я б був Вам дуже вдячний :)

9

Re: Підпрограма. Мова С

Здробив підпрограму, але чумось програма не виконує призначення команд case, просто вибиває S=0. Не розумію, чому

#include<stdio.h>
#include<math.h>
int Massiv(int A[8][8])
{int max1=0, max2=0;
for(int i=0;i<1;i++)
    {    
      for(int j=0;j<8;j++)
      {
        if(A[i][j]>max1)
        {
          max1=A[i][j];
        }}
      printf("  max1[%i]=%i",i,max1);
    }
    printf ("\n");
    for(int i=7;i<8;i++)
    {    
      for(int j=0;j<8;j++)
      {
        if(A[i][j]>max2)
        {
          max2=A[i][j];
      }}
      printf("  max2[%i]=%i",i,max2);
    }
}
    int main ()
{
    int A[8][8]={{1,3,4,5,6,1,4,10},
                {18,13,2,8,6,16,6,19},
                {1,3,7,5,14,5,17,10},
                {9,7,6,1,0,18,7,9},
                {17,2,6,7,6,9,19,9},
                {10,8,8,7,5,3,7,4},
                {5,4,2,2,1,6,1,19},
                {1,3,4,15,12,13,14,9}};
int max1,max2,S;
switch (S)
{
case 1:
if(max1>max2)
S=-1;
 break;
case 2:
if(max1=max2)
S=9;
 break;
case 3:
if(max1<max2)
S=1;
 break;
}
printf("S=%d",S);
Massiv(A);
}

10

Re: Підпрограма. Мова С

Перечитайте власний код. Ви оголошуєте S, нічого не записуєте і в наступному ж рядкові робите з нею switch. Я забув, як там у стандарті — неініціалізована змінна обнуляється чи вважається невизначеною — у будь-якому разі, це не те, що вам треба.

11

Re: Підпрограма. Мова С

P.Y. написав:

Перечитайте власний код. Ви оголошуєте S, нічого не записуєте і в наступному ж рядкові робите з нею switch. Я забув, як там у стандарті — неініціалізована змінна обнуляється чи вважається невизначеною — у будь-якому разі, це не те, що вам треба.

В такому випадку Мені взагалі swaitch не підходить, так?

12

Re: Підпрограма. Мова С

bodnar200289 написав:
adziri написав:

Знаєте, навіть я би зробив помилку, якби писав код у такому ж стилі як і ви.
Вам не розповідали, що його варто форматувати перш ніж передавати читати іншим?
C++ Coding Standards Part 1: Style.

Потім, вам варто було б ознайомитися з тим, що такий запис double A[8][8] у функції не має сенсу.
Це до речі зовсім недавно обговорювали в сусідній темі тут, можете ознайомитися.

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

Я візьму до уваги Ваші зауваження. Дуже дякую.
Але я все ж немогу додуматись, як ж правильно знайти :D
Якщо б Ви мені пояснили, я б був Вам дуже вдячний :)

Ех, ну типу так, далі вже думаю самі розберетесь:

Прихований текст
#include <stdio.h>
#include <assert.h>

int max(int a, int b) {
    return (a < b) ? b : a;
}

int max_element(int* arr, size_t n) {
    assert(n > 0);
    if (1 == n) return arr[0];
    
    int m = arr[0];
    for (size_t i = 1; i < n; i++) {
        m = max(arr[i], m);
    }
    return m;
}

int main() {
    int a[8][8] = {{1, 3, 4, 5, 6, 1, 4, 1},
                   {8, 1, 2, 8, 6, 1, 6, 9},
                   {1, 3, 7, 5, 1, 5, 1, 0},
                   {9, 7, 6, 1, 0, 1, 7, 9},
                   {7, 2, 6, 7, 6, 9, 1, 2},
                   {0, 8, 8, 7, 5, 3, 7, 4},
                   {1, 3, 4, 5, 2, 3, 4, 9},
                   {5, 4, 2, 2, 1, 8, 1, 1}};
    printf("max in first row: %d\n", max_element(a[0], 8));
    printf("max in last row: %d\n", max_element(a[7], 8));
    return 0;
}
Подякували: bodnar2002891

13

Re: Підпрограма. Мова С

adziri написав:
bodnar200289 написав:
adziri написав:

Знаєте, навіть я би зробив помилку, якби писав код у такому ж стилі як і ви.
Вам не розповідали, що його варто форматувати перш ніж передавати читати іншим?
C++ Coding Standards Part 1: Style.

Потім, вам варто було б ознайомитися з тим, що такий запис double A[8][8] у функції не має сенсу.
Це до речі зовсім недавно обговорювали в сусідній темі тут, можете ознайомитися.

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

Я візьму до уваги Ваші зауваження. Дуже дякую.
Але я все ж немогу додуматись, як ж правильно знайти :D
Якщо б Ви мені пояснили, я б був Вам дуже вдячний :)

Ех, ну типу так, далі вже думаю самі розберетесь:

Прихований текст
#include <stdio.h>
#include <assert.h>

int max(int a, int b) {
    return (a < b) ? b : a;
}

int max_element(int* arr, size_t n) {
    assert(n > 0);
    if (1 == n) return arr[0];
    
    int m = arr[0];
    for (size_t i = 1; i < n; i++) {
        m = max(arr[i], m);
    }
    return m;
}

int main() {
    int a[8][8] = {{1, 3, 4, 5, 6, 1, 4, 1},
                   {8, 1, 2, 8, 6, 1, 6, 9},
                   {1, 3, 7, 5, 1, 5, 1, 0},
                   {9, 7, 6, 1, 0, 1, 7, 9},
                   {7, 2, 6, 7, 6, 9, 1, 2},
                   {0, 8, 8, 7, 5, 3, 7, 4},
                   {1, 3, 4, 5, 2, 3, 4, 9},
                   {5, 4, 2, 2, 1, 8, 1, 1}};
    printf("max in first row: %d\n", max_element(a[0], 8));
    printf("max in last row: %d\n", max_element(a[7], 8));
    return 0;
}

Я вже був знайшов, але все одно дуже дякую :)
Що правда, в мене виникла ще одна проблема, яку я описав вище..
Незнаю тепер як присвоїти значення S, адже був впевнений, що це потрібно робити саме таким способом, як у мене..

14

Re: Підпрограма. Мова С

Вам та S там не потрібна, як і switch.

15

Re: Підпрограма. Мова С

adziri написав:

Вам та S там не потрібна, як і switch.

Я зверху умову кидав, мені не тільки елементи масиву вивести потрібно, але й прирівняти їх, та у різних випадках присвоїти різне значення S :)

16

Re: Підпрограма. Мова С

bodnar200289 написав:

умову кидав

*FACEPALM*
Ох вже ці умови..
Ну, гаразд, тоді потрібна, а switch все ще ні.

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

17

Re: Підпрограма. Мова С

bodnar200289 написав:
P.Y. написав:

Перечитайте власний код. Ви оголошуєте S, нічого не записуєте і в наступному ж рядкові робите з нею switch. Я забув, як там у стандарті — неініціалізована змінна обнуляється чи вважається невизначеною — у будь-якому разі, це не те, що вам треба.

В такому випадку Мені взагалі swaitch не підходить, так?

Не знаю — дивлячись що ви хотіли з його допомогою зробити. Все, що робить switch — дивиться, яке значення лежить у змінній, і робить перехід на відповідний case. Щоб це мало сенс, треба те значення туди попередньо покласти. Якщо ж ви хочете не вибрати дію в залежності від значення змінної, а навпаки — вибрати значення в залежності від виконання якихось більш складних умов і записати у змінну, то вам switch/case непотрібен.

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

18

Re: Підпрограма. Мова С

P.Y. написав:
bodnar200289 написав:
P.Y. написав:

Перечитайте власний код. Ви оголошуєте S, нічого не записуєте і в наступному ж рядкові робите з нею switch. Я забув, як там у стандарті — неініціалізована змінна обнуляється чи вважається невизначеною — у будь-якому разі, це не те, що вам треба.

В такому випадку Мені взагалі swaitch не підходить, так?

Не знаю — дивлячись що ви хотіли з його допомогою зробити. Все, що робить switch — дивиться, яке значення лежить у змінній, і робить перехід на відповідний case. Щоб це мало сенс, треба те значення туди попередньо покласти. Якщо ж ви хочете не вибрати дію в залежності від значення змінної, а навпаки — вибрати значення в залежності від виконання якихось більш складних умов і записати у змінну, то вам switch/case непотрібен.

І як ж мені це робити тепер?:(

19

Re: Підпрограма. Мова С

if else вам в допомогу

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

20

Re: Підпрограма. Мова С

adziri написав:

if else вам в допомогу

Пробував це реалізувати в case :D без результатів))
Вже завтра робитиму цим способом, триматиму в курсі :D Будуть проблеми - напишу, з надією на допомогу :)