1

Тема: Зв'язані списки в C HELP

Привіт)
Допоможіть розібратися з кодом.
Не можу зрозуміти, чого програма не сортує прізвища в алфавітному порядку
І чого не знаходить середнє арифметичне зросту і ваги студентів :(
Мені дуже потрібно зробити цю лабораторну до понеділка!
Допоможіть, будь ласка.

#include<stdio.h>
#include<string.h>

struct people {
    char surn[15], sex[7];
    int hght, wght, age;
}; //med

main() {
    char t[20];
    int i,j,n=2,sum1=0,sum2=0;
    float am1, am2;
    
    struct people humans[5]={{"Johnson B.B.", "male", 183, 80, 24},
                                            {"Wilson C.H.", "male", 174, 74, 23},
                                            {"White J.U.", "female", 164, 52, 20},
                                            {"Harambe M.M.", "male", 192, 103, 17},
                                            {"Rosel V.E.", "female", 160, 45, 21}}, pl[15]; //med
 
struct people *p = humans;
    
    
    for (i=1; i<5; i++)
    {
        for (j=1; j<5; j++)
        {
        if (strcmp(pl[j-1].surn, pl[j].surn) > 0)
            {
        strcpy(t, pl[j-1].surn);
        strcpy(pl[j-1].surn, pl[j].surn);
        strcpy(pl[j].surn, t);
            }
        }
    }
    
    
    puts("Strings in order are:");

    for(i=0; i<5; i++)
    {
    printf("\n %s\tsex: %s\theight: %d\tweight: %d\tage: %d\n\n", (p+i)->surn, (p+i)->sex, (p+i)->hght, (p+i)->wght, (p+i)->age);
    }
    
    for (i=1; i<=5; i++)
    {
    //scanf("%f", &pl[i].hght);
        sum1=sum1+pl[i].hght;
    }
    
    for (i=1; i<=5; i++)
    {
    //scanf("%f", &pl[i].wght);
        sum2=sum2+pl[i].wght;
    }
    
    am1=sum1/n;
    printf("\n\nArithmetic Mean of students height = %f\n",am1);
    
    am2=sum2/n;
    printf("\n\nArithmetic Mean of students weight = %f\n",am2);
    
return 0;

}

2 Востаннє редагувалося Betterthanyou (10.12.2016 20:18:19)

Re: Зв'язані списки в C HELP

Ви зробили масив pl (18 рядок)

pl[15]; //med

але він не ініціалізований (пусти)

і дальше ви намагаєтеся зробити над ним якість дії

if (strcmp(pl[j-1].surn, pl[j].surn) > 0)

ось і перша помилка


що це ?

struct people *p = humans;

3 Востаннє редагувалося Betterthanyou (10.12.2016 21:06:55)

Re: Зв'язані списки в C HELP

Я трохи виправив, тепер є хоч якийсь результат, дальше я думаю ви розберетесь

#include<stdio.h>
#include<string.h>

struct people {
    char surn[15], sex[7];
    int hght, wght, age;
}; //med

int main() {
    char t[20];
    int i, j, n = 5, sum1 = 0, sum2 = 0;
    float am1, am2;

    struct people humans[5] = { { "Johnson B.B.", "male", 183, 80, 24 },
    { "Wilson C.H.", "male", 174, 74, 23 },
    { "White J.U.", "female", 164, 52, 20 },
    { "Harambe M.M.", "male", 192, 103, 17 },
    { "Rosel V.E.", "female", 160, 45, 21 } };


    for (i = 1; i<5; i++)
    {
        for (j = 1; j<5; j++)
        {
            if (strcmp(humans[j - 1].surn, humans[j].surn) > 0)
            {
                strcpy(t, humans[j - 1].surn);
                strcpy(humans[j - 1].surn, humans[j].surn);
                strcpy(humans[j].surn, t);
            }
        }
    }


    puts("Strings in order are:");

    for (i = 0; i<5; i++)
    {
        printf("\n %s\tsex: %s\theight: %d\tweight: %d\tage: %d\n\n", humans[i].surn, humans[i].sex, humans[i].hght, humans[i].wght, humans[i].age);
    }

    for (i = 0; i < 5; i++)
    {
        //scanf("%f", &humans[i].hght);
        sum1 = sum1 + humans[i].hght;
    }

    for (i = 0; i < 5; i++)
    {
        //scanf("%f", &humans[i].wght);
        sum2 = sum2 + humans[i].wght;
    }

    am1 = sum1 / n;
    printf("\n\nArithmetic Mean of students height = %f\n", am1);

    am2 = sum2 / n;
    printf("\n\nArithmetic Mean of students weight = %f\n", am2);

    return 0;

}
Подякували: dasha-w1

4

Re: Зв'язані списки в C HELP

Це був вказівник до елементів структури humans

struct people *p = humans;

5

Re: Зв'язані списки в C HELP

Дуже дякую за код!))))))
Тепер все працює :)


