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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Удалить из текста слово, Курсовик - работа со строками.  
:(
    Опции темы
Hyperman1492
Дата 28.12.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня есть задание (ниже), по нему писал курсовик. функция обработки (createNewStr) - не работает.
Всегда все делаю сам и помогаю другим, но сейчас уже неделю не могу понять, в чем ошибка (и). Помогите пожалуйста.
Загрузил срр файл.








Код

/*
  Работу выполнил:
                  студент группы 7307
                  Орехов В.В.

  Задание:
          Удалить из заданного текста заданное слово и, если в данной
          строке встречалось данное слово, то после данной строки
          вставить заданную строку

                                                                        */



#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <alloc.h>

//Основные функции
int mainMenu(void);     //Функция вывода меню, возвращает
                        //выбранный пункт
//Функции ввода
char **inputText(int *);  //Функция ввода текста вариант 2
char *inputStr(void);   //Функция ввода строки
char *inputWord(void); //Функция ввода слова

//Функции вывода
void outputText(char **, int); //Функция вывода текста
void outputWord(char *);//Функция вывода слова

//Функции обработки
char **createNewStr(char **, char *, char *, int *);//Функция для обработки строки

//Вспомогательные функции
int checkChar(char *StrF);//Функция проверки символа
void freeMem2(char **, int);//освобождение памяти, выделенной под двойной указатель
void freeMem1(char *mas);//освобождение памяти, выделенной под указатель

void main (void)
{
 int menuAns;     //Селектор меню


 int ans1=1;      //Переменная, отвечающая за выход из программы
 char *Str=NULL;  //указатель на область динамической памяти для хранения
                   //строки после ввода
 char **text=NULL;  //указатель на область динамической памяти для хранения
                   //строки после ввода
 char *Word=NULL; //указатель на область динамической памяти для хранения
                  //слова после ввода
 char **newStr=NULL;
 int vvod1, vvod2, vvod3;//переменные для защиты от преждевременного выполнения
 int n, m, i;// n - количество строк в исходном тексте, m - количество строк в обработанном тексте


 do
   {
    menuAns=mainMenu();
    switch(menuAns)
      {
       case 1:
           //Ввод текста
           freeMem2(text, n);
           text=inputText(&n);
           m = n;
           break;
       //-----------------------------------------------------------
       case 2:
           if(text!=NULL)//если строка введена
             {
              clrscr();
              outputText(text, n);
             }
           else
             {
              puts("\nStroka vvedena nekorrektno ili ne vvedena");
              getch();
             }
           break;
       //-----------------------------------------------------------
       case 3:
           freeMem1(Str);
           inputStr();
           Str=inputStr();

           break;
       //-----------------------------------------------------------
       case 4:
           if(Str!=NULL&&*Str!='\0')
           outputWord(Str);
           break;
       //-----------------------------------------------------------
       case 5:
           //Ввод слова
           freeMem1(Word);
           inputWord();
           Word=inputWord();
           break;
       //-----------------------------------------------------------
       case 6:
           if(Word!=NULL)//если слово введено
             {
              outputWord(Word);
             }
           else
             {
              puts("\nSlovo vvedeno nekorrektno ili ne vvedeno");
              getch();
             }
           break;
       //-----------------------------------------------------------
       case 7:
           if(Word!=NULL&&text!=NULL)//если и строка, и слово введено
             {
              freeMem2(newStr, m);
              newStr=createNewStr(text, Word, Str, &m);
             }
           else
             {
              puts("\nVipolnite punkt 1 i 3");
              getch();
             }
           break;
       //-----------------------------------------------------------
       case 8:
           if(newStr!=NULL&&newStr!='\0')//если обработка массива проведена
             {
               clrscr();
               outputText(newStr, n);

               getch();
             }
           else
             {
              puts("\nMassiv orabotannekorrektno ili ne obrabotan. Vipolnite punkt 5");
              getch();
             }
           break;
       //-----------------------------------------------------------
       case 9:

           break;
       //-----------------------------------------------------------
       case 0:
           ans1=0;
           break;
       //-----------------------------------------------------------
       default:
           printf("\nNeizvestniy punkt");
           getch();
           break;
      }
   }
 while(ans1==1);

  freeMem1(Word);
  freeMem2(text, n);
  freeMem1(Str);
  freeMem2(newStr, m);

}
//=======================================================================
int mainMenu(void)
{
 int menuAnsF;//от Menu Answer. F - от Function => локальная переменная
              //функции

 clrscr();
 puts("\n  Menu:");
 puts("\n  1. Vvod texta.");
 puts("\n  2. Kontrolniy vivod texta.");
 puts("\n  3. Vvod stroki, kotoruyu neobhodimo vstavit\'");
 puts("\n  4. Kontrolniy vivod stroki");
 puts("\n  5. Vvod slova, kotoroe neobhodimo udalit\'.");
 puts("\n  6. Kontrolniy vivod slova.");
 puts("\n  7. Obrabotka texta.");
 puts("\n  8. Vivod rezultata.");
 puts("\n  9. Help.\n");
 puts("\n  0. Vihod.\n");
 scanf("%d",&menuAnsF);
 return(menuAnsF);
}

char **inputText(int *n)//ввод текста
{
 int i, j;

 char **text=NULL;
 j=0;
 clrscr();
 printf("\nVvedite TEXT:");
 printf("\npo okonchanii nagmite Enter 2 raza\n");
 do
   {
    text=(char**)realloc(text,(j+1)*sizeof(char*));
    text[j]=(char*)malloc(80*sizeof(char));
    fflush(stdin);
    gets(text[j]);
    j++;
   }
 while (text[j-1][0]!='\0');
 j--;
 *n=j;
 return text;
}
//=======================================================================
char *inputStr(void)//ввод строки
{
 char b[81];//массив для хранения строки до ввода
 int i, exit=0;
 char ch;
 char *StrF;

 clrscr();
 puts("\nVvedite stroku (ne bolee 80 simvolov, bez znakov prepinaniya i probelov):\n");

 do
   {
    i=0;
    do
      {
       ch=getchar();
       b[i]=ch;
       i++;
      }
    while(i<80&&ch!='\n');//пока введено <81 символа и нет перехода на
                           //следующую строку
    if(i>=80)
      {
       printf("stroka = 80 simvolov, vvedite stroku eshe raz");
       getch();
       StrF=(char*) malloc(sizeof(char));
       *StrF='\0';
      }
    else
      {
       StrF=(char*) malloc((strlen(b)+1)*sizeof(char));
       b[i]='\0';
       strcpy(StrF,b);//копирование строки b в строку StrF
       exit=1;
      }
   }
 while(exit==0);
 return(StrF);
}
//=======================================================================
char *inputWord(void)//ввод слова
{
 char b[81];//массив для хранения строки до ввода
 int i, bul, exit=0;
 char ch;
 char *StrF;

 clrscr();
 puts("\nVvedite slovo (ne bolee 80 simvolov):");

 do
   {
    i=0;
    do
      {
       ch=getchar();
       if(checkChar(&ch)==1)
         {
          b[i]=ch;
          i++;
         }
      }
    while(i<80&&ch!='\n');//пока введено <81 символа и нет перехода на
                           //следующую строку
       if(i>=80)
         {
          printf("slovo = 80 simvolov, vvedite stroku eshe raz");
          getch();
         }
       else
         {
          StrF=(char*) malloc((strlen(b)+1)*sizeof(char));
          b[i]='\0';
          strcpy(StrF,b);//копирование строки b в строку StrF
          exit=1;
         }
    }
 while(exit==0);
 return(StrF);
}
//=======================================================================
void outputWord(char *StrF)//вывод строки или слова
{
 clrscr();
 puts(StrF);
 getch();
}
//=======================================================================
void outputText(char **StrF, int n)//вывод текста
{
 int i;
 clrscr();
 for(i=0;i<n;i++)
   {
    puts(StrF[i]);
   }
 getch();
}
//=======================================================================
char **createNewStr(char **text, char *word, char *str, int  *m)
{
 int plus=0, M;
 int i=0, j=0;//перменные, характеризующие элемент исходного текста
 int ic=0, k=0;//переменные, характеризующие элемент формируемого массива
 int d=0;//положение символа в слове
 char **a, *b, **c;//рабочие адреса строки, слова и новой строки
 char *a1, *b1;

 int bul;
 char **newStrF=NULL;

    a=text;
    plus=0;
    c=newStrF;
    b=word;
    b1=word;//адрес первого символа слова
    for(i=0;i<M;i++)
      {
       a1=text[i];//адрес первого символа строки
       j=0;

       if (newStrF==NULL)
         newStrF=(char **) malloc(sizeof(char*));
       else
         newStrF=(char **) realloc(newStrF,(i+1)*sizeof(char*));

       while(*a)//пока не конец строки
         {
          while(checkChar(a[i]+j)==0)//пропуск знаков препинания и пробелов
            {
             j++;
            }
          if(*a)//пока не конец строки
            {
             bul=1;
             while(checkChar(a[i]+j)!=0&&bul!=0&&*b)
             /*Пока в строке нет знаков препинания и пробелов и
             символ строки равен символу слова и не конец слова*/
               {
                if(*(a[i]+j)==*(b+d))//если слово и слово в строке совпадают
                  {
                   j++;
                   d++;
                  }
                else
                  {
                   bul=0;
                  }
               }
             if(bul==0)//если слово и слово в строке не совпали
               {
                while(checkChar(a[i]+j)!=0&&a[i]!=a1)
                /*пока символ строки - не знак препинания и не пробел
                переходим на символ назад*/
                  {
                   j--;
                  }
                j++;
                if(a[i]==a1)
                  {
                   j--;
                  }
                while(checkChar(a[i]+j)!=0&&*a)//пока не разделитель-копируется слово
                  {
                   if (newStrF[ic]==NULL)
                     newStrF[ic]=(char*) malloc(sizeof(char));
                   else
                     newStrF[ic]=(char*) realloc(newStrF,sizeof(char));
                   *(c[ic]+k)=*(a[i]+j);//в новую строку записывается символ исходной строки

                   k++;
                   j++;
                  }
                while(checkChar(a[i]+j)!=1&&*a)//пока не буква-копируются разделители
                  {
                   if (newStrF[ic]==NULL)
                     newStrF[ic]=(char*) malloc(sizeof(char));
                   else
                     newStrF[ic]=(char*) realloc(newStrF,sizeof(char));
                   *(c[ic]+k)=*(a[i]+j);//в новую строку записывается символ исходной строки

                   k++;
                   j++;
                  }
               }
              else
                {
                 plus=1;
                }
             b=b1;//переход на первую букву слова
            }
         }
      *(c[ic]+k)='\0';
      ic++;//переход на след. строку в новом тексте
      }//конец цикла for
    printf("Massiv obrabotan");
    getch();
    *m=M;

 outputText(newStrF, M);
 return (newStrF);
}

//=======================================================================
int checkChar(char *StrF)//проверка символа
{
 int Boolean;
 if(   *StrF==' '
    || *StrF==','
    || *StrF=='.'
    || *StrF=='!'
    || *StrF=='?'
    || *StrF==';'
    || *StrF==':'
    || *StrF=='!'
    || *StrF=='\''
    || *StrF=='\"'
    || *StrF=='('
    || *StrF==')'
    || *StrF=='*'
    || *StrF=='$'
    || *StrF=='#'
    || *StrF=='№'
    || *StrF=='@'
    || *StrF=='-'
    || *StrF=='^'
    || *StrF=='>'
    || *StrF=='<'
    || *StrF=='/'
   )
   {
    Boolean=0;
   }
 else
   {
    Boolean=1;
   }

 return Boolean;
}
//=======================================================================
void freeMem2(char **mas, int N)
/*
  Освобождение участка динамической памяти, выделенной под указатель
  на массив адресов
*/
{
 int i;
 //Освобождение выделенной ранее динамической памяти
 if(mas!=NULL)
   {
    for(i=0;i<N;i++)
      {
       free(mas+i);
      }
    free(mas);
    mas=NULL;
   }
}
//=======================================================================
void freeMem1(char *mas)
/*
  Освобождение участка динамической памяти, выделенной под указатель
  на массив символов
*/
{
 int i;
 //Освобождение выделенной ранее динамической памяти
 if(mas!=NULL)
   {
    free(mas);
    mas=NULL;
   }
}


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



****


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

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




M
zkv
Hyperman1492, с правилами ознакомьтесь и оформляйте темы соответственно.


Добавлено через 5 минут и 50 секунд
Цитата(Hyperman1492 @  28.12.2007,  10:19 Найти цитируемый пост)
функция обработки (createNewStr) - не работает.

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

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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