Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 16:50     По текстовым файлам и строкам #21
Цитата Сообщение от fasked Посмотреть сообщение
strtok, то она перестанет, то есть будет некорректно работать.
- когда пишу код прекрасно понимаю когда строка нужна после проработки а когда и нет (не первый год стучу по клаве), на данном алгоритме str == NULL после цикла уже нигде не используется...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.09.2011, 16:55     По текстовым файлам и строкам #22
-=ЮрА=-, кажется Вы меня не поняли, я говорю о том, что цикл возможно вообще никогда не завершится. Или завершится сразу, не доработав до конца. Поведение непредсказуемое.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
07.09.2011, 17:00     По текстовым файлам и строкам #23
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
через месяц примут стандарт вернуть h в заголовки
Вы имете ввиду С++11 ?
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 17:02     По текстовым файлам и строкам #24
Цитата Сообщение от asics Посмотреть сообщение
Вы имете ввиду С++11 ?
- да я образно писал Через лет 5 уже о коде написанном сейчас в стандарте скажут - мдаааа написано не по стандарту
asics
07.09.2011, 17:05
  #25

Не по теме:

-=ЮрА=-, Юмор-то в чем ? Не понимаю...

fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.09.2011, 17:06     По текстовым файлам и строкам #26
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Через лет 5 уже о коде написанном сейчас в стандарте скажут - мдаааа написано не по стандарту
Ну и правильно скажут Улучшение языка должно вести за собой улучшение кода, в том числе и старого.
Только вот я сомневаюсь, что пять лет это возможный срок для стандарта C++
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 17:15     По текстовым файлам и строкам #27
Цитата Сообщение от fasked Посмотреть сообщение
что пять лет это возможный срок для стандарта C++
- ну а зачем так долго ждать - макулатура нужна всегда, да и в туалет нужно с чем-то эти 5 лет ходить
Ладно топик исчерпан - прошу не считать это сообщение как офтоп
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
17.09.2011, 14:00  [ТС]     По текстовым файлам и строкам #28
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
#include <fstream.h>
#include <windows.h> //malloc, GetLastError, strerror, system
#include <string>  //strtok
#include <iostream.h>
#include <stdio.h>   //i/0
 
int ProizvChetnihCifr(char * buf);
int main()
{
        char delim[] = " ";//Строка разделителей, т.е разделителями могут быть и другие символы
        //в конктреном случае строка всего из 1-го символа, т.к. разделитель по условию '*'
        char *str,*buf;
        int sLen, proizved = 0, mproizved = 0;
        char Name[15];
        cout << "vvedite ima faila "  ;
        cin >> Name;
        ifstream f(Name);
        if(!f)
        cout <<"Error open text.TXT:";
        else
        {
                f.seekg(0,ios::end);
                sLen = f.tellg();
                f.seekg(0,ios::beg);
 
                        f.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 <<endl;
                        cout <<"Proizvedenie chetnih v nem:" << "" << mproizved <<endl;
                }
                f.close();
        system("pause");//Пауза до нажатия любой клавиши
        return 0;
}
int ProizvChetnihCifr(char * buf)
{
        int ret = 1,chislo;
        for(int i = 0; i < strlen(buf); i++)
        {
                if (isdigit (buf[i]))
                {
                        chislo = buf[i] - ('0');
                        if(chislo % 2 == 0)
                                ret *= chislo;
                }
        }
        return ret;
}
 Комментарий модератора 
Используйте теги форматирования кода!
-=ЮрА=-
Заблокирован
Автор FAQ
17.09.2011, 16:09     По текстовым файлам и строкам #29
lexflax,
Цитата Сообщение от lexflax Посмотреть сообщение
ProizvChetnihCifr(char * buf)
- имена внутренных переменных функций можно вибирать любыми(лишь бы они не шли в конфликт с объявленными ранее глобальными переменными и зарезервированными служебними словами), так что если бы вместо char * buf написал char * s сути дела это не изменило бы.
То что заменил stdio-вский поток на stream-ский
Цитата Сообщение от lexflax Посмотреть сообщение
ifstream f(Name);
тоже сути алгоритма не изменяет, лишь бы всё синтаксису языка соответсвовало...

