Форум программистов, компьютерный форум CyberForum.ru

По текстовым файлам и строкам - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
05.09.2011, 14:35     По текстовым файлам и строкам #1
Задана последовательность идентификаторов, разделенных сериями пробелов. Последовательность задана строкой символов (string) заканчивается символом ‘*’.
2.Найти длину такого первого идентификатора в котором произведение всех четных цифр максимально. А можно листинг для решения этой задачи по проще написать? без итерраторов и прочих штук, используя только создание файла открытие записать ну и циклы надо для условий, ну без каких то дополнительных возможностей языка, чем проще тем лучше, и чтоб тектовый файл сохранялся и показывал решение задачи. И вот что такое индентификатор в моей задаче? а то если бы понял может сам бы написал я думал это буква но тогда причем тут произведение цифр? откуда тогда цифры возмутся
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2011, 14:35     По текстовым файлам и строкам
Посмотрите здесь:

Работа с текстовым файлом C++
C++ Работа с текстовым файлом
Работа с текстовым массивом C++
C++ Работа с текстовым файлом
Работа с текстовым файлом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.09.2011, 15:09     По текстовым файлам и строкам #2
Цитата Сообщение от lexflax Посмотреть сообщение
И вот что такое индентификатор в моей задаче?
А нам то откуда знать? В конце концов, это Ваша задача.
Я, например, подумал что файл должен быть примерно таким:
Код
1234 5678 901256 12436 *
Цитата Сообщение от lexflax Посмотреть сообщение
откуда тогда цифры возмутся
Ну цифра это тоже символ.
-=ЮрА=-
Заблокирован
Автор FAQ
05.09.2011, 16:16     По текстовым файлам и строкам #3
Цитата Сообщение от lexflax Посмотреть сообщение
Задана последовательность идентификаторов, разделенных сериями пробелов. Последовательность задана строкой символов (string) заканчивается символом ‘*’.
2.Найти длину такого первого идентификатора в котором произведение всех четных цифр максимально. А можно листинг для решения этой задачи по проще написать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <windows.h> //malloc, GetLastError, strerror, system
#include <string.h>  //strtok
#include <stdio.h>   //i/0
 
unsigned long ProizvChetnihCifr(char * str);
 
int main()
{
    char delim[] = "*";//Строка разделителей, т.е разделителями могут быть и другие символы
    //в конктреном случае строка всего из 1-го символа, т.к. разделитель по условию '*'
    char * str,*buf;
    unsigned long sLen, proizved = 0, mproizved = 0;
    FILE * f = fopen("text.txt","rb+");
    if(!f)
        printf("Error open TEXT.TXT:\r\n%s\r\n",strerror(GetLastError()));
    else
    {
        fseek(f,0,SEEK_END);
        sLen = ftell(f);
        fseek(f,0,SEEK_SET);
 
        if(!(str = (char *)malloc(sLen + 1))) //str = длина файла + '\0'
            printf("Error allocation memery:\r\n%s\r\n",strerror(GetLastError()));
        else
        {
            fread(str,sLen,1,f);
            str[sLen] = '\0';
            buf = strtok(str,delim);//Разбиваем строку на токены
            while(buf)
            {
                if(mproizved < (proizved = ProizvChetnihCifr(buf)))
                {
                    mproizved = proizved;
                    sLen = strlen(buf);
                }
                buf = strtok(NULL,delim);
            }
            printf("Dlinna max identificatora : %u\r\n",sLen);
            printf("Proizvedenie chetnih v nem: %u\r\n",mproizved);
        }
        fclose(f);
    }
    system("pause");//Пауза до нажатия любой клавиши
    return 0;
}
 
unsigned long ProizvChetnihCifr(char * str)
{
    
    unsigned long ret = 1;
    unsigned long sLen = strlen(str);   
    for(int i = 0,chislo; i < sLen; i++)
    {
        if(isdigit(str[i]))
        {
            chislo = (int(str[i]) - int('0'));
            if(chislo % 2 == 0)
                ret *= chislo;
        }
    }
    return ret;
}
[Результат работы]
Dlinna max identificatora : 4
Proizvedenie chetnih v nem: 48
Для продолжения нажмите любую клавишу . . .

[Содержимое text.txt]
1234*5678*901256*12436 *654
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
06.09.2011, 02:35  [ТС]     По текстовым файлам и строкам #4
а почему 4 длинней а не 3 в нем то цифр больше по идеи он должен быть длинней
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
06.09.2011, 04:08  [ТС]     По текстовым файлам и строкам #5
Задана последовательность идентификаторов, разделенных сериями пробелов. Последовательность задана строкой символов (string) заканчивается символом ‘*’.
2.Найти длину такого первого идентификатора в котором произведение всех четных цифр максимально.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <windows.h> //malloc, GetLastError, strerror, system
#include <string.h>  //strtok
#include <stdio.h>   //i/0
 
