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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> <string.h> пробелы 
:(
    Опции темы
Garcian
Дата 23.3.2009, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте уважаемые программисты!
Дана задача: определить в заданной строке координаты подстроки, содержашей наибольшее число пробелов. Примечание: нельзя обращаться к эелементам массива через указатели (исключение *t = &D[0]).
Вот мой код:
Код

#include <iostream.h>
#include <fstream.h>
#include <string.h>
fstream f, P;

int main () {
    char D[80+1], *t = &D[0]; int N = 0; /*char S;*/ int a;
    
    f.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_in.txt", ios::in);
    f.unsetf (ios::skipws);    
    
    for (int i=0; i < 80; i++) { f >> D[i]; }
    
    P.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_out.txt", ios::out);
    while (1) 
    
    {
        a = strcspn (t, " "); // пропускает все символы не совпадающие с пробельными
        t += a; // t находимся у первого пробела
        a = strspn (t, " "); // присваиваем переменной самый длинный сегмент из пробелов
        if (a == 0) break;
        N += a; //t += a;
        P << N;
    } 
    //t += a;   
    f.close ();
    P.close ();   
     
}     


На лекциях все понятно объяснили, а значение функий я нашел в поисковике. Несмотря на все это программа не работает! Переменой а все время присваивается 0. Хотел бы понять, что делаю не так.

В общем чет совсем запутался с выводом координат  smile 

Это сообщение отредактировал(а) Garcian - 23.3.2009, 00:47
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 23.3.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Garcian @  22.3.2009,  23:21 Найти цитируемый пост)
что делаю не так.

для начала обнулите буффер для чтения  char D[..] = {0}
Цитата(Garcian @  22.3.2009,  23:21 Найти цитируемый пост)
strcspn (t, " "); // пропускает все символы не совпадающие с пробельными

имхо, тут логичнее использовать функцию strchr ()

Цитата(Garcian @  22.3.2009,  23:21 Найти цитируемый пост)
        a = strspn (t, " "); // присваиваем переменной самый длинный сегмент из пробелов

перечитайте еще раз что делает функция и подправьте код.


еще добавьте строку вывода на экран буффера, после чтения в него с файла
 и опубликуйте, что получилось в результате (исправленный код + прочиитанная строка с файла).





Это сообщение отредактировал(а) mes - 23.3.2009, 10:47


--------------------
PM MAIL WWW   Вверх
AnLun
Дата 23.3.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не совсем по теме, но...
Код

char *t = &D[0];

это логичней писать так:
Код

char *t = D;


Это сообщение отредактировал(а) AnLun - 23.3.2009, 11:19
PM MAIL   Вверх
Garcian
Дата 23.3.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В общем ошибка еще в первой половине программы...
Использую strchr

#include <iostream.h>
#include <fstream.h>
#include <string.h>
fstream f, P;

Код

int main () {
    char D[80] = {0}, *t = D;  
    
    f.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_in.txt", ios::in);
    f.unsetf (ios::skipws);    
    
    for (int i=0; i < 80; i++) { f >> D[i]; }
    
    P.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_out.txt", ios::out);
    while (1) 
    
    {
        char * a, c = ' ';
        a = strchr (D, c); // Возращает указатель на местонахождение персого совпадения с символом  c в строке D
        
        if (a == NULL) { 
            cout << "Net probelov" << endl; P << "Net probelov";
            break;
        }  
        P << a;
        cout << a;
     }
}


Уже здесь выдает не пойми что  smile 

Это сообщение отредактировал(а) Garcian - 23.3.2009, 20:09
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 23.3.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Garcian @  23.3.2009,  19:06 Найти цитируемый пост)
Уже здесь выдает не пойми что  smile  

хватит проверять телепатические способности форумчан .

Вы видете и понять не можете, а нам не показываете , а ответа требуете smile

может у Вас файла не находит, или он пустой. 
Цитата(mes @  23.3.2009,  09:41 Найти цитируемый пост)
еще добавьте строку вывода на экран буффера, после чтения в него с файла