PS:Касательно кода в общем то предложенный мной ранее код был чисто Си-шный, ну или весьма и весьма близкм именно к стандарту Си, в модернезированном тобой коде идёт уже смесь Си и С++, я конешно не компилил но визуально норм
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
19.09.2011, 14:14  [ТС]     По текстовым файлам и строкам #30
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
#include <fstream.h>
#include <windows.h> //malloc, GetLastError, strerror, system
#include <string>  //strtok
#include <iostream.h>
#include <stdio.h>   //i/0
int ProizvChetnihCifr(char * but)
{
    int ret = 1,chislo;
    for(int i = 0; i < strlen(but); i++) //вот тут strlen используется а разве не надо объявлять библеотеку ctype.h она без нее работает но как то ведь должна она откуда то браться?
 
    if (isdigit (but[i])) // вот тут but[i] проверяют если ли в нем цифры, а откуда в нем вообще символы возмутся? если в него ничего не записывалось и он пустой? или я че не так понимаю? факт он работает но я хочу понять весь процесс....
    {
                chislo = but[i] - ('0');// тут вот что означет '0' и почему он в скобках?
                        if(chislo % 2 == 0)
                        ret *= chislo;
                }
 
        return ret;
}
int main()
{
        char delim[] = " ";//Строка разделителей, т.е разделителями могут быть и другие символы
        //в конктреном случае строка всего из 1-го символа, т.к. разделитель по условию '*'
        char *str,*buf;
        int sLen, proizved = 0, mproizved = 0;
        char Name[15];
        cout << "vvedite ima faila "  ;
        cin >> Name;
        ifstream f(Name);
        if(!f)
        cout <<"Error open text.TXT:";
        else
        {
                f.seekg(0,ios::end);
                sLen = f.tellg();
                f.seekg(0,ios::beg);
 
                        f.read(str,sLen);
                        str[sLen] = '\0';
                        buf = strtok(str,delim);//Разбиваем строку на токены
                        while(buf)
                        {
                                if(mproizved < (proizved = ProizvChetnihCifr(buf)))
                                {
                                        mproizved = proizved;
                                        sLen = strlen(buf);
                                }
                                buf = strtok(0,delim);
                        }
                        cout << "Dlinna max identificatora :" << sLen <<endl;
                        cout <<"Proizvedenie chetnih v nem:" << "" << mproizved <<endl;
                }
                f.close();
        system("pause");//Пауза до нажатия любой клавиши
        return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2011, 14:38     По текстовым файлам и строкам #31
Цитата Сообщение от lexflax Посмотреть сообщение
for(int i = 0; i < strlen(but); i++) //вот тут strlen используется а разве не надо объявлять библеотеку ctype.h она без нее работает но как то ведь должна она откуда то браться?
strlen объявлена в string.h + зачем на каждой итерации вычислять длину строки i < strlen(but)???Вот так тогда уже делай
C++
1
2
int sLen = strlen(but);
for(int i = 0; i < sLen; i++)
Добавлено через 1 минуту
Цитата Сообщение от lexflax Посмотреть сообщение
char delim[] = " ";//Строка разделителей, т.е разделителями могут быть и другие символы
* * * * * * * * //в конктреном случае строка всего из 1-го символа, т.к. разделитель по условию '*'
, вбей тогда char delim[] = "*"; или char delim[] = " *";слова тогда смогут идти как через пробел так и через *

Добавлено через 2 минуты
Цитата Сообщение от lexflax Посмотреть сообщение
if (isdigit (but[i])) // вот тут but[i] проверяют если ли в нем цифры, а откуда в нем вообще символы возмутся? если в него ничего не записывалось и он пустой? или я че не так понимаю? факт он работает но я хочу понять весь процесс....
- есть строка but к примеру
but[] = "qwerty1256";
так вот начиная с but[6] - символы строки являются цифрами, isdigit и делает проверку является ли символ but[i] цифрой

Добавлено через 6 минут
Цитата Сообщение от lexflax Посмотреть сообщение
chislo = but[i] - ('0');// тут вот что означет '0' и почему он в скобках?
- чары в строке but идут в ASCII кодировке, т.е символу '1' соотвествует код 49 '2' - 50 и т.д, а нам нужно само значение символа т.е единичка, двойка, если бі записали
int num = (int)'1' - получили бы num == 49, а вот если отнимем от '1' - '0' то получим
C
1
num = 49 - 48 = 1;
вобщем этим экономил на преобразованиях из строки в число
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
20.09.2011, 15:31  [ТС]     По текстовым файлам и строкам #32
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    f.seekg(0,ios::end);\\ тут курсор по файлу перемещается в конец
    sLen = f.tellg();\\ записывается количество символов который прошел тот курсор
    f.seekg(0,ios::beg);\\возвраещаем курсор в начало
 
    f.read(str,sLen);\\ считываем всю информацию из slen в str
    str[sLen] = '\0'; \\ вот это вообще не понимаю...  как в str[sLen] как в стр может быть еще и слен? и еще ему присваивается что то? ну присваивается где то в нете видел нулевой байт только не понял зачем он...
    buf = strtok(str,delim);//ну тут везде где в файле встречается значение delim разбивается на токены файл текстовый
    while(buf)\\ вот тут условие хочу понять - выполнять пока не будет проверин токен? или каждый токен?
        {
        if(mproizved < (proizved = ProizvChetnihCifr(buf)))
        {
        mproizved = proizved;
        sLen = strlen(buf);
                       }
        buf = strtok(0,delim);\\\ вот тут не понимаю что значит зачем ноль и опять делим? что сдесь выполняется?
                    }
        cout << "Dlinna max identificatora :" << sLen <<endl;
        cout <<"Proizvedenie chetnih v nem:" << "" << mproizved <<endl;
                }
                f.close();
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
20.09.2011, 15:44     По текстовым файлам и строкам #33
while(buf) - пока токен существует. проверка будет осуществляться до тех пор пока в буфере есть данные.
buf = strtok(0,delim) - прочтите доки на эту функцию. там все есть.
-=ЮрА=-
Заблокирован
Автор FAQ
20.09.2011, 16:12     По текстовым файлам и строкам #34
Цитата Сообщение от lexflax Посмотреть сообщение
sLen = f.tellg();\\
тут + 1 надо

Цитата Сообщение от lexflax Посмотреть сообщение
str[sLen] = '\0'; \\ вот это вообще не понимаю...
- єто в дебаге есть и str[sLen]; вобще же это делаю чтобы убрать мусор который неизбежно идёт вконце строк и память ВСЕГДА нужно выделять f.tellg() + 1!(в строке всегда должен стоять '\0' терминатор, если модерензируешь мой код,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!(str = (char *)malloc(sLen + 1))) //str = длина файла + '\0'
то делай 1 к одному, никаких лишних строк и действий в нём нет)

Добавлено через 2 минуты
Цитата Сообщение от lexflax Посмотреть сообщение
while(buf)\\ вот тут условие хочу понять - выполнять пока не будет проверин токен? или каждый токен?
- если strtok не найдёт токен то выдаст NULL и buf == NULL, таким образом строим цікл до тех пор пока получаем из текста токены (в общем случае - это не слова а участки строки заключённые мужду символами из перечня delim)

Добавлено через 5 минут
Цитата Сообщение от lexflax Посмотреть сообщение
buf = strtok(0,delim);\\\ вот тут не понимаю что значит зачем ноль и опять делим? что сдесь выполняется?
это синтаксис такой/ Нолик потому что говорим разбирать строку которой здесь передали
Цитата Сообщение от lexflax Посмотреть сообщение
strtok(str,delim);
иначе бі начался пробор уже другой строки. strtok небезопасная функция - она уничтожает str потому и не чищу память после ицикла.

Добавлено через 4 минуты
Цитата Сообщение от lexflax Посмотреть сообщение
if(!f)
* * * * * * * * cout <<"Error open text.TXT:";
* * * * * * * * else
* * * * * * * * {
* * * * * * * * * * * * * * * * f.seekg(0,ios::end);
* * * * * * * * * * * * * * * * sLen = f.tellg();
* * * * * * * * * * * * * * * * f.seekg(0,ios::beg);
f.read(str,sLen);
* * * * * * * * * * * * * * * * * * * * * * * * str[sLen] = '\0';
- PS где в твоём коде выделение памяти???!!!
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
21.09.2011, 14:23  [ТС]     По текстовым файлам и строкам #35
что значит выделение памяти?
-=ЮрА=-
Заблокирован
Автор FAQ
21.09.2011, 14:56     По текстовым файлам и строкам #36
Цитата Сообщение от lexflax Посмотреть сообщение
что значит выделение памяти?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char * str,*buf;
- под str не отведен блок памяти, я его отводил после определения длинны файла
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!(str = new char[sLen + 1])) //str = длина файла + '\0'
если ты ничего не изменял вначале моего кода то будешь пытаться считать файл пустым блоком памяти
Цитата Сообщение от lexflax Посмотреть сообщение
f.read(str,sLen);\\ считываем всю информацию из slen в str
- и программа сразу же опрокинеться
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
22.09.2011, 15:18  [ТС]     По текстовым файлам и строкам #37
ну я удалил ту срочку что у тебя была из твоего кода и программа отлично работала)))
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 15:31     По текстовым файлам и строкам #38
Цитата Сообщение от lexflax Посмотреть сообщение
ну я удалил ту срочку что у тебя была из твоего кода и программа отлично работала)))
- перекомпилируй запусти Release и убедись в обратном (конечно если str объявлена не как char str[N])

Не по теме:

PS:Просишь чтоб помагал и не слушаешь о чём говорю, ну ну...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2011, 15:37     По текстовым файлам и строкам
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
22.09.2011, 15:37  [ТС]     По текстовым файлам и строкам #39
вот смотри такой кот ты написал изначально мне
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;
}
А потом после удаления кое каких строк и перестановки получился у меня такой точно так же работающий и все выполняющий
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
#include <fstream.h>
#include <windows.h> //malloc, GetLastError, strerror, system
#include <string>  //strtok
#include <iostream.h>
#include <stdio.h>   //i/0
int ProizvChetnihCifr(char * but)
{
        int ret = 1,chislo;
        for(int i = 0; i < strlen(but); i++)
 
                if (isdigit (but[i]))
                {
                        chislo = but[i] ;
                        if(chislo % 2 == 0)
                                ret *= chislo;
                }
 
        return ret;
}
int main()
{
        char delim[] = " ";
        char *str,*buf;
        int sLen, proizved = 0, mproizved = 0;
        char Name[15];
        cout << "vvedite ima faila "  ;
        cin >> Name;
        ifstream f(Name);
        if(!f)
        cout <<"Error open text.TXT:";
        else
        {
                f.seekg(0,ios::end);
                sLen = f.tellg();
                f.seekg(0,ios::beg);
 
                        f.read(str,sLen);
                        str[sLen] = '\0';
                        buf = strtok(str,delim);//Разбиваем строку на токены
                        while(buf)
                        {
                                if(mproizved < (proizved = ProizvChetnihCifr(buf)))
                                {
                                        mproizved = proizved;
                                        sLen = strlen(buf);
                                }
                                buf = strtok(0,delim);
                        }
                        cout << "Dlinna max identificatora :" << sLen <<endl;
                        cout <<"Proizvedenie chetnih v nem:" << "" << mproizved <<endl;
                }
                f.close();
        system("pause");//Пауза до нажатия любой клавиши
        return 0;
}
Добавлено через 3 минуты
в последующем коде в строке chislo = but[i] ; не дописал - '0' а так перезапускал много раз все работает... я фиг знает
Yandex
Объявления
22.09.2011, 15:37     По текстовым файлам и строкам
Ответ Создать тему
Опции темы

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