unsigned long ProizvChetnihCifr(char * str);
 
int main()
{
        char delim[] = "*";//Строка разделителей, т.е разделителями могут быть и другие символы
        //в конктреном случае строка всего из 1-го символа, т.к. разделитель по условию '*'
        char * str,*buf;
        unsigned long sLen, proizved = 0, mproizved = 0;
        FILE * f = fopen("text.txt","rb+");
        if(!f)
                printf("Error open TEXT.TXT:\r\n%s\r\n",strerror(GetLastError()));
        else
        {
                fseek(f,0,SEEK_END);
                sLen = ftell(f);
                fseek(f,0,SEEK_SET);
 
                if(!(str = (char *)malloc(sLen + 1))) //str = длина файла + '\0'
                        printf("Error allocation memery:\r\n%s\r\n",strerror(GetLastError()));
                else
                {
                        fread(str,sLen,1,f);
                        str[sLen] = '\0';
                        buf = strtok(str,delim);//Разбиваем строку на токены
                        while(buf)
                        {
                                if(mproizved < (proizved = ProizvChetnihCifr(buf)))
                                {
                                        mproizved = proizved;
                                        sLen = strlen(buf);
                                }
                                buf = strtok(NULL,delim);
                        }
                        printf("Dlinna max identificatora : %u\r\n",sLen);
                        printf("Proizvedenie chetnih v nem: %u\r\n",mproizved);
                }
                fclose(f);
        }
        system("pause");//Пауза до нажатия любой клавиши
        return 0;
}
 
unsigned long ProizvChetnihCifr(char * str)
{
        
        unsigned long ret = 1;
        unsigned long sLen = strlen(str);       
        for(int i = 0,chislo; i < sLen; i++)
        {
                if(isdigit(str[i]))
                {
                        chislo = (int(str[i]) - int('0'));
                        if(chislo % 2 == 0)
                                ret *= chislo;
                }
        }
        return ret;
}
Вот такой вариант дали только не пойму почему пишет что максимальный 4 а не 6?
[Результат работы]
Dlinna max identificatora : 4
Proizvedenie chetnih v nem: 48
Для продолжения нажмите любую клавишу . . .