где ?


Это сообщение отредактировал(а) mes - 23.3.2009, 20:16


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


Шустрый
*


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

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



Простите!

Например пишу во входном файле одни пробелы - создает файл с кучей пробелов. Если поставить вначале пробелы, а потом буквы - выдает большое кол-во нулей) Если начать не с пробела, то вообще пишет, что их нет.

Цитата

ще добавьте строку вывода на экран буффера, после чтения в него с файла
 - не понял  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 23.3.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



после 7й строчки (for (int i=0; i < 80; i++) { f >> D[i]; }) 
поставьте 
Код

std::cout << D<<std::endl;


если вывод на экране не будет соответсвовать файлу, то значит читаете с файла неправильно.



Цитата(Garcian @  23.3.2009,  19:06 Найти цитируемый пост)
   for (int i=0; i < 80; i++) { f >> D[i]; }

Вы не проверяете файл на конец, а это значит, что если в файле меньше запрашиваемых вами 80 символов, то в результативном  буффере будет содержать мусор.


Это сообщение отредактировал(а) mes - 23.3.2009, 20:34


--------------------
PM MAIL WWW   Вверх
Garcian
  Дата 23.3.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



mes, вы правы, ошибка при чтении... ничего не понимаю, вроде даже проверку на конец строки сделал...
 
Код

 for (i = 0; *(t+i)!='\0'||'\n'; i++) { fin >> *(t+i); }
    std::cout << *(t+i) << std::endl;

пусто =\
--------------------
Неродивый студент
PM MAIL   Вверх
zim22
Дата 23.3.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Garcian,  вы сами поняли, что написали внутри цикла?
Инкрементить i до тех пор, пока значение элемента по адресу t+i не равно '\0' ИЛИ TRUE (т.к. '\n' интерпретируется не нулём, следовательно 1). И получаем бесконечный цикл. Дальше вы выводите cout уже ВНЕ цикла, а не во время каждой итерации. Сомневаюсь, что так было задумано.


--------------------
PM MAIL   Вверх
Anikmar
Дата 23.3.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А доступ к элементу массива по индексу считается через указатель?
PM MAIL ICQ   Вверх
Garcian
Дата 23.3.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(zim22 @ 23.3.2009,  21:43)
Garcian,  вы сами поняли, что написали внутри цикла?
Инкрементить i до тех пор, пока значение элемента по адресу t+i не равно '\0' ИЛИ TRUE (т.к. '\n' интерпретируется не нулём, следовательно 1). И получаем бесконечный цикл. Дальше вы выводите cout уже ВНЕ цикла, а не во время каждой итерации. Сомневаюсь, что так было задумано.

ай ужс, ввсел вывод внутри цикла, компьютер зазвенел громко) Да я по ходу совсем запутался. Как проверить файл на конец и как прочитать строку, что не пробую все не так.
Anikmar, доо, но можно обращаться только к первому и последнему элементам.
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 23.3.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Garcian @  23.3.2009,  20:35 Найти цитируемый пост)
ничего не понимаю, вроде даже проверку на конец строки сделал...

Цитата(Garcian @  23.3.2009,  21:27 Найти цитируемый пост)
Да я по ходу совсем запутался. Как проверить файл на конец и как прочитать строку, что не пробую все не так.

Ну Вы бы хоть поискали, в соседние темы заглянули, 
или ждете пока все разжуют smile 

вот к примеру совсем недалеко от вашей тема называется 
"Замена пробелов String.h " - http://forum.vingrad.ru/forum/topic-251394.html
там есть и примеры работы с пробелами и чтение с файла,

к примеру в этом посту 
http://forum.vingrad.ru/index.php?showtopi...t&p=1819041
нужное Вам находится в строках 16-17 (ну вот и искать теперь не надо smile)

также прочтите замечание насчет F и P. 
smile


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 23.3.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Garcian, 
Считывайте из файла как хотите, но изврат без применния индексов и указателей предлагаю такой:
Код

void FindSpaces(void)
{
    int Len,Cur;
    char *Str1 = "   aaa     bbb  ccc   ddd    eee      uuu                  ";
    char Str2[80]={0};
    char *Pos,*MaxPos;
/*
         Итак: Str1 - Исходная строка - здесь определена статически, как вы ее получите - ваше дело.
          Str2 - служебная строка. В моем примере сделана статически 80, можете поменять
*/
    Len =  strlen(Str1);
    Cur = 1;
    MaxPos = NULL;
/*
       Основной цикл: Ищу строку из 1 пробелеа, затем из 2-х и т.п  - до длины исходной строки. Запоминаю последнюю найденую позицию.
       Если в очередной раз строки с таким кол-вом пробелов не нашел - значит баста.
*/
    while (Cur <=Len)
    {
        strncpy(Str2,Str1,Cur);
        strnset(Str2,' ',Cur);
        Pos = strstr(Str1,Str2);
        if (Pos == NULL) break;
        MaxPos = Pos;
        Cur++;
    }

    if (MaxPos == NULL) printf ("netu\n");
    else printf("%d\n",MaxPos - Str1);
}



Полный изврат, но ни указателей ни доступа к элементам строки не использовал.
PM MAIL ICQ   Вверх
Garcian
Дата 23.3.2009, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Garcian @ 23.3.2009,  21:35)
mes, вы правы, ошибка при чтении... ничего не понимаю, вроде даже проверку на конец строки сделал...
 
Код

 for (i = 0; *(t+i)!='\0'||'\n'; i++) { fin >> *(t+i); }
    std::cout << *(t+i) << std::endl;

пусто =\

mes, ну а как же smile ! Вот уже писал и fin, и fout.  И вашим примером воспользовался, и все равно не так) Правда не понял строчки (;fin.eof(); ... ), там, полагаю, перед ";" должно что то быть  smile .
Anikmar, спасибо, попробую.
--------------------
Неродивый студент
PM MAIL   Вверх
Garcian
Дата 23.3.2009, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



уххх подразобрался с чтением, спс mes, правда, каждый символ идет на отдельной строчке   smile 
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 23.3.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Garcian @  23.3.2009,  22:27 Найти цитируемый пост)
ххх подразобрался с чтением, спс mes, правда, каждый символ идет на отдельной строчке   smile 

ну показывайте, как разобрались и как это на каждой строчке smile



--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 23.3.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Прикольная задача, мне понравилась.
Фантазии нашим преподам не занимать.  smile 
PM MAIL ICQ   Вверх
Garcian
Дата 24.3.2009, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#define MAX_RAZMER 250


mes,  
Код

for (i = 0;!fin.eof() && i < MAX_RAZMER; i++) { fin >> *(t+i); std::cout << *(t+i) << std::endl;}

Вот  smile 

Это сообщение отредактировал(а) Garcian - 24.3.2009, 20:57
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 24.3.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Garcian @  24.3.2009,  19:55 Найти цитируемый пост)
 << std::endl

это перевод на следующую строку, поэтому и вывод соответсвующий.

можно выводить побуквенно, как сделали Вы 
Код

for (i = 0;!fin.eof() && i < MAX_RAZMER; i++) { fin >> *(t+i); std::cout << *(t+i);}

а можно вначале считать , а потом вывести.
Код

for (i = 0;!fin.eof() && i < MAX_RAZMER; i++)  fin >> *(t+i);
std::cout << D << std::endl;

и если переменная относится только к циклу, как переменная i (судя по имени)
то инициализировать ее лучше внутри цикла
Код

for (int i=0; 

иначе можно снаружи, но тогда желательно дать смысловое имя, чтоб не случилось конфликтов между циклами.

Код

int readed;
for (readed=0;

или
Код

int readed=0;
for (; 

* любая из 3х секций for может быть пустой или даже все например for(;;)

Это сообщение отредактировал(а) mes - 24.3.2009, 21:11


--------------------
PM MAIL WWW   Вверх
Garcian
Дата 24.3.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Anikmar, все работает, спасибо.

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

Вот переделанный код Anikmarа
Код

#include <string.h>
#include <iostream.h>
#include <fstream.h>

#define RAZMER 100

fstream fin, fout;

int main ()
{
    fin.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_in.txt", ios::in);
    fin.unsetf (ios::skipws); 
    
    int Len,Cur;
    char Str1[RAZMER] = { 0 };
    
    for (int i = 0;!fin.eof() && i < RAZMER; i++) { fin >> Str1[i];}
    
    char Str2[RAZMER] = { 0 };
    char *Pos,*MaxPos;

    Len =  strlen(Str1);
    Cur = 1;
    MaxPos = NULL;

    fout.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_out.txt", ios::out);
    while (Cur <=Len)
    {
        strncpy(Str2,Str1,Cur);
        strnset(Str2,' ',Cur);
        Pos = strstr(Str1,Str2);
        if (Pos == NULL) break;
        MaxPos = Pos;
        Cur++;
    }

    if (MaxPos == NULL) fout << "Net probel'nih simvolov\n";
    else fout << MaxPos - Str1;
}


не читает  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 24.3.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Garcian @  24.3.2009,  21:42 Найти цитируемый пост)
  fin.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_in.txt", ios::in);

Вас ничего не смущает в имени файла ?! не используйте кирилицу..
 к тому  же путь проще и логичнее использовать относительный


--------------------
PM MAIL WWW   Вверх
Garcian
Дата 24.3.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну так именуется путь к папке администратора (т.е. меня), если использовать для хранения другие папки, то ничего не работает
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 24.3.2009, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Garcian @  24.3.2009,  22:09 Найти цитируемый пост)
если использовать для хранения другие папки, то ничего не работает 

а если использовать эту , то рабоатает ?!
Почти каждое Ваше высказывание как загадка.. постарайтесь формулировать точнее мысль, чтоб не тратить время форумчан на додумывание недосказанного.




--------------------
PM MAIL WWW   Вверх
Garcian
Дата 25.3.2009, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



mes, лично у вас программа работает? (Я не говорю про путь файла)
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 25.3.2009, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Garcian @  24.3.2009,  23:18 Найти цитируемый пост)
mes, лично у вас программа работает? (Я не говорю про путь файла) 

а у меня сейчас под рукой нет компилятора ) 



--------------------
PM MAIL WWW   Вверх
Garcian
Дата 25.3.2009, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В общем я сойду с ума с этими ПО... Перенес программу на ноутбук - все работает!  smile

Добавлено через 4 минуты и 36 секунд
вот так всегда, ломаю голову, что не так, а тут такие пироги. 
Спасибо 
mes, 
Anikmar, за вашу помощь и нелегкий труд! smile 
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 25.3.2009, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Garcian @  24.3.2009,  21:42 Найти цитируемый пост)
    while (Cur <=Len)
    {
        strncpy(Str2,Str1,Cur);
        strnset(Str2,' ',Cur);
        Pos = strstr(Str1,Str2);
        if (Pos == NULL) break;
        MaxPos = Pos;
        Cur++;
    }

что то мне этот код внушает сильные опасения ;)
пересмотрите еще раз что тут написано.


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 25.3.2009, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mes @  25.3.2009,  01:00 Найти цитируемый пост)
что то мне этот код внушает сильные опасения ;)
пересмотрите еще раз что тут написано. 


Это мой код. Задача не использовать указатели. Нужно: создать строку из пробелов заданной длины.

Сначала делаю строку заданной длины
strncpy(Str2,Str1,Cur);

Затем устанавливаю ее в пробелы
strnset(Str2,' ',Cur);

На самомо деле не бьюсь за оптимальность, потому, что ограничения препода иногда ставят в тупик. На вскидку придумал так. Работает. Можно сделать лучше, наверное, но мне показалось так лаконичнее.
PM MAIL ICQ   Вверх
mes
Дата 25.3.2009, 04:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  25.3.2009,  02:00 Найти цитируемый пост)
Это мой код. Задача не использовать указатели. На самомо деле не бьюсь за оптимальность,

