Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2020, 21:18   #1
Artemii21
Пользователь
 
Регистрация: 04.04.2020
Сообщений: 26
Восклицание си, Обработка информации о рейсах

помогите пожалуйста выполнить структурную сортировку "пузырьком" (сортировка по возрастанию количества мест в самолете). Написал программку, но что-то не выходит пузырьковая сортировка. Никаких лишних функций использовать не разрешили. Буду заранее благодарен за помощь!

Код:
#include<stdio.h>
#include<conio.h>
#include<limits.h>
#include<string.h>
 
struct cena{
float price;
char classs[10];
};
struct tip{
char name[50];
int kolvo_mest;
};
struct aeroport{ struct tip samolet; struct cena bilet;
char vzlet[80];
char posadka[80];
};
// VVOD DANNIH
void intr(struct aeroport a[], int n)
{
int i; for (i=0;i<n;i++) {
puts("\nMESTO VZLETA: \n"); scanf("%s",&a[i].vzlet);
puts("\nMESTO POSADKI: \n"); scanf("%s",&a[i].posadka);
puts("\nNAME SAMOLETA: \n"); scanf("%s",&a[i].samolet.name);
do {
puts("\nKOL-VO MEST: \n"); scanf("%d",&a[i].samolet.kolvo_mest);
}
while (a[i].samolet.kolvo_mest<1);
do {
puts("\nPRICE BILETA: \n"); scanf("%f",&a[i].bilet.price);
}
while (a[i].bilet.price<1);
puts("\nCLASS: \n"); scanf("%s",&a[i].bilet.classs);
}
}
 
 
 
// MAIN FUNCTION
 main()
{
int n,i,j,m;
printf("Vvedite n:"); scanf("%i", &n);
struct aeroport a[100];
intr(a, n);
 
// VIVOD STRUCTURI PO CISLU
for (i=1;i<a;i++)
{
if (strcmp(a[i-1].samolet.kolvo_mest, a[i].samolet.kolvo_mest)>0)
 
m=a[i-1].samolet.kolvo_mest;
a[i-1].samolet.kolvo_mest=a[i].samolet.kolvo_mest;
a[i].samolet.kolvo_mest=m;
}
for (i=1;i<a;i++)
{
printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n",i+1,a[i].vzlet,a[i].posadka,a[i].samolet.name,a[i].samolet.kolvo_mest,a[i].bilet.price,a[i].bilet.classs);
}
 
// VIVOD STRUCTURI PO SIMVOLU
for (char c='a';c<='z';c++)
    for (i=0;i<n;i++)
    if (strchr(strlwr(a[i].vzlet),c)-a[i].vzlet==0)
    printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n",i+1,a[i].vzlet,a[i].posadka,a[i].samolet.name,a[i].samolet.kolvo_mest,a[i].bilet.price,a[i].bilet.classs);
 
 
}
Artemii21 вне форума Ответить с цитированием
Старый 13.04.2020, 22:57   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Во-первых, не нужно брать адреса vzlet, posadka, name, classs при считывании. Во-вторых, не нужно сравнивать i с массивом a при выводе. В-третьих, не нужно пытаться сравнивать с помощью strcmp два числа. В-четвертых, менять местами нужно все содержимое структуры аэропорт, а не только количество мест. Сам алгоритм сортировки не смотрел.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.04.2020, 09:17   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,561
По умолчанию

Для быстроты и при большом объёме данных я бы проиндексировал массив структур и при "пузырянии" изменял бы только индексный массив. А при финальном выводе - брал бы номер очередного элемента структуры в порядке прохода индексного массива. Меньше перестановок - точно будет быстрее. Но запутаннее
digitalis вне форума Ответить с цитированием
Старый 14.04.2020, 16:57   #4
Artemii21
Пользователь
 
Регистрация: 04.04.2020
Сообщений: 26
Сообщение си, списки, структуры

Помогите пожалуйста, как добавить новую строку в список и удалить существующую? Я хуже чайника в си и вообще не понимаю, как это сделать. У меня есть такая программа:

Код:
#include<stdio.h>
#include<conio.h>
#include<limits.h>
#include<string.h>
 