[Содержимое text.txt]
1234*5678*901256*12436 *654
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 09:24     По текстовым файлам и строкам #6
Цитата Сообщение от lexflax
Цитата Сообщение от -=ЮрА=-
потому что в твоем задании сказано вернуть длинну идентификатора с макс произведением четных цмфр,а это 5678-четные 6*8=48
спасибо )) подскажи еще плиз своими словами что значит некоторые эелемнты в твоем листинге
FILE * f = fopen("text.txt","rb+");-это я так понял адрес береться файла, а зачем rb? после адреса? и для чего fopen пишется?
strerror(GetLastError()-вот это что такое?? и зачем применяется?
fseek(f,0,SEEK_END);
sLen = ftell(f);
fseek(f,0,SEEK_SET);(вот начинаю с fseek 3 строчки не понимаю что означают как и само слово fseek seek_set)
fread(str,sLen,1,f);-вот эта строчка тоже ее не понимаю и не знаю когда слово fread применяется?
Объясни свои словами плиз а то в нете замучаешься искать и заумно объясняется все , хотя своими словами можно все проще и понятней объяснить

FILE * f = fopen("text.txt","rb+"); - предвочитаю 2-ный режим, впринципе ничего не случиться если просто в текстовом его откроешь

strerror() - возвращает строковое лписание ошибки -GetLastError() - получает последнюю ошибку в вызывающем потоке, т.к. работает твоя программа то это как раз и будет ошибка в твоей программе, если strerror - для тебя сложновато, просто убери эту функцию и вставь своё описание

fseek(f,pos,SEEK_END); - перемещает курсор в файле в позицию pos от его конца (SEEK_END) или начала SEEK_SET. (SEEK_END, SEEK_SET - объявленные в stdio.h константы)
ftell(f); - возвращает текущую поззицию курсора в файле

Теперь гляди - переместили курсор вконец файла, спросили позицию (она = длинне файла), вернули курсор вначало, чтобы начать чтение - вот такой вот алгоритм
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
06.09.2011, 09:26     По текстовым файлам и строкам #7
Цитата Сообщение от lexflax Посмотреть сообщение
Вот такой вариант дали только не пойму почему пишет что максимальный 4 а не 6?
48(5678) куда больше чем 12(901256). все верно.
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
07.09.2011, 14:30  [ТС]     По текстовым файлам и строкам #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <windows.h> //malloc, GetLastError, strerror, system
#include <string>  //strtok
#include <iostream.h>
#include <stdio.h>   //i/0
 
int ProizvChetnihCifr(char * str);
int main()
{
        char delim[] = " ";//Строка разделителей, т.е разделителями могут быть и другие символы
        //в конктреном случае строка всего из 1-го символа, т.к. разделитель по условию '*'
        char * str,*buf;
        int sLen, proizved = 0, mproizved = 0;
        FILE * f = fopen("tt.txt","rb+");
        if(!f)
        cout <<"Error open text.TXT:";
        else
        {
                fseek(f,0,SEEK_END);
                sLen = ftell(f);
                fseek(f,0,SEEK_SET);
 
                if(!(str = (char *)malloc(sLen + 1))) //str = длина файла + '\0'
                        cout << "Error allocation memery:";
                else
                {
                        fread(str,sLen,1,f);
                        str[sLen] = '\0';
                        buf = strtok(str,delim);//Разбиваем строку на токены
                        while(buf)
                        {
                                if(mproizved < (proizved = ProizvChetnihCifr(buf)))
                                {
                                        mproizved = proizved;
                                        sLen = strlen(buf);
                                }
                                buf = strtok(NULL,delim);
                        }
                        cout << "Dlinna max identificatora :" << sLen <<endl;
                        cout <<"Proizvedenie chetnih v nem:" << mproizved <<endl;
                }
                fclose(f);
        }
        system("pause");//Пауза до нажатия любой клавиши
        return 0;
}
int ProizvChetnihCifr(char * str)
{
        int ret = 1;
        int sLen = strlen(str);
        for(int i = 0,chislo; i < sLen; i++)
        {
                if(isdigit(str[i]))
                {
                        chislo = (int(str[i]) - int('0'));
                        if(chislo % 2 == 0)
                                ret *= chislo;
                }
        }
        return ret;
}
Как можно заменить строчку FILE * f = fopen("tt.txt","rb+"); другой чтоб самому вводить адрес текствого файла а не тот был который в кавычках??

 Комментарий модератора 
Используйте теги форматирования кода.
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
07.09.2011, 14:36     По текстовым файлам и строкам #9
самое простое.
C++
1
2
3
4
char file_name[256];
printf("Please,enter the filename.");
scanf("%s",file_name);
FILE * f = fopen(file_name,"rb+");
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 14:44     По текстовым файлам и строкам #10
в ней заменил выводы на cout мне так проще, пробывал сделать так чтоб самому вводить адрес текствого файла и не использовать fopen

C++
1
2
3
4
5
char szFilePath[256];
cout<<"Vvedite ima faila\r\n";
cin>>szFilePath;
ifstream inFile;
inFile.open(szFilePath)
Это повлечёт изменения в алгоритме чтения (будут использованы другие функции), переписать код под С++?
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 15:07     По текстовым файлам и строкам #11
Вариант С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <fstream.h> //file i/o
#include <iostream.h>//i/o
 
#include <stdlib.h>  //strlen
#include <string.h>  //strtok
#include <ctype.h>   //isdigit
 
unsigned long ProizvChetnihCifr(char * str);
 
int main()
{
    char delim[] = "*";//Строка разделителей, т.е разделителями могут быть и другие символы
    //в конктреном случае строка всего из 1-го символа, т.к. разделитель по условию '*'
    char * str,*buf;
    unsigned long sLen, proizved = 0, mproizved = 0;
 
    char szFilePath[256];
    cout<<"Vvedite imya fila ";
    cin>>szFilePath;
    ifstream outf(szFilePath);
    if(!outf)
        cout<<"Error open txt.txt\r\n";
    else
    {
        outf.seekg(0,ios::end);
        sLen = outf.tellg();
        outf.seekg(0,ios::beg);
 
        if(!(str = new char[sLen + 1])) //str = длина файла + '\0'
            cout<<"Error allocation memery\r\n";
        else
        {
            outf.read(str,sLen);
            str[sLen] = '\0';
            buf = strtok(str,delim);//Разбиваем строку на токены
            while(buf)
            {
                if(mproizved < (proizved = ProizvChetnihCifr(buf)))
                {
                    mproizved = proizved;
                    sLen = strlen(buf);
                }
                buf = strtok(NULL,delim);
            }
            cout<<"Dlinna max identificatora : "<<sLen<<"\r\n";
            cout<<"Proizvedenie chetnih v nem: "<<mproizved<<"\r\n";
        }
        outf.close();
        if(str)//Чистка не обязательна т.к. после strtok str == NULL
            delete [] str;
    }
    cout<<"Press any key to continue\r\n";
    char ch;cin>>ch;
    return 0;
}
 
unsigned long ProizvChetnihCifr(char * str)
{
    
    unsigned long ret = 1;
    unsigned long sLen = strlen(str);   
    for(int i = 0,chislo; i < sLen; i++)
    {
        if(isdigit(str[i]))
        {
            chislo = (int(str[i]) - int('0'));
            if(chislo % 2 == 0)
                ret *= chislo;
        }
    }
    return ret;
}
Миниатюры
По текстовым файлам и строкам  
LosAngeles
Заблокирован
07.09.2011, 15:13     По текстовым файлам и строкам #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вариант С++
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char delim[]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
buf = strtok(str,delim);
и устаревший стиль хидеров => это не С++ way
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 15:30     По текстовым файлам и строкам #13
Цитата Сообщение от LosAngeles Посмотреть сообщение
устаревший стиль хидеров
- через месяц примут стандарт вернуть h в заголовки и тогда все будут кричать, как же это без без точки и ш
А ещё приведи мне цитату из стандарта, который именно запрешает использование char и говорит что string нужно писать
Ну а тут мне вообще не понятно
C++
1
buf = strtok(str,delim);
- С++ запрещает использовать функции стандартной библиотеки??7
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.09.2011, 16:10     По текстовым файлам и строкам #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
изменения в алгоритме чтения
Это какие, например?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
будут использованы другие функции
Ах, вот что... алгоритм и функции, используемые для реализации алгоритма, все же разные вещи..
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 16:17     По текстовым файлам и строкам #15
Цитата Сообщение от fasked Посмотреть сообщение
алгоритм и функции
- алгоритм чтения остался без изменений, только функции fstream-ские заюзаны вместо stdio-вских, а вот что касается инициализации потока - алгоритм другой - fopen - использована функция по инициализации потока, а здесь вообще конструктор ifstream outf(szFilePath), так что в общем случае алгоритм чтения немного изменился

Добавлено через 1 минуту
fasked, я тут по этому замечанию LosAngeles-а, что тут не по С++
Цитата Сообщение от LosAngeles Посмотреть сообщение
char delim[]
- то что стринг не заюзал?Я уже мозг сломал
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.09.2011, 16:18     По текстовым файлам и строкам #16
-=ЮрА=-, то есть... Вы хотите сказать, что какая-нибудь CRC32, реализованная на Си и С++, это два разных алгоритма?
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 16:22     По текстовым файлам и строкам #17
Цитата Сообщение от fasked Посмотреть сообщение
что какая-нибудь CRC32
- одно и тоже, но програмно достиается по разному(значит алгоритм другой), я вобще сейчас подключу CStdiofile и буду построчное ReadString делать, это не выходит не изменит алгоритма чтения?

Добавлено через 42 секунды
fasked, прошу ответить на этот пост По текстовым файлам и строкам
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.09.2011, 16:27     По текстовым файлам и строкам #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
одно и тоже, но програмно достиается по разному(значит алгоритм другой)
Я предпочитаю считать, что это детали реализации, а сам алгоритм должен быть абстрагирован от них.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
прошу ответить на этот пост
Ну Вам же никто не говорил, что так нельзя делать. Просто, что приведенный код ближе к Си, чем С++. В частности strtok. Тот же эффект более безопасно достигается использованием std::string и метода этого класса find_first_of (или как там его).
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 16:31     По текстовым файлам и строкам #19
Цитата Сообщение от fasked Посмотреть сообщение
Ну Вам же никто не говорил, что так нельзя делать. Просто, что приведенный код ближе к Си, чем С++. В частности strtok. Тот же эффект более безопасно достигается использованием std::string и метода этого класса find_first_of (или как там его).
- за сие спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2011, 16:35     По текстовым файлам и строкам
Еще ссылки по теме:

работа с текстовым документом C++
C++ Работа с текстовым деком
Работа с текстовым файлом C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.09.2011, 16:35     По текстовым файлам и строкам #20
-=ЮрА=-, и да... вдовесок, чтобы не быть голословным Если несколько потоков будут использовать strtok, то она перестанет, то есть будет некорректно работать. Данная функция не отвечает требованиям потокобезопасности, так как в своем коде использует статически объявленные (static) данные. У методов std::string с этим все хорошо.
Понятно, что данное приложение и не претендует быть многопоточным, однако, лучше заранее себя обезопасить, если таковая возможность существует.
Yandex
Объявления
07.09.2011, 16:35     По текстовым файлам и строкам
Ответ Создать тему
Опции темы

Текущее время: 21:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru