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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 28.02.2009, 12:10   #1
Кси
 
Регистрация: 28.02.2009
Сообщений: 4
По умолчанию Простая задачка про дефис

В общем то для людей поопытнее задача покажется пустяковой

используя язык Си
Не крайние слова предложения из пяти слов разделены дефисом. Слова до и после дефиса поменять местами

т е например 1 2-3 4 5 должно превратиться в 1 3-2 4 5
или 1 2 3-4 5 в 1 2 4-3 5

ограничения
чтение предложения из файла
использовать можно только библиотеку stdio.h
комплятор QuickC



но сколько я над ней думаю, ничего простого придумать не могу

люди добрые, помогите кто чем может
заранее спасибо
Кси вне форума
Старый 28.02.2009, 16:17   #2
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

Вот пример:
Принцип такой: строка разбивается на слова, затем ищется слово "-" и слова по обеим сторонам меняются местами.
Недостаток в том что любой символ по обеим сторонам кот-ого пробелы будет считаться Словом(напр. пробел или табуляция) так могут поменяются местами пробел с каким-либо словом.

Код:
#include<stdio.h>




#define MAX_WORD  20  // слов может быть 20


typedef struct
 {
 unsigned char *word; // указатель на слово
 unsigned char token; // символ ращделитель
 } TInfo;


char sub_buffer[ 100 ];     // строка в 100 символов
TInfo gptr[ MAX_WORD ];
// все что имеет с обеих сторон пробелы явл. словом так дефис так-же явл. словом


/**
 определяет длину строки
**/
int _strlen( char *buffer )
 {
 int i=0;
 for( ; *buffer; i++ )  *buffer++;
 return i;
 }


/**
 сравнивает строки
**/
int _strcmp( char *str1, char *str2 )
 {
 for( ; *str1;  str1++, str2++ ) 
  {
  if( *str1 != *str2 ) break;
  }
 return( *str2 - *str1 );
 }






/**
 Разбивает строку на слова
**/
void tokenize( char *sbuffer, int *n )
 {
 int i, j;
 *n = 0;
 gptr[ (*n)++ ].word = sbuffer;

 int length = _strlen( sbuffer );

 for( i=0; i<length && *n < MAX_WORD; i++ )
  {
  if( sbuffer[ i ] == ' ' || sbuffer[ i ] == '\t'
  ||  sbuffer[ i ] == ',' || sbuffer[ i ] == '\"'
  ||  sbuffer[ i ] == '\'' || sbuffer[ i ] == '.' )
   {
   gptr[ *n ].word = &sbuffer[ i+1 ];
   gptr[ *n-1 ].token = sbuffer[ i ];
   sbuffer[ i ] = '\0';
   (*n)++; 
   }
  }
 }





int main()
 {
 int i, j, sign, n;
 char buffer[ 1024 ], *p = &buffer[ 0 ], *ptr[ 2 ], *tmp;

 FILE *Ifile; 

 Ifile = fopen( "Data.txt", "r" );

 if( !Ifile )
  {
  perror( "Data.txt" );
  return 0;
  }



 fseek( Ifile, 0L, SEEK_SET );

 for( n=0; fgets(p, 1024, Ifile); )
  {

  tokenize( p, &n ); // разбиваем на слова


  for( i=0; i<n; i++ )
   {

   for( j=0; gptr[ i ].word[ j ]; )
    {
    if( gptr[ i ].word[ j ] == ' ' || gptr[ i ].word[ j ] == '\t'
    ||  gptr[ i ].word[ j ] == ',' || gptr[ i ].word[ j ] == '\"'
    ||  gptr[ i ].word[ j ] == '\'' || gptr[ i ].word[ j ] == '.' )
     {
     j++;
     }
    else break;
    }

   if( _strcmp(&gptr[ i ].word[ j ], "-")==0 )
    {
    if( (i-1) > 0 && (i+1) < n ) // слово не первое и не последнее 
     {
     // shift
     tmp = gptr[ i+1 ].word;
     gptr[ i+1 ].word = gptr[ i-1 ].word;
     gptr[ i-1 ].word = tmp;
     }
    }
   }

  for( i=0; i<n; i++ ) // вывод измененной строки
   {
   printf( "%s", gptr[ i ].word );
   printf( "%c", gptr[ i ].token );
   }

  printf( "\n" );
  }


 return 0;
 }
