Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] на файл со строками


Автор: golden 15.4.2007, 16:45
Помогите с решением задачи, мне требуется самое простое и лёгкое решение.

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

Заранее спасибо!

Автор: Anikmar 15.4.2007, 16:49
Количество кубиков в файле известно?

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


8 кубиков.

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

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


Условий нет ни каких главное что бы всё было просто и понятно.

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

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.
Делал на коленках - куча вариантов оптимизации. Но это уж сами.
Проще у меня не получилось - вроде некуда.

Автор: Dov 16.4.2007, 00:12
Ещё вариант:

Исходный файл 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

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

Мой вариант считает и по цветам и по материалам с количеством до 100 не привязываясь к конкретному названию.

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

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

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


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


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



Автор: Dov 16.4.2007, 14:56
Цитата(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 Найти цитируемый пост)
мне требуется самое простое и лёгкое решение.


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


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

И вообще - какой код нравится такой пусть заказчик и берет.   smile 

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

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

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

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

Добавлено через 2 минуты и 45 секунд
Поставил бы вам парни репутацию +1,да не могу что то говорит мне 100постов надо сделать, всё равно Большое спасибо! 

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

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

Может быть что-то вроде Programm terminated exit code = 1 ?

Автор: golden 16.4.2007, 19:59
Говорит такое: Function 'exit' should have a prototype

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

golden, подключи:
Код
#include <stdlib.h> 


Автор: golden 16.4.2007, 20:16
Всё спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)