Кое что не получилось!

Тема в разделе "C/C++/C#", создана пользователем Alenushka, 3 ноя 2010.

  1. Alenushka

    Alenushka Гость

    Вот что удалось написать самой ;) Больше не смогла, т.к. в программирование 0 :)

    Код (Text):
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #define N 20
    #define G 26
    // ПРЕДВАРИТЕЛЬНОЕ ОБЪЯВЛЕНИЕ ФУНКЦИЙ
    // Заголовок программы
    void Title();
    // Ввод предложения1
    void InpPredl (char predl[]);
    // Выделение из предложения1
    void Select(const char *predl, char m[][N],char *sel, int *n);
    // Ввод предложения2
    void InpPred2 (char pred2[]);
    // Выделение из предложения2
    void Select(const char *pred2, char m[][N],char *sel, int *n);
    // Сборка предложения1
    char *Constructor(char slova[][N], int sl);
    // Сборка предложения2
    char *Constructor(char slova[][N], int s1);
    // Вывод результата
    void OutPredl(char *s1, char *s2);
    // ОСНОВНАЯ ФУНКЦИЯ
    int main ()
    {
    // ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ
    char pred1[80]; // Введенное предложение1
    char pred2[80]; // Введенное предложение2
    char *b ="QWERTYUIOPASDFGHJKLZXCVBNM";// Буквы заглавные
    char *r="`!;:,.?- "; // Разделительные знаки
    char *res; // Результирующее предложение
    char slova[N][N]; // Массив слов в предложении
    char razd [N][N]; // Массив разделителей в предложении
    int sl=-1,s3=-1, rz=-1; // Счетчики слов и разделителей
    // Заголовок программы
    Title ();
    // Ввод предложения1
    InpPred1 (pred1);
    // Выделение из предложения1 слов
    Select (pred1, slova, r, &sl);
    // Выделение из предложения1 разделителей
    Select (pred1, razd, b, &rz);
    // Ввод предложения2
    InpPred2 (pred2);
    // Выделение из предложения2 слов
    Select (pred2, slova, r, &s3);
    // Выделение из предложения2 разделителей
    Select (pred2, razd, b, &rz);
    // Сборка предложения1
    res = Constructor(slova,sl);
    // Вывод результата1
    OutPredl (pred1, res);
    // Сборка предложения2
    res = Constructor(slova,s3);
    // Вывод результата2
    OutPred1 (pred2, res);
    //Освобождение ресурсов
    free (res);
    }
    // ОПИСАНИЕ ИСПЛЬЗУЕМЫХ ФУНКЦИЙ
    // Заголовок программы(номер лабораторной и задание)
    void Title()
    {
    puts (" Laboratorna9 rabota № 8");
    puts (" V dvux predlozenijx naiti i");
    puts (" raspechatat sovpadaushie slova.\n");
    }
    // Ввод предложения1
    void InpPredl(char *s)
    {
    puts(" Vvedite predlogenie1 \n");
    strcpy (s," Skolko slov?");
    // gets (s);
    }
    // Ввод предложения2
    void InpPred2(char *s)
    {
    puts(" Vvedite predlogenie2 \n");
    strcpy (s," Skolko slov?");
    // gets (s);
    }
     
  2. flashkpi

    flashkpi Гость

    Если че, пиши, сделаем без проблем
    icq: 588002847
    email: flash_1989@ukr.net
     
  3. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Выше 2 суппостата. Человек же сам пытался.. rrrFer, тем более ты, учитывая кол-во задач решенных тобой. +- 1..
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Как то тут все так в одну кучу валено.... Сложно даже от чего оттолкнуться, что бы автору помочь, именно *С его* кодом....
    Если честно вообще кроме этого:
    И этого:
    Ничего конструктивного не увидел.....
    Автор надеюсь будет не против, если его код координально видо изменить?
    P.S. И вопрос есть, "Совпадающие слова", это "одинаковые слова" - те которые содержатся в двух предложениях как минимум 1 раз...
    Или все же слова которые одинаковые как по значению так и индексу расположения в предложении (если считать от (1)-первое слово, (2)-второе )?
     
  5. Alenushka

    Alenushka Гость

    "Автор надеюсь будет не против, если его код координально видо изменить?" - не, не против, главное хочу понять как что делается!

    Да, это одинаковые слова которые содержатся в двух предложениях как минимум 1 раз.
     
  6. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (C++):
    #include <iostream>

    using namespace std;

    void Title()
    {
    puts (" Laboratorna9 rabota № 8");
    puts (" V dvux predlozenijx naiti i");
    puts (" raspechatat sovpadaushie slova.\n");
    }

    void main (void)
    {
    const char *r="`!;:,.?- "; // Разделительные знаки
    setlocale(LC_ALL,"Russian"); //Для локали *т.к. пишу код в CP1252
    Title();
    char Str1[128],Str2[128]; //Наши строки (предложения)
    char StrResult[128]; //Результирующая строка (встречаемые слова в двух предложениях)
    memset(StrResult,0,128); //Обнулим всю память строки StrResult

    //Ввод строк (предложений)
    cout<<"Введите 1-ое предложение :"<<endl;
    cin.getline(Str1,127);
    cout<<"Введите 2-ое предложение :"<<endl;
    cin.getline(Str2,127);

    char buffer[128]; //Буферная переменная, для наших слов
    int cnt = 0; //Счетчик для записи слова
    memset (buffer,0,128); //Обнулим буферную переменную

    for (int i=0; i<=strlen(Str1); i++) //Обойдем каждый символ строк 1
    {

    bool isRazdel = false; //Предположим, что текущий символ - не разделитель
    for (int j=0; j < strlen(r); j++) //Обойдем каждый символ строки-разделителей
    {
    if (Str1[i] == r[j] || Str1[i]==0) //Если поймем что текущий символ - разделитель, то
    {
    isRazdel = true; //запишим тру
    }
    }
    if (!isRazdel) //Если у нас не разделитель
    {
    buffer[cnt] = Str1[i]; //То запишим этот символ в буффер в позицию cnt
    cnt++; //Увеличим счетчик cnt
    }
    else //Если же символ разделитель, что означает конец слова
    {
    if (strstr(Str2,buffer)) //Если слово встречается во второй строке
    {
    if (!strstr(StrResult,buffer)) //И если еще не встречается в StrResult
    {
    strcat(StrResult,buffer); //Запишим его в результирующую строку
    strcat(StrResult," "); //Пробел добавим
    }
    }
    cnt = 0;
    memset (buffer,0,128);
    }
    }

    cout<<endl<<"Слова которые встречаются в обоих предложениях:"<<endl;
    setlocale(LC_ALL,".866");
    cout<<StrResult;



    }

















    /*#include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #define N 20
    #define G 26
    // ПРЕДВАРИТЕЛЬНОЕ ОБЪЯВЛЕНИЕ ФУНКЦИЙ
    // Заголовок программы
    void Title();
    // Ввод предложения1
    void InpPredl1 (char predl[]);
    // Выделение из предложения1
    void Select(const char *predl, char m[][N],char *sel, int *n);
    // Ввод предложения2
    void InpPredl2 (char pred2[]);
    // Выделение из предложения2
    void Select(const char *pred2, char m[][N],char *sel, int *n);
    // Сборка предложения1
    char *Constructor(char slova[][N], int sl);
    // Сборка предложения2
    char *Constructor(char slova[][N], int s1);
    // Вывод результата
    void OutPredl(char *s1, char *s2);
    // ОСНОВНАЯ ФУНКЦИЯ
    int main ()
    {
    // ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ
    char pred1[80]; // Введенное предложение1
    char pred2[80]; // Введенное предложение2
    char *b ="QWERTYUIOPASDFGHJKLZXCVBNM";// Буквы заглавные
    char *r="`!;:,.?- "; // Разделительные знаки
    char *res; // Результирующее предложение
    char slova[N][N]; // Массив слов в предложении
    char razd [N][N]; // Массив разделителей в предложении
    int sl=-1,s3=-1, rz=-1; // Счетчики слов и разделителей
    // Заголовок программы
    Title ();
    // Ввод предложения1
    InpPredl1 (pred1);
    // Выделение из предложения1 слов
    Select (pred1, slova, r, &sl);
    // Выделение из предложения1 разделителей
    Select (pred1, razd, b, &rz);
    // Ввод предложения2
    InpPredl2 (pred2);
    // Выделение из предложения2 слов
    Select (pred2, slova, r, &s3);
    // Выделение из предложения2 разделителей
    Select (pred2, razd, b, &rz);
    // Сборка предложения1
    res = Constructor(slova,sl);
    // Вывод результата1
    OutPredl (pred1, res);
    // Сборка предложения2
    res = Constructor(slova,s3);
    // Вывод результата2
    OutPredl1 (pred2, res);
    //Освобождение ресурсов
    free (res);
    }
    // ОПИСАНИЕ ИСПЛЬЗУЕМЫХ ФУНКЦИЙ
    // Заголовок программы(номер лабораторной и задание)
    void Title()
    {
    puts (" Laboratorna9 rabota № 8");
    puts (" V dvux predlozenijx naiti i");
    puts (" raspechatat sovpadaushie slova.\n");
    }
    // Ввод предложения1
    void InpPredl1(char *s)
    {
    puts(" Vvedite predlogenie1 \n");
    strcpy (s," Skolko slov?");
    // gets (s);
    }
    // Ввод предложения2
    void InpPredl2(char *s)
    {
    puts(" Vvedite predlogenie2 \n");
    strcpy (s," Skolko slov?");
    // gets (s);
    }
    */
    Добавлено: Если что н понятно по коду, пиши отвечу...
     
  7. Alenushka

    Alenushka Гость

    Хорошо! Спасибо. Щас почитаю, вникну и спрошу если что:welcome:
     
  8. Alenushka

    Alenushka Гость

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

    if (strstr(Str2,buffer)) //Если слово встречается во второй строке -

    strstr - ищет слово в строке 2 из буфера ? и если нет то ничего не записывает в результат?
     
  9. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    strstr(Str2,buffer) - Ищит первое вхождение последовательности buffer(в нашем случае, это слово (фрагмент строки ограниченный разделителями)) в строке Str2(наша вторая строка), если вхождение найдено ф-ия возвращает указатель на начало этого вхождения char*, если же нет то возвращает NULL...
    Иными словами, выбрав слово из первой строки мы проверяем есть ли это слово(фрагмент) во второй строке...

    Да, если вхождения нет - то в результат это не записывается, а еще не записывается, если это слово уже содержится в результе (тоесть уже идет повторение слова в строке Str1)...

    В том примере который я запостил, я упустил проверку на слова в которых фрагмент повторятся : типо "дом" "домовой" что бы это реализовать, тебе следует проверить символ который идет за фрагментом в строке Str2 (он должен быть разделителем или Нуль-символом "\0"), примерно так
    Код (C++):
    if (strstr(Str2,buffer))
    {
    char *test = strstr(Str2,buffer)+ strlen(buffer); //или char test = strstr(Str2,buffer)[strlen(buffer];
    //а далее *test - сравнить с разделителями и с "\0"


    }
     
  10. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Как то так:
    Код (C++):
            else //Если же символ разделитель, что означает конец слова
    {
    if (strstr(Str2,buffer)) //Если слово встречается во второй строке
    {
    char *test = (strstr(Str2,buffer))+strlen(buffer);

    bool WordTest = false;
    for (int j=0; j < strlen(r); j++) //Обойдем каждый символ строки-разделителей
    {
    if (*test == r[j] || *test==0) //Если поймем что текущий символ - разделитель, то
    {
    WordTest = true;
    }
    }

    strcat(buffer," ");
    if (!strstr(StrResult,buffer) && WordTest) //И если еще не встречается в StrResult
    {
    strcat(StrResult,buffer); //Запишим его в результирующую строку
    }
    }
    cnt = 0;
    memset (buffer,0,128);
    }
     
  11. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    2: vital :
    Витал, rrrFer прав, задача была на уровне написания void main(void), кроме шапки ничего дельного не было...
    И реально в месяц таких задач только тут решается от 2 и выше...
     
Загрузка...

Поделиться этой страницей