struct cena {
    float price;
    char classs[10];
};
struct tip {
    char name[50];
    int kolvo_mest;
};
struct aeroport {
    struct tip samolet; struct cena bilet;
    char vzlet[80];
    char posadka[80];
};
// VVOD DANNIH
void intr(struct aeroport a[], int n)
{
    int i; for (i = 0; i < n; i++) {
        puts("\nMESTO VZLETA: \n"); scanf("%s", &a[i].vzlet);
        puts("\nMESTO POSADKI: \n"); scanf("%s", &a[i].posadka);
        puts("\nNAME SAMOLETA: \n"); scanf("%s", &a[i].samolet.name);
        do {
            puts("\nKOL-VO MEST: \n"); scanf("%d", &a[i].samolet.kolvo_mest);
        } while (a[i].samolet.kolvo_mest < 1);
        do {
            puts("\nPRICE BILETA: \n"); scanf("%f", &a[i].bilet.price);
        } while (a[i].bilet.price < 1);
        puts("\nCLASS: \n"); scanf("%s", &a[i].bilet.classs);
    }
}
 
void PrintAndSort(struct aeroport a[], int n)
{
    //sortirovka puzirikom
    int tmp;
    for (int i = n - 1; i >= 0; --i)
    {
        for (int j = 0; j < i; ++j)
        {
            //sravnivaem elementi massiva structur po kol-vu mest
            if (a[j].samolet.kolvo_mest > a[j + 1].samolet.kolvo_mest)
            {
                struct aeroport tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n", i + 1, a[i].vzlet, a[i].posadka, a[i].samolet.name, a[i].samolet.kolvo_mest, a[i].bilet.price, a[i].bilet.classs);
    }
}
 
 
// MAIN FUNCTION
main()
{
    int n, i, j, m;
    printf("Vvedite n:"); scanf("%i", &n);
    struct aeroport a[100];
    intr(a, n);
 
    // VIVOD STRUCTURI PO CISLU
    PrintAndSort(a, n);
    printf("\n");
    // VIVOD STRUCTURI PO SIMVOLU
    for (char c = 'a'; c <= 'z'; c++)
        for (i = 0; i < n; i++)
            if (strchr(strlwr(a[i].vzlet), c) - a[i].vzlet == 0)
                printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n", i + 1, a[i].vzlet, a[i].posadka, a[i].samolet.name, a[i].samolet.kolvo_mest, a[i].bilet.price, a[i].bilet.classs);
    // POISK PO MESTU VZLETA
    char vzleti[200];
    printf("\nSTRANA VZLETA: ");
    scanf("%s", &vzleti);
    for (i = 0; i < n; i++)
    {
        if (strcmp(a[i].vzlet, vzleti) == 0)
        {
            printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n", i + 1, a[i].vzlet, a[i].posadka, a[i].samolet.name, a[i].samolet.kolvo_mest, a[i].bilet.price, a[i].bilet.classs);
        }
    }
}
И есть небольшой фрагмент другой программы, как выполняется удаление, но ничего не ясно, что да как. Может вы поможете разобраться и написать? Прошу!!!

Код:
void delete(student a[100], int *pm)
{ 
char name[100]; 
int k,i;
if (!(*pm)) 
printf("\nNet takogo studenta!");
else { 
printf("Vvedite Name studenta kotorogo hotite udaliti: ");
fflush(stdin); 
gets(name); 
if (poisk(a, *pm, name)) 
{ 
k=pozitia(a, name);
for (i=k;i<(*pm)-1;i++)
 a[i]=a[i+1];
 (*pm)--; 
}
else printf("\nNet takogo studenta v spiske!"); }}
Artemii21 вне форума Ответить с цитированием
Старый 14.04.2020, 19:16   #5
Artemii21
Пользователь
 
Регистрация: 04.04.2020
Сообщений: 26
Восклицание си, структуры (списки)

Я объявил структуру, ввел информацию (о рейсах по задаче), теперь необходимо добавить новую строку к уже имеющимся (количество строк n). Попробовал сделать, но не вышло. Я хуже чайника в си, поэтому помогите пожалуйста справиться с этим заданием.
P.S. нужно с клавиатуры добавить новую информацию к уже имеющейся, в смысле, у меня есть данные о полетах: место вылета, место посадки, название самолета, кол-во мест, цена билета, класс. Я ввожу эти данные сначала с консоли (Москва, Париж, аэробус320, 156мест, 2000р, класс с), и теперь мне нужно добавить еще к этому новую похожую строку.
Код:
#include<stdio.h>
#include<conio.h>
#include<limits.h>
#include<string.h>

struct cena {
    float price;
    char classs[10];
};
struct tip {
    char name[50];
    int kolvo_mest;
};
struct aeroport {
    struct tip samolet; struct cena bilet;
    char vzlet[80];
    char posadka[80];
};
//  DATE OTPUT
void intr(struct aeroport a[], int n)
{
    int i; for (i = 0; i < n; i++) {
        puts("\nMESTO VZLETA: \n"); scanf("%s", &a[i].vzlet);
        puts("\nMESTO POSADKI: \n"); scanf("%s", &a[i].posadka);
        puts("\nNAME SAMOLETA: \n"); scanf("%s", &a[i].samolet.name);
        do {
            puts("\nKOL-VO MEST: \n"); scanf("%d", &a[i].samolet.kolvo_mest);
        } while (a[i].samolet.kolvo_mest < 1);
        do {
            puts("\nPRICE BILETA: \n"); scanf("%f", &a[i].bilet.price);
        } while (a[i].bilet.price < 1);
        puts("\nCLASS: \n"); scanf("%s", &a[i].bilet.classs);
    }
}
    // FUNCTION OF EDDING NEW INFORMATION TO THE STRUCTURE
void extension (aeroport a[100], int *pn)
{ aeroport s;
int poz; if(*pn>20) printf("\nNET MEST!");
else { poz=-1;
printf("\nVVEDITE MESTO VZLETA: ");
fflush(stdin); gets(s.vzlet);
printf("\nVVEDITE MESTO POSADKI: ");
fflush(stdin); gets(s.posadka);
printf("\nVVEDITE NAME OF SAMOLETA: ");
fflush(stdin); gets(s.samolet.name);
printf("\nVVEDITE KOL-VO MEST: ");
scanf("%d",&s.samolet.kolvo_mest);
printf("\nVVEDITE PRICE: ");
scanf("%d",&s.bilet.price);
printf("\nVVEDITE CLASS: ");
fflush(stdin); gets(s.bilet.classs);
if ((strcmpi(s.vzlet,a[(*pn)-1].vzlet))>0) { a[(*pn)]=s; (*pn)++; }
else { if (!(*pn)) a[(*pn)++]=s;
else { if ((strcmpi(a[0].vzlet,s.vzlet))>0) poz=0; else {poz++;
for ( int i=0;i<((*pn)-1);i++)
    if (((strcmpi(a[i].vzlet,s.vzlet))<0)&&((strcmpi(a[i+1].vzlet,s.vzlet))>0));
    poz=i+1;}
    if (poz!=-1) { for (int j=(*pn);j>poz;j--} a[j]=a[j-1]; a[poz]=s; (*pn)++;}}}}



// MAIN FUNCTION
main()
{
    int n, i, j, m;
    printf("Vvedite n:"); scanf("%i", &n);
    struct aeroport a[100];
    intr(a, n);

    for (i = 0; i < n; i++)
    {
            printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n", i + 1, a[i].vzlet, a[i].posadka, a[i].samolet.name, a[i].samolet.kolvo_mest, a[i].bilet.price, a[i].bilet.classs);
    }
    // EDDING NEW INFORMATION TO THE STRUCTURE

}
Artemii21 вне форума Ответить с цитированием
Старый 14.04.2020, 19:41   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

1) Не нужно брать адрес от указателя на строку при считывании (vzlet, posadka и т.д.).
2) Зачем такая сложная проверка на первый символ?
Код:
if (a[i].vzlet[0] == c || a[i].vzlet[0] - 32 == c)
3) Чтобы удалить строку из массива, не меняя порядка строк:
Выбрать индекс строки для удаления j.
Пройтись от индекса j до n - 2 и сохранить строку k + 1 в строку k.
Уменьшить количество n имеющихся строк на единицу.
4) Мне кажется стоит завести отдельную функцию fill_data(struct aeroport *a) для считывания информации об одном рейсе, чтобы не писать один и тот же код.
5) Для добавления новой строки.
Убедиться, что в массиве есть место.
Считать строку.
Выбрать индекс добавления строки j.
Пройтись от индекса n - 1 до j и сохранить строку k в строку k + 1.
Увеличить количество n имеющихся строк на единицу.
Записать в индекс j новую строку.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.04.2020 в 20:00.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка символьной информации Роман97 Помощь студентам 3 13.02.2014 22:16
обработка символьной информации Sangreal Помощь студентам 2 12.12.2011 22:12
Обработка символьной информации kop Общие вопросы C/C++ 2 17.04.2011 02:10
Обработка текстовой информации С++ Перфаратар Общие вопросы C/C++ 2 30.11.2010 21:12