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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] на файл со строками, требуется самое лёгкое решение задачи 
V
    Опции темы
golden
Дата 15.4.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите с решением задачи, мне требуется самое простое и лёгкое решение.

Задача: Дан файл f, содержащий сведения о кубиках: размер каждого кубика (длина ребра в сантиметрах), его цвет (красный, желтый, зеленый или синий) и материал (деревянный, металлический, картонный). Найти: количество кубиков каждого из перечисленных цветов и их суммарный объем.

Заранее спасибо!
PM MAIL   Вверх
Anikmar
Дата 15.4.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Количество кубиков в файле известно?
PM MAIL ICQ   Вверх
golden
Дата 15.4.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Anikmar @  15.4.2007,  16:49 Найти цитируемый пост)
Количество кубиков в файле известно? 


8 кубиков.

Это сообщение отредактировал(а) golden - 15.4.2007, 17:47
PM MAIL   Вверх
Anikmar
Дата 15.4.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Формат файла: Как разделены между собой описатели? Есть ли жесткое условие или можно разделителем пользоваться?
PM MAIL ICQ   Вверх
golden
Дата 15.4.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Anikmar @  15.4.2007,  18:59 Найти цитируемый пост)
Формат файла: Как разделены между собой описатели? Есть ли жесткое условие или можно разделителем пользоваться?


Условий нет ни каких главное что бы всё было просто и понятно.
PM MAIL   Вверх
Anikmar
Дата 15.4.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Похожую задчку сегодня помог сделать
Итак тестовый фал взял такой:
Код

120    Green    Wood
30    Red    Steel
50    Blue    Cardboard
80    Black    Steel
90    Red    Wood
120    Blue    Paper
50    Red    Cardboard
80    Green    Wood
120    Blue    Steel
110    Green    Cardboard
150    Black    Wood
125    Blue    Steel
126    Green    Paper
110    Black    Cardboard

К сожалению русские буквы у меня в консоли не пашут
Код получился такой:
Код

//---------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <string.h>


#define MAX_CUBE 100

//---------------------------------------------------------------------------
typedef struct
{
    float Rebro;
    char Color[50];
    char Mater[50];
} Cube;

typedef struct
{
    char Name[50];
    int Colvo;
    float Val;
} Color;

typedef struct
{
    char Name[50];
    int Colvo;
    float Val;
} Mater;

Cube Cubes[MAX_CUBE];
Color Colors[MAX_CUBE];
Mater Maters[MAX_CUBE];

int ColvoCubes = 0;
int ColvoMaters = 0;
int ColvoColors = 0;

#pragma argsused

// Читаем информацию о кубиках из файла
void ReadFile(void)
{
    FILE *InputFile;
    char Buff[500];
    char Buff1[500];
    float a;

    InputFile = fopen("Cubes.txt","r");
    if (InputFile == NULL)
    {
        printf("Error open file");
        return;
    }

    while (!feof(InputFile))
    {
        fscanf(InputFile,"%f %s %s",
            &Cubes[ColvoCubes].Rebro,
            Cubes[ColvoCubes].Color,
            Cubes[ColvoCubes].Mater);
            ColvoCubes++;
    }
    fclose(InputFile);
}

// Вывод массива кабиков на экран
void OutCubes(void)
{
    int i;

    for(i=0;i<ColvoCubes; i++)
        printf("%f\t%s\t%s\n",
            Cubes[i].Rebro,
            Cubes[i].Color,
            Cubes[i].Mater);
}

// Добавить цвет
void AddColor(Cube *pCube)
{
    int i;

    for (i=0;i<ColvoColors;i++)
    {
        if (strcmp(Colors[i].Name,pCube->Color) == 0)
        {
            Colors[i].Colvo++;
            Colors[i].Val += pCube->Rebro * pCube->Rebro * pCube->Rebro;
            return;
        }
    }
    // Если попали сюда - значит такого цвета еще не попадалось
    strcpy(Colors[i].Name,pCube->Color);
    Colors[i].Colvo = 1;
    Colors[i].Val = pCube->Rebro * pCube->Rebro * pCube->Rebro;

    ColvoColors ++;
}

