Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2008, 16:30   #1
slog
 
Регистрация: 23.11.2008
Сообщений: 9
По умолчанию Дана строка S. Преобразовать строку, заменив в ней каждое многоточие одной точкой.Строки в C++

Начал писать код на C++ (Дана строка S. Преобразовать строку, заменив в ней каждое многоточие одной точкой.)
Столкнулся с проблемой... Под рукой книжек нет, в Инете ничего полезного не нашёл по данному вопросу...

начало кода:
Код:
#include<stdio.h>
#include<conio.h>
void main(void)
{
char s, unsigned char i;
clrscr();
for i=  downto 1 do
используя цикл for и while скорее всего надо, но как незнаю... в Pascal просто:
Код:
for i:=length(s) downto 1 do
while pos('...',s)>0 do delete (s,pos('...',s),2);
в Си с строками не работал... помогите с кодом. начинаю с досовской версией Си.
slog вне форума Ответить с цитированием
Старый 12.12.2008, 08:25   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Я бы решил задачу так:
Просматриваеш массив на предмет наличия знака '.'
Далее, при нахождении такой надо убедиться, что их три.
Я бы сделал это так:
создаеш переменную, которая считает кол-во встреченных тобою точек, назовем ее a (а так же переменную, в которую ты запишеш номер элемента, в котором встретил первую точку, назовем ее b).
если программа после 1-2 точек натыкается на отличный от точки символ, то эта перменная обнуляется.
если же она насчитает 3 точки, то она проверяте, является ли элемент i+1 точкой, если да - значит в последователньости более 3-х точек.
Если нет, то:
Элемент массива под номером b заменяем на '.' (в данном случае это лишнее, но делает программу более универсальной, можно этот шаг пропустить).
элементы, чьи индексы больше, чем (b+2*n), где n это кол-во встреченных троеточий. смещаем на 2*n элемента влево.
Код:
s[i-2*n]=s[i]
, где s[i] это текущий переносимый элемент. В конце строки не забываем ставить '\0' (нулевой символ)
Не забудь после последнего элемента поставить знак
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 12.12.2008 в 12:49.
ROD вне форума Ответить с цитированием
Старый 12.12.2008, 16:15   #3
slog
 
Регистрация: 23.11.2008
Сообщений: 9
По умолчанию

а если не через массив, а как в паскале:
Код:
uses crt;
Var
  s : string;
  i : byte;
begin
readln(s);
for i:=length(s) downto 1 do
while pos('...',s)>0 do delete (s,pos('...',s),2);
writeln(s);
readkey;
end.
если ли аналог такому решению в C++?
slog вне форума Ответить с цитированием
Старый 12.12.2008, 19:51   #4
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

В С++ все строки представляют из себя масивы. по этому сними можно работать только через масивы.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 15.12.2008, 16:17   #5
slog
 
Регистрация: 23.11.2008
Сообщений: 9
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
В С++ все строки представляют из себя масивы. по этому сними можно работать только через масивы.
а как? я не представляю... объявляется массив строк, и что дальше? как с ним работать?
slog вне форума Ответить с цитированием
Старый 15.12.2008, 20:58   #6
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

это не маисв строк, это символьный масив (это строка, но представленна она в виде масива забитого разными символами, например буквами).
ввод осуществляется командой cin>>mas (однако будут удалены все символы, после пробела). либо gets(mas). (Думаю итак понятно, что mas это символьный масив, обьявляется он как и любой другой -
Код:
char mas[400]
(это для примера, можно длинну указать какая вздумается, и имя))
Представляется текст так:
допустим мы ввели "text"

mas[0]='t'
mas[1]='e'
mas[2]='x'
mas[3]='t'
что касается символов с mas[4] по mas[n-1], то там записанно черт знает что. и где-то в конце должен быть нулевой символ '\0' (я вот, честно сказать, не помню, ставиться ли он в конце строки или в конце введенного текста).
т.е. если мы напишем код
Код:
cout<<mas[0]<<mas[1]<<mas[2]<<mas[4]<<endl;
ТО на экране будет красоваться слово text (однако, если мы потребуем вывести mas[4], mas[5] и так далее, то на экране будут красоваться быквы из языка эскимосов).
Правда печать лутше делать через цикл:

Код:
for (i=0; i<n; i++)
{cout<<mas[i];}
cout<<endl;
n- кол-во знаков в масиве.
Рекомендую пользоваться функцией strlen(возвращает длинну строки, включая пробелы, но неввключая невведенные символы (т.е. то, что хранится в зарезервированной памяти, но куда небыл записан текст при вводе строки.)).

Пример кода:

Код:
gets(str);
n = strlen(str);

for (i=0; i<n; i++)
{cout<<mas[i];}
cout<<endl;
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 15.12.2008 в 21:08.
ROD вне форума Ответить с цитированием
Старый 16.12.2008, 18:38   #7
Zid@ne
Пользователь
 
Регистрация: 18.01.2008
Сообщений: 49
По умолчанию

могу поделится паскалевским вариантом... в СИ слаб...
Zid@ne вне форума Ответить с цитированием
Старый 16.12.2008, 18:42   #8
slog
 
Регистрация: 23.11.2008
Сообщений: 9
По умолчанию

я сам в паскале делал... выше выкладывал этот код...
а как в Си под ДОС это сделать? я даж книг путёвых не могу найти... помогите с досовским разобраться...
slog вне форума Ответить с цитированием
Старый 16.12.2008, 19:04   #9
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
По умолчанию

Ну так что?! Задача то все не решена?!
StarWorm вне форума Ответить с цитированием
Старый 16.12.2008, 20:14   #10
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Мое решение:
Код:

#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>


int main()
{
  clrscr();
  char s[100];
  char s1[100];
  gets(s);
  int k=0;
  for (int i=0; i<strlen(s); i++)
  {
    if ((s[i]=='.')&&(s[i+1]=='.')) continue;
    s1[k]=s[i];
    k++;
  }
  s1[k]=0;
  cout << s1;
  getch();
  return 0;
}
Изврат конечно
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка, состоящая из нескольких слов. Найти количество слов, которые содержат хотя бы одну букву "А" Mashaa Помощь студентам 13 09.12.2009 13:28
Преобразование числа с плавающей точкой в строку Sibedir Общие вопросы Delphi 14 09.03.2008 21:48
Замена многоточия одной точкой в строке S. Карась Помощь студентам 9 18.01.2008 18:13
Как преобразовать UINT в строку? Сильванович Михаил Общие вопросы C/C++ 2 12.07.2007 09:58