Nomlpppp вне форума
Старый 28.02.2009, 21:31   #3
Кси
 
Регистрация: 28.02.2009
Сообщений: 4
По умолчанию

спасибо, довольно ловкое решение
но есть проблема
дефис не отделяется пробелами от слов (на то он и дефис)
тире отделяется а дефис нет, вот такая вот бяка)))

в моем решении (пока еще не совсем доработаном)
вначале выводится первые слова без дефиса, затем вся конструкция "слово-СЛОВО" вносится в массив прям из потока
внутри массива оно переворачивается в "СЛОВО-слово" выводится и так же из потока выводится остальное
получается довольно громоздкое решение и написать к нему блок схему очень долго и трудно



я думал еще над таким вариантом(реализовать у мну не получается)

вначале слово вносится в память, затем если после него пробел то оно печатается,
а если после него дефис то оно не печатается
а печатается следующее слово до пробела
после пробела печатается то что в памяти(слово перед дефисом)
ну и до конца файла из потока

вот. так что тема все еще открыта)

Последний раз редактировалось Кси; 28.02.2009 в 21:35.
Кси вне форума
Старый 02.03.2009, 05:09   #4
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Кси Посмотреть сообщение
вот. так что тема все еще открыта)
Помоему проще, чем решение приведенное ниже, не придумаешь.
Из файла читаем посимвольно в буфер до тех пор пока не встретится символ разделитель. Полученное слово проверяется на наличие дефиса, и если найден просто выводим то что после дефиса перед тем что до него(без фактической перестановки).
Код:
#include<stdio.h>


#define MAX_DELIM ( sizeof(delims) / sizeof(delims[ 0 ]) )



/**
Возвращает количество символов в буфере
**/
int _strlen( char *buffer )
 {
 int i=0;
 for( ; *buffer; buffer++, i++ );
 return i;
 }


/**
Просматривает буфер на наличие в нем заданного символа
если символ найден то указатель установлен на нем, если нет то
возвращает пустой указатель.
**/
char *_strchar( char *buffer, unsigned char symbol )
 {
 int sig=0;
 for( ; *buffer; buffer++ )
  {
  if( *buffer==symbol )
   {
   sig+=1;
   break;
   }
  }
 return( sig ) ? buffer : NULL;
 }








int main()
 {
 int i, j, n;
 char *ptr, *tmp, buf[ 1024 ], *buffer=&buf[ 0 ];


 unsigned char delims[] = " \t.,!:\'\"\\()\n";
 int ch;

 FILE *Ifile;

 Ifile = fopen( "DATA.TXT", "r" );

 if( !Ifile )
  {
  perror( "DATA.TXT" );
  return 1; 
  }

 fseek( Ifile, 0L, SEEK_SET );
 for( i=0; ; )
  {
startscn:
  if( (ch = fgetc(Ifile))==EOF ) break;

  for( j=0; j<MAX_DELIM; j++ )
   {
   if( ch==delims[ j ] )
    {
    buffer[ i ]='\0';
    i=0;


    ptr = _strchar( buffer, '-' );
    if( ptr && _strlen(buffer)>1 )
     {
     buffer[ ptr-buffer ]='\0';
     ++ptr;

     //print
     printf( "%s-%s", ptr, buffer );
     }
    else
     {
     printf( "%s", buffer );
     }

    printf( "%c", ch );
    goto startscn;
    }
   }
  buffer[ i++ ]=ch;
  }

 return 0;
 }

Последний раз редактировалось Stilet; 02.03.2009 в 08:00.
Nomlpppp вне форума
Старый 06.03.2009, 08:17   #5
Кси
 
Регистрация: 28.02.2009
Сообщений: 4
По умолчанию

спасибо огромное за помощь в решении этой задачи)

всегда на информатику все решал сам (все таки научиться более менее программировать надо) а тут подкинули задачу которая не поулчается
а время поджимает, другие предметы тоже висят не разгребешь

СПАСИБО ВСЕМ КТО ОТКЛИКНУЛСЯ И ВСЕМ КТО ПРОСМОТРЕЛ)

тему можно закрыть
Кси вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачка про часики. RealSHELS Паскаль, Turbo Pascal, PascalABC.NET 2 13.09.2008 18:17
Простая задачка Dukalis Общие вопросы C/C++ 1 13.01.2008 18:10