// Добавить материал
void AddMater(Cube *pCube)
{
    int i;

    for (i=0;i<ColvoMaters;i++)
    {
        if (strcmp(Maters[i].Name,pCube->Mater) == 0)
        {
            Maters[i].Colvo++;
            Maters[i].Val += pCube->Rebro * pCube->Rebro * pCube->Rebro;
            return;
        }
    }
    // Если попали сюда - значит такого цвета еще не попадалось
    strcpy(Maters[i].Name,pCube->Mater);
    Maters[i].Colvo = 1;
    Maters[i].Val = pCube->Rebro * pCube->Rebro * pCube->Rebro;

    ColvoMaters++;
}

// Подсчет количества кубиков по цветам и материалам
void CalcCubes(void)
{
    int i;

    for(i=0;i<ColvoCubes; i++)
    {
        AddColor(&Cubes[i]);
        AddMater(&Cubes[i]);
    }
}

// Вывод цветов
void OutColors(void)
{
    int i;
    printf("Total colors:\n");
    for(i=0;i<ColvoColors; i++)
        printf("Color: %s\tNumber = %d\tTotal Val = %f\n",
            Colors[i].Name,Colors[i].Colvo,Colors[i].Val);
}

// Вывод материалов
void OutMaters(void)
{
    int i;
    printf("Total materials:\n");
    for(i=0;i<ColvoMaters; i++)
        printf("Material: %s\tNumber = %d\tTotal Val = %f\n",
            Maters[i].Name,Maters[i].Colvo,Maters[i].Val);
}

int main(int argc, char* argv[])
{
    ReadFile();
    printf("Read %d records of cubes\n",ColvoCubes);
    printf("SourceList:\n");
    OutCubes();
    printf("Press ENTER to continue\n");
    getch();
    CalcCubes();
    OutColors();
    OutMaters();
    printf("Press ENTER to Exit\n");
    getch();
    return 0;
}


Вывод программы такой:
Код

Read 14 records of cubes
SourceList:
120.000000      Green   Wood
30.000000       Red     Steel
50.000000       Blue    Cardboard
80.000000       Black   Steel
90.000000       Red     Wood
120.000000      Blue    Paper
50.000000       Red     Cardboard
80.000000       Green   Wood
120.000000      Blue    Steel
110.000000      Green   Cardboard
150.000000      Black   Wood
125.000000      Blue    Steel
126.000000      Green   Paper
110.000000      Black   Cardboard
Press ENTER to continue
Total colors:
Color: Green    Number = 4      Total Val = 5571376.000000
Color: Red      Number = 3      Total Val = 881000.000000
Color: Blue     Number = 4      Total Val = 5534125.000000
Color: Black    Number = 3      Total Val = 5218000.000000
Total materials:
Material: Wood  Number = 4      Total Val = 6344000.000000
Material: Steel Number = 4      Total Val = 4220125.000000
Material: Cardboard     Number = 4      Total Val = 2912000.000000
Material: Paper Number = 2      Total Val = 3728376.000000
Press ENTER to Exit


Добавлено через 2 минуты и 4 секунды
p.s.
Делал на коленках - куча вариантов оптимизации. Но это уж сами.
Проще у меня не получилось - вроде некуда.
PM MAIL ICQ   Вверх
Dov
Дата 16.4.2007, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Ещё вариант:

Исходный файл cube.txt:
Код

3 yellow cardboard
5 red    wooden
3 blue   metallic
6 green  metallic
4 yellow wooden
7 red    cardboard
6 blue   wooden
3 red    metallic


