Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> си структуры 
:(
    Опции темы
neiromagick
Дата 15.1.2011, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.1.2011

Репутация: нет
Всего: нет



ни чего не могу придумать помогите(
Различные цеха завода выпускают продукцию нескольких наименований. Сведения о выпущенной продукции включают:
-    наименование;
-    количество;
-    номер цеха.
Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества.

PM MAIL   Вверх
semibug
Дата 15.1.2011, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Например так.
Цех можно представить списком (std::list) из элементов структуры, включающей в себя имя (std::string), количество (int) и номер цеха.
Сортировать с помощью list.sort.
Все цеха запихать в std::vector

И даже лучше так:
Собственно даже не цех, а все сведения о продукции можно представить списком. А сортировать по убыванию кол-ва + по номеру цеха.


Код

struct PriceListItem
{
  std::string name;
  int price;
  int vendor;
};

std::list < PriceListItem > priceList;

fillPriceList( priceList );
priceList.sort( someSort );
printPriceList( priceList );




Это сообщение отредактировал(а) semibug - 15.1.2011, 20:49
PM   Вверх
Cheloveck
Дата 15.1.2011, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



semibug, ТС, вроде бы, хотел Си, откуда std::list, std::vector и std::string?

Вот на си. Пример далёк от оптимального кода. Тут с производительностью кое-где проблемы и с менеджментом памяти не красиво как-то.
Код

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>


/* Структура, описывающая продукцию. */
typedef struct CProduct
{
    /* Имя продукта. */
    char * mp_name;
    /* Количество. */
    int m_count;
    /* Номер цеха. */
    int m_workshop_number;
} CProduct;


/* Создаёт продукцию, размещая его в куче. */
CProduct * MakeProduct(char * name, int name_length,
    int count, int workshop_number)
{
    CProduct * product = (CProduct *)malloc(sizeof(CProduct));
    product->mp_name = (char *)malloc(sizeof(char) * (name_length + 1));
    strcpy(product->mp_name, name);
    product->m_count = count;
    product->m_workshop_number = workshop_number;
    return product;
}

/* Освобождает память, занятую функцией MakeProduct. */
void FreeProduct(CProduct * product)
{
    free(product->mp_name);
    free(product);
}

/* Освобождает память массива продукции. */
void FreeProductArray(CProduct ** products)
{
    int i;
    /* Последним элемента массива является NULL. */
    for(i = 0; NULL != products[i];    ++i)
        FreeProduct(products[i]);
    free(products);
}

/* Печатает информацию о продукции. */
void PrintProduct(CProduct * product)
{
    printf("Workshop: %d\nProduct name: %s\nProduct count: %d\n\n",
        product->m_workshop_number, product->mp_name,
        product->m_count);
}

/* Печатает информацию о каждой продукции в массиве. */
void PrintProductsArray(CProduct ** products)
{
    int i;
    /* Последним элемента массива является NULL. */
    for(i = 0; NULL != products[i];    ++i)
        PrintProduct(products[i]);
}

/* Генерирует продукцию случайным образом. */
CProduct ** GenerateProducts()
{
    /* Количество не менее 2, но не более 302. */
    int count = rand() % 300 + 2;
    CProduct ** products = (CProduct **)malloc(sizeof(CProduct *) *
        (count + 1));
    int i;
    /* Имена продукций. */
    char * names[] = { "A", "B", "C", "D", "E" };
    CProduct * prod = NULL;
    
    for(i = 0; i < count - 1; ++i)
    {
        /* Создаём что-то совершенно случайное. */
        prod = MakeProduct(
            names[rand() % 5], /* Случайный тип продукции. */
            1,                 /* Количество символов в имени. */
            rand() % 1000,     /* Количество продукции. */
            rand() % 5 + 1);   /* Номер цеха (1..5). */
        products[i] = prod;
    }
    products[count - 1] = NULL;
    return products;
}

/* Функция генерирует массив продукции из другого массива так, что
в результате получаем массив из продуктов одного цеха. */
CProduct ** ExtractProductsByWorkshopNumber(CProduct ** products, int number)
{
    int count = 0;
    int i = 0;
    int j = 0;
    CProduct ** extracted_products = NULL;

    for(i = 0; NULL != products[i]; ++i)
        if(products[i]->m_workshop_number == number)
            ++count;

    if(0 != count)
    {
        extracted_products = (CProduct **)malloc(
            sizeof(CProduct *) * (count + 1));

        for(i = 0; NULL != products[i]; ++i)
        {
            if(products[i]->m_workshop_number == number)
            {
                extracted_products[j] = MakeProduct(
                    products[i]->mp_name,
                    strlen(products[i]->mp_name),
                    products[i]->m_count,
                    products[i]->m_workshop_number);
                ++j;
            }
        }
        extracted_products[count] = NULL;
    }
    return extracted_products;
}

/* Подсчитывает количество элементов в массивеисходя из того,
что последний элемент равен NULL. */
int GetArrayProductsCount(CProduct ** products)
{
    int count = 0;
    while(NULL != products[count])
        ++count;
    return count;
}

/* Меняет значения двух объектов местами. */
void Swap(CProduct * p1, CProduct * p2)
{
    int ws = p2->m_workshop_number;
    int count = p2->m_count;
    char * name = p2->mp_name;

    p2->mp_name = p1->mp_name;
    p2->m_workshop_number = p1->m_workshop_number;
    p2->m_count = p1->m_count;
    p1->mp_name = name;
    p1->m_workshop_number =ws;
    p1->m_count = count;
}

/* Сортировка пузырьком, така как мне лень писать что-то иное =) */
void Sort(CProduct ** products)
{
    int count = GetArrayProductsCount(products);
    int i, j;

    for(i = 1; i < count; ++i)
    {
        for(j = 1; j < count; ++j)
        {
            if(products[j - 1]->m_count < products[j]->m_count)
                Swap(products[j - 1], products[j]);
        }
    }
}

int main()
{
    srand(time(NULL));

    CProduct ** products = GenerateProducts();
    CProduct ** prosucts_ws1 = ExtractProductsByWorkshopNumber(
        products, 2);

    if(NULL != prosucts_ws1)
    {
        Sort(prosucts_ws1);
        PrintProductsArray(prosucts_ws1);
        FreeProductArray(prosucts_ws1);
    }
    else
    {
        printf("Products not found\n");
    }
    
    FreeProductArray(products);
    
    return 0;
}


По типу продукции сам отсортируешь, а то тебе совсем делать нечего будет  smile 

Это сообщение отредактировал(а) Cheloveck - 15.1.2011, 22:31


--------------------
user posted image
PM Jabber   Вверх
neiromagick
Дата 15.1.2011, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.1.2011

Репутация: нет
Всего: нет



спасибо большое))посоветуйте ещё чего прочесть умного))
PM MAIL   Вверх
Cheloveck
Дата 15.1.2011, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



neiromagickFAQ


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1046 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.