motofan logo
       
> 

Программисты на С/С++, помогите пожалуйста

sasha45
сообщение 24.1.2008, 14:53


Ветеран
*****

Группа: Пользователи
Сообщений: 580
Регистрация: 13.7.2005
Из: Санкт-Петербург
Пользователь №: 46 095
Модель телефона: Motorola RIZR Z3

Рейтинг: 56



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

Ввод строки я написал. Благо тут ничего сложного нету.
Код

char *vvod_str(char *str)
  {
    // Массив для хранения исходной строки
    char a[81];
    int i, exit=0;
    int bul;
    do
      {
    clrscr();
    bul=1;
    printf("\n Введите строку: ");
    // Как только нарушится условие bul==1
    // работа цикла прекращается
    for(i=0;bul==1;i++)
      {
        a[i]=getchar();
        if('\n'==a[i])
          {
        a[i]='\0';
        str=(char*)calloc(i+1,1);
        strcpy(str,a);
        exit=1;
        bul=0;
          }
      /*  else
          bul=0; */
      }
      }
    while(exit==0);
    return(str);
  }


Далее идет функция обработки строки. Начало где-то такое:

Код

// В функцию передается введенная пользователем строка
char *obrabotka(char *str)
  {
    // Для работы с исходной строкой
    char *tmp;
    int i,j,k;
    // Массив, в котором каждое слово строки это строка массива
    char mas_slov[81][81];
    
    // Передаем исходную строку в функцию, присваивая её переменной tmp
    tmp=str;
    while(checkChar(tmp)!=0)
      {
        // Если разделитель
        if(checkChar(tmp)==0)
          // Идем посимвольно дальше
          tmp++;
       ........ а вот что делать дальше не могу понять.
        Как записать слово в строку двумерного массива.



А, да. Функция checkChar - функция проверки разделителей, которая возвращает целое значение 0, если в строке встретился разделитель, и возвращает 1, если это символ (буква или цифра).

Помогите пожалуйста написать функцию обработки.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
mEASYn
сообщение 24.1.2008, 18:08


FireStarter
*****

Группа: Пользователи
Сообщений: 555
Регистрация: 26.7.2006
Из: Северодвинск <-> Питер
Пользователь №: 92 807
Модель телефона: Google Phone G1
Прошивка: android 1.0

Рейтинг: 593



Код
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <string.h>

char str[80];
char word[80][80];

int check(char c)
    {
    if ((c==' ') || (c==',') || (c=='.')) return 1;
    if (c=='\n') return 2;
    return 0;
    }

char *vvod()
    {
    char s[80];
    gets(s);
    return (s);
    }

void split(char *s)
    {
    //char word[80][80];
    int num_of_words=0;
    int a=0 , b=0 , exit=0;

    do
     {
     switch (check(s[a]))
      {
      case 0: if (b==0) num_of_words++;
          word[num_of_words][b]=s[a]; b++; word[num_of_words][b]='\n';
          break;
      case 1: b=0; while (check(str[a+1])==1) a++;
          break;
      case 2: exit=1; word[num_of_words][b]='\n';
          break;

      }
     a++;
     }
    while (!exit);

    for (a=1; a<=num_of_words; a++)
        {
        printf("%s\n",word[a]);
        }

    }

void main ()
{
clrscr();
strcpy(str,vvod());
split(str);
getch();
}


Сообщение отредактировал mEASYn - 24.1.2008, 18:16
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
sasha45
сообщение 24.1.2008, 18:33


Ветеран
*****

Группа: Пользователи
Сообщений: 580
Регистрация: 13.7.2005
Из: Санкт-Петербург
Пользователь №: 46 095
Модель телефона: Motorola RIZR Z3

Рейтинг: 56



mEASYn, а твоя программа переставляет слова в алфавитном порядке? Просто я не могу понять в каком месте у тебя идет замена слов местами.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
mEASYn
сообщение 24.1.2008, 19:29


FireStarter
*****

Группа: Пользователи
Сообщений: 555
Регистрация: 26.7.2006
Из: Северодвинск <-> Питер
Пользователь №: 92 807
Модель телефона: Google Phone G1
Прошивка: android 1.0

Рейтинг: 593



Не сортирует, я так понял что проблема только в разбиении слов.
чтобы упорядочить легче переводить строки char в ansistring , тогда их можно будет сравнивать как обычные числа (>, =, <) ну а сортировку сделать элементарным "пузырьком".
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
sasha45
сообщение 24.1.2008, 19:45


Ветеран
*****

Группа: Пользователи
Сообщений: 580
Регистрация: 13.7.2005
Из: Санкт-Петербург
Пользователь №: 46 095
Модель телефона: Motorola RIZR Z3

Рейтинг: 56



А понял. А функция разбиения строки возвращает какое-нить значение? потому что мне надо и разбивку строки и сортировку в одной функции. Сортировку я сделать уже смогу.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
mEASYn
сообщение 24.1.2008, 20:20


FireStarter
*****

Группа: Пользователи
Сообщений: 555
Регистрация: 26.7.2006
Из: Северодвинск <-> Питер
Пользователь №: 92 807
Модель телефона: Google Phone G1
Прошивка: android 1.0

Рейтинг: 593



Код
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <string.h>

char str[80];
char word[80][80];

int check(char c)
    {
    if ((c==' ') || (c==',') || (c=='.')) return 1;
    if (c=='\0') return 2;
    return 0;
    }

char *vvod()
    {
    char s[80];
    gets(s);
    return (s);
    }

void split(char *s)
    {
    int num_of_words=0;
    int a=0 , b=0 , exit=0;

    do
     {
     switch (check(s[a]))
      {
      case 0: if (b==0) num_of_words++;
          word[num_of_words][b]=s[a]; b++; word[num_of_words][b]='\0';
          break;
      case 1: b=0; while (check(str[a+1])==1) a++;
          break;
      case 2: exit=1; word[num_of_words][b]='\0';
          break;

      }
     a++;
     }
    while (!exit);



    b=1;
    char *ss;
    while (b<num_of_words)
        {
        if (strcmp(word[b],word[b+1])>0)
            {
            strcpy(ss,word[b]);
            strcpy(word[b],word[b+1]);
            strcpy(word[b+1],ss);
            b=0;
            }
        b++;
        }



    for (a=1; a<=num_of_words; a++)
        {
        printf("%s\n",word[a]);
        }

    }

void main ()
{
clrscr();
strcpy(str,vvod());
split(str);
getch();
}


возвращение массива в лом делать, процедура только глобальную переменную меняет. Есть еще один баг - если разделитель последним символом стоит , то чего то неправильно делит, но тоже лень исправлять.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
sasha45
сообщение 24.1.2008, 20:24


Ветеран
*****

Группа: Пользователи
Сообщений: 580
Регистрация: 13.7.2005
Из: Санкт-Петербург
Пользователь №: 46 095
Модель телефона: Motorola RIZR Z3

Рейтинг: 56



ОК. спасибо большое. постараюсь исправить=)))
Очень выручил меня=))
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Программисты на С/С++, помогите пожалуйста · Обо всём · Forum
 

Ответ в темуСоздание новой темы
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28.7.2025, 19:14

Форум живёт: