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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2009, 23:18   #1
HoOpe
Пользователь
 
Аватар для HoOpe
 
Регистрация: 09.03.2009
Сообщений: 52
Лампочка обработка строк на Си

Человеки, помогите плиззз!!!..

Задание:
Определить количество слов, поменять местами четные и нечетные слова.

Требование:
В программе описать массив строк. Исходный текст считать из файла, созданного в любом текстовом редакторе. Результат обработки вывести на экран, а так же в итоговый текстовый файл.
когда всё становится на свои места, выясняется, что это кладбище...
HoOpe вне форума Ответить с цитированием
Старый 07.05.2009, 23:19   #2
HoOpe
Пользователь
 
Аватар для HoOpe
 
Регистрация: 09.03.2009
Сообщений: 52
По умолчанию

Есть текст программы на Паскале, но надо на Си...
Код:
var
  f:text;
  i,j,n,p:integer;
  a:array[1..500] of string;
  s,w1,w2:string;
  Letters: set of char;

begin
  Letters:=['A'..'Z']+['a'..'z'];
  assign(f,'d:\o.txt');
  reset(f);

  { считываем файл в массив }
  n:=0;
  while not(eof(f)) do begin
    Inc(n);
    readln(f,a[n]);
    WriteLn(a[n])    { отладочная печать }
  end;
  Close(f);
  assign(f,'d:\o1.txt');
  ReWrite(f);
  writeln('Всего ',n,' строк');

  { работаем с массивом строк }
  for j:=1 to n do begin
    i:=1;
    s:='';
    while i<Length(a[j]) do begin
      { пропуск небуквенных символов и копирование их в новую строку }
      while (i<=Length(a[j])) and not (a[j,i] in Letters) do begin
        s:=s+a[j][i];
        Inc(i)
      end;
      { запоминаем позицию }
      p:=i;
      { чтение первого слова }
      w1:='';
      while (i<=Length(a[j])) and (a[j][i] in Letters) do begin
        w1:=w1+a[j][i];
        Inc(i)
      end;
      { пропуск небуквенных символов и копирование их в новую строку }
      while (i<=Length(a[j])) and not (a[j][i] in Letters) do begin
        s:=s+a[j][i];
        Inc(i)
      end;
      { чтение второго слова }
      w2:='';
      while (i<=Length(a[j])) and (a[j][i] in Letters) do begin
        w2:=w2+a[j][i];
        Inc(i)
      end;
      { обработка ситуации непарного слова в конце строки }
      if w2='' then begin
        w2:=w1;
        w1:=''
      end;
      { вставка второго слова в запомненную позицию }
      Insert(w2,s,p);
      { добавление первого слова }
      s:=s+w1
    end;
    WriteLn(f,s);  { запись выходного файла }
    WriteLn(s)   { отладочная печать }
  end;
  close(f);
end.
когда всё становится на свои места, выясняется, что это кладбище...
HoOpe вне форума Ответить с цитированием
Старый 08.05.2009, 00:08   #3
HoOpe
Пользователь
 
Аватар для HoOpe
 
Регистрация: 09.03.2009
Сообщений: 52
По умолчанию

А в Си есть множества??
когда всё становится на свои места, выясняется, что это кладбище...
HoOpe вне форума Ответить с цитированием
Старый 08.05.2009, 00:26   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
А в Си есть множества??
Нет.

Чем разделены слова?
Проще будет написать с нуля, чем переделывать паскалевский вариант.

Если есть строгий разделитель, например, пробел, то можно считывать по два слова и сразу их менять местами.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 08.05.2009 в 00:28.
Sazary вне форума Ответить с цитированием
Старый 08.05.2009, 00:43   #5
HoOpe
Пользователь
 
Аватар для HoOpe
 
Регистрация: 09.03.2009
Сообщений: 52
По умолчанию

Так вот дело в том, что в строке может встретиться знак препинания, непарное слово и т.п. Как это написать на Си, в языке, в котором больше функций для обработки строк?
когда всё становится на свои места, выясняется, что это кладбище...
HoOpe вне форума Ответить с цитированием
Старый 08.05.2009, 00:47   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну тогда как-то так:
Идем посимвольно до первой буквы и пишем все это в строку ЗНАКИ.
Дошли до слова. Идем по слову и пишем его в СЛОВО1. Наткнулись на знак. Дальше идем и пишем в ЗНАКИ2. Наткнулись на второе слово. Пишем его в СЛОВО2.
Теперь во второй файл пишем СЛОВО2 + ЗНАКИ1+СЛОВО1+ЗНАКИ2.
Очищаем все 4 строки и продолжаем.
Если дошли до конца файла, а СЛОВО2 нету, то просто переписываем то, что осталось.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.05.2009, 00:53   #7
HoOpe
Пользователь
 
