1

Тема: Використання структур і функцій

Я студент і пишу на С.В мене є таке завдання:.З клавіатури ввести інформацію про автомобілі, що прийматимуть участь у змаганнях: <Марка>, <Рік випуску>, <Об’єм двигуна>, <Власник>. Роздрукувати введений список у вигляді таблиці. Потім відсортувати його за об’ємами двигунів у спадному порядку і ще раз надрукувати. Визначити і вказати кількість автомобілів кожної марки.Я зміг реалізувати майже всі частини програми,але мені важко визначити і вказати кількість автомобілів кожної марки(це я намагався реалізувати в функції NumbOfCars).Ніяк не можу зрозуміти в чому проблема.Шукав чи є подібні завдання на інших форумах,але саме такої проблеми чомусь не найшов.Буду вдячним за допомогу.

#include <stdio.h>
#include <stdlib.h>
#define MAX 20
typedef struct Competition_list {
    char model[20];
    int year;
    int engvol;
    char owner[30];
}car;
car clist[MAX];
void Print(int numb);
void SelectionSort(int numb); //прототипи функцій
void GetData(int numb);
void NumbOfCars(int numb);
int main(void) {
    system("chcp 1251");
    int numb;
    printf("Введіть інформацію про учасників змагань:\n");
    printf("Введіть кількість учасників:");
    scanf_s("%d", &numb);
    rewind(stdin); //для очищення буфера введення
    GetData(numb);
    puts("Список учасників:");
    Print(numb);
    puts("\nВідсортований список:");
    SelectionSort(numb);
    Print(numb);
    NumbOfCars(numb);
    return 0;
}
void GetData(int numb) { //функція введення даних
    puts("\t\tДані:");
    for (int i = 0; i <numb; i++) {
        printf("%d-й учасник:\n", i + 1);
        printf("1)Марка машини:");
        gets_s((clist + i)->model);
        rewind(stdin);
        printf("2)Рік випуску автомобіля:");
        scanf_s("%d", &clist[i].year);
        printf("3)Об'єм двигуна:");
        scanf_s("%d", &clist[i].engvol);
        rewind(stdin);//для очищення буфера введення
        printf("4)Власник:");
        gets_s((clist + i)->owner);
        puts("");

    }
}
void NumbOfCars(int numb) {
    puts("\nКількість автомобілів кожної марки:");
    int i, j, count = 1, freqarr[MAX];
    for (i = 0; i < numb; i++) {
        for (j =i+1; j != 0; j++) {
            if (clist[i].model == clist[j].model)
                freqarr[i] = count + 1;
            else
                freqarr[i] = count;
        }
    }
    for (i = 0; i < numb; i++) {
        printf("%d.Марка авто:%-20.18s Кількість машин:%d\n", i + 1, (clist + i)->model, freqarr[i]);
    }
}
 void SelectionSort(int numb) {  //цикл сортування вибором
    car tmp,*maxelm,*sortitem;
    for (int i = 0; i < numb; i++) {
        for (int k =i+1; k < numb; k++) {
            maxelm = clist + i; sortitem = clist +k;
            if (maxelm->engvol < sortitem->engvol) {
                tmp =*maxelm;
                *maxelm = *sortitem;
                *sortitem = tmp;
            }
        }
    }
 }
void Print(int numb){ //виведення таблиці
    for (int i = 0; i < numb; i++) {
        printf("%d.%-20.18s%-9.4d%-8.3d%-30.22s\n", i + 1, (clist + i)->model, (clist + i)->year, (clist + i)->engvol, (clist + i)->owner);
    }
}

2

Re: Використання структур і функцій

В режимі дебагера код запустіть -- виявляє помилки.
Та \ або покроково -- допомагає знайти баги саме в алгоритмі.

3

Re: Використання структур і функцій

Особисто в мене компілятор помилок не бачить, але при запуску сам алгоритм не виводить нічого.

4

Re: Використання структур і функцій

От і кажу, запускати покроково.
Так стане зрозуміло що не так з алгоритмом.

5

Re: Використання структур і функцій