P.s. Ви найкращі!)))))

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

6

Re: Зв'язані списки в C HELP

dasha-w написав:

Це був вказівник до елементів структури humans

struct people *p = humans;

Це в завданні до лабораторної потрібно було використовувати вказівники, чи ви самі його туди поставили ?

7

Re: Зв'язані списки в C HELP

Ні, сама поставила

Ось моє завдання:

З клавіатури ввести послідовність записів, які містять дані медичного обстеження студентів: <Прізвище>, <Вік>, <Стать> ,<Зріст>, <Вага>. Роздрукувати введені дані у вигляді таблиці, відсортувавши їх за прізвищами студентів в абетковому порядку. Визначити середній зріст і вагу студентів жіночої і чоловічої статі. //можливо вони мали на увазі визначити окремо зріст і вагу студентів жіночої і чоловічої статі

8 Востаннє редагувалося Betterthanyou (10.12.2016 21:05:02)

Re: Зв'язані списки в C HELP

dasha-w написав:

Ні, сама поставила

Він там не потрібний, якщо хочете почитайте тут про вказівники
вказівники

Подякували: dasha-w1

9

Re: Зв'язані списки в C HELP

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

 

  for (i = 1; i < 5; i++)
    {
        if (humans[i].wght == humans[i].sex == humans[male].sex)
        {
            sum2 = sum2 + humans[i].wght;
        }
    }

10 Востаннє редагувалося Betterthanyou (10.12.2016 21:40:49)

Re: Зв'язані списки в C HELP

for (i = 0; i < 5; i++)
    {
        if (strcmp(humans[i].sex,"male")==0)
        {
            sum2 = sum2 + humans[i].wght;
        }
    }

так працює ?

Подякували: dasha-w1

11

Re: Зв'язані списки в C HELP

Працює, але я не розумію, чого коли суму ваги чоловічої статі поділити на 3 (кількість), то виходить середня вага 32

12

Re: Зв'язані списки в C HELP

А ні, тепер все гаразд
Дякую)

13 Востаннє редагувалося Betterthanyou (10.12.2016 21:53:52)

Re: Зв'язані списки в C HELP

до речі, напишу про порівняння

humans[i].wght == humans[i].sex == humans[male].sex

таке порівняння точно працювати не буде, тому що ви не використовуєте логічні операції (І, АБО, НЕ)

humans[i].wght == humans[i].sex

дає логічний false (0) чи true(1), а потім ви порівнюєте 0 або 1 з humans[male].sex.

і ще "male" в humans[male].sex має бути цілочисловою змінною, тобто квадратні дужки [] це не рядок

Подякували: dasha-w1

14

Re: Зв'язані списки в C HELP

А в даному випадку ==0 означає просто дорівнює?

 if (strcmp(humans[i].sex,"male")==0)

15

Re: Зв'язані списки в C HELP

dasha-w написав:

А в даному випадку ==0 означає просто дорівнює?

 if (strcmp(humans[i].sex,"male")==0)

Я використав функцію strcmp яка порівнює символьний рядок, в документації написано якщо 0 то вміст обох рядків рівні, тому якщо написати

strcmp(humans[i].sex,"male")==0

можна перевірити чи рядки рівні,
дорівнює "=" - це знак присвоєння, а два таких знака "==" утворюють порівняння (еквівалентність)

Подякували: dasha-w1

16

Re: Зв'язані списки в C HELP

dasha-w написав:

А в даному випадку ==0 означає просто дорівнює?

 if (strcmp(humans[i].sex,"male")==0)

Так. Відсутність відмінностей між рядкками.

Чому не можна зробити просто if(humans[ i ].sex=="male"): оператор порівняння, застосований до рядків, порівнює не їх вміст, а адреси (в даному випадку, адресу humans[ i ].sex та адресу константного рядка "male", тому завжди повертатиме нам 0 (тобто, хибність, false).
Тому доводиться використовувати функцію strcmp, яка перебирає символи порівнюваних рядків від першого до останнього, доки не знайде пешу відмінність, після чого повертає різницю між кодами цих двох неоднакових символів — отриманий результат тоді буде додатнім чи від'ємним числом, його також можна використати для сортування рядків. Якщо ж рядки мають однакову довжину (мається на увазі не довжина масиву в пам'яті, а кількість символів до кінцевого нуль-символа), і всі символи в них однакові, то результатом буде 0, що означає відсутність відмінностей.

Подякували: dasha-w1