Аватар для HoOpe
 
Регистрация: 09.03.2009
Сообщений: 52
По умолчанию

А как это будет выглядеть на Си с использованием стандартных функций?
когда всё становится на свои места, выясняется, что это кладбище...
HoOpe вне форума Ответить с цитированием
Старый 08.05.2009, 01:30   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
А как это будет выглядеть на Си с использованием стандартных функций?
Это такой вопрос с подвохом? Чтобы я за вас все написал?

Ладно. Вот, разбирайтесь.
Уже ночь, возможно, есть какие-то косяки. Ну это уже сами посмотрите и исправите.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>


int main(){
FILE *fin,*fout;
char wrd[3][100],c,*p;

fin = fopen("1.txt","r");
fout = fopen("2.txt","w");

strcpy(wrd[0],"");
strcpy(wrd[1],"");
strcpy(wrd[2],"");

while(!feof(fin))
 {
  c = fgetc(fin);
  if(feof(fin)) break;
  while(!feof(fin)&&!((c>='A'&&c<='Z')||(c>='a'&&c<='z')))
   {
    fputc(c,fout);
    c = fgetc(fin);
   }
  p = wrd[0];
  //*p++ = c;
  //---
  while(!feof(fin)&&((c>='A'&&c<='Z')||(c>='a'&&c<='z')))
   {
    *p++ = c;
    c = fgetc(fin);
   }
  *p=0;
  p = wrd[1];
  //*p++ = c;
  while(!feof(fin)&&!((c>='A'&&c<='Z')||(c>='a'&&c<='z')))
   {
    *p++ = c;
    c = fgetc(fin);
   }
   *p=0;
   p = wrd[2];
   //*p++ = c;
   while(!feof(fin)&&((c>='A'&&c<='Z')||(c>='a'&&c<='z')))
    {
     *p++ = c;
     c = fgetc(fin);
    }
  *p=0;
  fputs(wrd[2],fout);
  fputs(wrd[1],fout);
  fputs(wrd[0],fout);
  if(feof(fin)) break;
  fputc(c,fout);

 }

fclose(fin);
fclose(fout);

//getch();
return 0;
}
Исходный файл (1.txt)
Код:
Word. Test. Word. Test.
Конечный файл:
Код:
Test. Word. Test. Word.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.05.2009, 01:46   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

4 года назад я искал программно (английские) слова — чтобы затем «вычислять» их (международную) транскрипцию.

В частности, столкнулся с тем, что есть слова типа X-rays, o’kay и café.

Понимаете, хоть это и помощь студентам, но просто любопытно, а как быть со словами, состоящими не только из букв? Неужели в вузах и ПТУ есть какой-то негласный «взгляд сквозь пальцы»: мол, всё равно вам не быть программистами — так сдайте хоть как-нибудь?

Вообще же говоря, программер — это очень внимательный «читатель» условия задачи.

P.S. Позавчера мы (наши три студента из СПб) принимали поздравления за победу в чемпионате мира по программированию! Неужели их, таких продвинутых, на 140 млн всего несколько человек... обидно за Родину!

Последний раз редактировалось Sasha_Smirnov; 08.05.2009 в 01:54.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 08.05.2009, 01:56   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov
Неужели в вузах и ПТУ есть какой-то негласный «взгляд сквозь пальцы»: мол, всё равно вам не быть программистами — так сдайте хоть как-нибудь?
Просто цель задания - реализовать какой-то определенный алгоритм, используя определенные функции. Ведь это просто вузовская задачка, а не реальный проект, где действительно требуется учитывать все нюансы.
Цитата:
а как быть со словами, состоящими не только из букв?
В таком случае, в данной программе, достаточно добавить недостающие символы в условие. Но, как я и сказал, это не является первоочередной задачей.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка строк в C++ defol-777 Помощь студентам 1 12.03.2009 18:10
обработка строк densan Общие вопросы Delphi 3 26.08.2008 11:11
обработка строк Xunter Помощь студентам 4 27.06.2008 21:48
Обработка строк символов Wilda Паскаль, Turbo Pascal, PascalABC.NET 3 12.12.2007 18:54