Проблема в мому алгоритму-це функція NumbofCars. Але як вирішити цю проблему я, на жаль, не знаю.

6

Re: Використання структур і функцій

Вирішив для зручності додати ще одну структуру.Реалізував функцію і вона як на диво рахує.Але не можу зрозуміти чому я не можу порівнювати значення

clist[i].model == clist[j].model

.Хоча і масиви model  і їх значення бувають повністю одинакові.Ще було б добре ,якщо б хтось допоміг обмежити виведення функцією NumbofCars(це стосовно того,як обмежити елементи масиву для виведення,або скоротити масив,якщо це,звичайно,можливо.

#include <stdio.h>
#include <stdlib.h>
#define MAX 20
typedef struct Competition_list {
    char model[MAX];
    int year;
    int engvol;
    char owner[30];
}car;
car clist[MAX];
struct Carss {
    char model[MAX];
    int count=1;
}carss[MAX];
void Print(int numb);
void SelectionSort(int numb); //прототипи функцій
void GetData(int numb);
void NumbOfCars(int numb);
int main(void) {
    system("chcp 1251");
    int numb;
    printf("Введіть інформацію про учасників змагань:\n");
    printf("Введіть кількість учасників:");
    scanf_s("%d", &numb);
    rewind(stdin); //для очищення буфера введення
    GetData(numb);
    puts("Список учасників:");
    Print(numb);
    puts("\nВідсортований список:");
    SelectionSort(numb);
    Print(numb);
    NumbOfCars(numb);
    return 0;
}

void GetData(int numb) { //функція введення даних
    puts("\t\tДані:");
    for (int i = 0; i < numb; i++) {
        printf("%d-й учасник:\n", i + 1);
        printf("1)Марка машини:");
        gets_s((clist + i)->model);
        rewind(stdin);
        printf("2)Рік випуску автомобіля:");
        scanf_s("%d", &clist[i].year);
        printf("3)Об'єм двигуна:");
        scanf_s("%d", &clist[i].engvol);
        rewind(stdin);//для очищення буфера введення
        printf("4)Власник:");
        gets_s((clist + i)->owner);
        puts("");
    }
}
void NumbOfCars(int numb) {
    puts("\nКількість автомобілів кожної марки:");
    int i;
    for (i = 0; i < numb; i++) {
        for (int j = i + 1; j < numb; j++) {
            if (clist[i].engvol == clist[j].engvol && clist[i].year == clist[j].year) {
                *carss[i].model = *clist[i].model;
                    carss[i].count += 1;
            }
            else {
                *carss[i].model = *clist[i].model;
            }
        }
    }
    i++;
    *carss[i].model = '\0';
    for (int i = 0; i < numb; i++) {
        printf("%d.%-20.18s%-9.d\n", i + 1,(carss+i)->model,(carss+i)->count);
    }    
}
void SelectionSort(int numb) {  //цикл сортування вибором
    car tmp, * maxelm, * sortitem;
    for (int i = 0; i < numb; i++) {
        for (int k = i + 1; k < numb; k++) {
            maxelm = clist + i; sortitem = clist + k;
            if (maxelm->engvol < sortitem->engvol) {
                tmp = *maxelm;
                *maxelm = *sortitem;
                *sortitem = tmp;
            }
        }
    }
}

void Print(int numb) { //виведення таблиці
    for (int i = 0; i < numb; i++) {
        printf("%d.%-20.18s%-9.4d%-8.3d%-30.22s\n", i + 1, (clist + i)->model, (clist + i)->year, (clist + i)->engvol, (clist + i)->owner);
    }
}

7

Re: Використання структур і функцій

for (j =i+1; j != 0; j++)

Скільки разів буде виконано тіло цього циклу?

8

Re: Використання структур і функцій

Не зовсім зрозумів питання. В мене немає такого циклу.

9

Re: Використання структур і функцій

Volodymyr54 написав:

Не зовсім зрозумів питання. В мене немає такого циклу.

Стадія 1. Заперечення.
Далі має бути злість.

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

10

Re: Використання структур і функцій

Злісті не буде. Я вирішив свою проблему самостійно.

Подякували: 0xDADA11C71