ну так указатели все равно то используются ?!

ограничения препода я честно говоря  до конца так и не понял, но решусь предложить свой вариант
Код

int main ()
{
  char *str = "              aaa     bbb  ccc   ddd    eee      uuu        ";

  int spnmax =0; // макс длина промежутка пробелов
  int spnpos =0; // и его позиция

  for (const char *p =str; p;)  в цикле
  {
        p=strchr(p, ' ');        // ищем первый пробел
        if (p)                        // если нашли
        {
          int pos = p-str;      //запоминаем позицию
          int spnlen=0;     
          for (const char *p1=p++; p1 && p-p1==1  ; p1=strchr(p++, ' '))  ++spnlen; // и считаем пробелы

          if (spnmax<spnlen) // если последовательность длинее чем максимальная
          {
               spnmax=spnlen; // то сохраняем длину 
               spnpos=pos;      // и позицию для максимольной последов-ти
          }
       }
  }

  if (!spnmax)  std::cout <<  "no spaces" <<std::endl; 
  else std::cout <<spnmax<<" spaces in pos " << spnpos<<std::endl;

  system("pause");
  return(0);
}




Это сообщение отредактировал(а) mes - 25.3.2009, 04:17


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 25.3.2009, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mes @  25.3.2009,  04:13 Найти цитируемый пост)
ну так указатели все равно то используются ?!

В том-то и дело, что нет. Только начало строки.
PM MAIL ICQ   Вверх
mes
Дата 25.3.2009, 05:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  25.3.2009,  03:38 Найти цитируемый пост)
В том-то и дело, что нет. Только начало строки. 

да ?  smile 
Цитата(Garcian @  24.3.2009,  21:42 Найти цитируемый пост)
      
Код

   Pos = strstr(Str1,Str2);
   if (Pos == NULL) break;
...

  else fout << MaxPos - Str1
;




--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 25.3.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Garcian
Примечание: нельзя обращаться к эелементам массива через указатели (исключение *t = &D[0]).


Цитата

mes
да ?   


Ага. Я через Pos не обращаюсь к элементам строки, а использую только для вычисления позиции.  smile 

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


любитель
****


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

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



Цитата(Anikmar @  25.3.2009,  09:31 Найти цитируемый пост)
Ага. Я через Pos не обращаюсь к элементам строки, а использую только для вычисления позиции.  smile 

ну тогда получается мой пример тоже соответствует условиям, так как указатели используются только для вычисления позиции, и передачи их в стандартные функции.
обращение с их посредством к элементам отсутствует. smile

Это сообщение отредактировал(а) mes - 25.3.2009, 10:57


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 25.3.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

mes
ну тогда получается мой пример тоже соответствует условиям, так как указатели используются только для вычисления позиции, и передачи их в стандартные функции.
обращение с их посредством к элементам отсутствует. 
 

Я сначала пошел по вашему пути, но посчитал конструкцию вида p1=strchr(p++, ' ') нарушением условий заачи - так как ее можно расценить как доступ через указатель.



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


любитель
****


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

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



Цитата(Anikmar @  25.3.2009,  10:01 Найти цитируемый пост)
но посчитал конструкцию вида p1=strchr(p++, ' ') нарушением условий задачи

не могу спорить, так как ограничения задачи для меня неясны, 
хотя доступ к элементу по указателю вне функции нет, а передавать позицию в функцию посредством указателя,имхо, не запрещено.
Но у препода могут быть свои взгляды, в разборе которых, судя по одной из недавних тем, я не силен smile






--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 25.3.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

mes
не могу спорить, так как ограничения задачи для меня неясны, 
хотя доступ к элементу по указателю вне функции нет, а передавать позицию в функцию посредством указателя,имхо, не запрещено.
Но у препода могут быть свои взгляды, в разборе которых, судя по одной из недавних тем, я не силен 


Вот и я засомневался, первый мой вариант был очень похож на ваш. Ладно, пусть ТС разбирается
PM MAIL ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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