Код
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
    int     red, yellow, green, blue, capacity, side;
    char    color[20], stuff[20];
    FILE*   file;

    if((file = fopen("test.txt", "r")) == 0)
        puts("Unable to open file..\n"), exit(1);

    red = yellow = green = blue = capacity = 0;
    while(fscanf(file, "%d %s %s", &side, color, stuff) != EOF)
    {
        capacity += side * side * side;        
             if(strcmp(color, "red")    == 0)    red++;
        else if(strcmp(color, "yellow") == 0)    yellow++;
        else if(strcmp(color, "green")  == 0)    green++;
        else if(strcmp(color, "blue")   == 0)    blue++;
    } 
    printf("red     : %d\n", red);
    printf("yellow  : %d\n", yellow);
    printf("green   : %d\n", green);
    printf("blue    : %d\n", blue); 
    printf("Capacity: %d\n", capacity);
    fclose(file);

    return 0;
}


Вывод:
Код

red     : 3
yellow  : 2
green   : 1
blue    : 2
Capacity: 1045


Это сообщение отредактировал(а) Dov - 16.4.2007, 01:01


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Anikmar
Дата 16.4.2007, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Предложенный вариант гораздо короче. Правда Dov забыл посчитать объем, но это ерунда.

Мой вариант считает и по цветам и по материалам с количеством до 100 не привязываясь к конкретному названию.
PM MAIL ICQ   Вверх
Dov
Дата 16.4.2007, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Anikmar @  16.4.2007,  08:41 Найти цитируемый пост)
 Правда Dov забыл посчитать объем, но это ерунда.

Anikmar, я не забыл, там считается capacity.  smile  


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Anikmar
Дата 16.4.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(Dov @  16.4.2007,  09:31 Найти цитируемый пост)
Anikmar, я не забыл, там считается capacity.


Недочитали:
Цитата(golden @  15.4.2007,  16:45 Найти цитируемый пост)
и их суммарный объем.


Да не суть. Я просто пошел по пути универсализма  smile 



PM MAIL ICQ   Вверх
Dov
Дата 16.4.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Anikmar @  16.4.2007,  12:01 Найти цитируемый пост)
Недочитали:Цитата(golden @  15.4.2007,  16:45 )и их суммарный объем.

Anikmar, так там суммарный и считается.   smile 
Цитата(Anikmar @  16.4.2007,  12:01 Найти цитируемый пост)
Я просто пошел по пути универсализма

Недочитали:  smile 
Цитата(golden @  15.4.2007,  16:45 Найти цитируемый пост)
мне требуется самое простое и лёгкое решение.




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Anikmar
Дата 16.4.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(Dov @  16.4.2007,  14:56 Найти цитируемый пост)
Anikmar, так там суммарный и считается.    


Я подумал суммарный по каждому цвету  smile 

И вообще - какой код нравится такой пусть заказчик и берет.   smile 
PM MAIL ICQ   Вверх
Dov
Дата 16.4.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Anikmar @  16.4.2007,  15:49 Найти цитируемый пост)
Я подумал суммарный по каждому цвету

Ааааааааааа...!!! Ну, ёпрст, я об этом даже не подумал.  smile 
Возможно, что ты прав.  smile  Вот, что значит не чёткая постановка вопроса. Будем ждать аффтара.  smile  



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
golden
Дата 16.4.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Dov @  16.4.2007,  00:12 Найти цитируемый пост)
exit(1)

Вот на этом месте показывает ошибку, почему?

Добавлено через 2 минуты и 45 секунд
Поставил бы вам парни репутацию +1,да не могу что то говорит мне 100постов надо сделать, всё равно Большое спасибо! 
PM MAIL   Вверх
Anikmar
Дата 16.4.2007, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(golden @  16.4.2007,  19:36 Найти цитируемый пост)
Вот на этом месте показывает ошибку, почему?

А какую ошибку (вкрадчиво)

Может быть что-то вроде Programm terminated exit code = 1 ?
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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