Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Си строки


Автор: Bartman2D 10.10.2010, 14:13
Помогите пожалуйста написать программу. Суть программы заключается в том, что: "Даны два предложения. Для каждого слова первого предложения определить, входит ли оно во второе предложение." Уже несколько дней делаю ничего не выходит.
Код
char str1[100], str2[100];
    char str[20];
    for(int i=0;i<20;i++)
    {
        str[i]=0;
    }
    printf("Введите первую строку на английском языке: \n");
    gets(str1);
    printf("Введите вторую строку на английском языке: \n");
    gets(str2);
    int len1=strlen(str1), len2=strlen(str2);
    for(int i=0;i<len1;i++)
    {
        for(int j=0;j<len2;j++)
            if(str1[i]==str2[j])
                for(int k=0;k<20;k++)
                {
                    if(str[k]==0)
                    {
                        str[k]=str1[i];
                        k=20;
                        j=len2;
                    }
                }
                if(str1[i]==' ')
                    printf("В обоих предложениях содержатся слова:\n ");
                    printf("%s ", str);
    }
    system("pause");


что-то такое нарисовалось, дальше додумать не могу. Может быть предложите альтернативный вариант решения?

Автор: Crafty 10.10.2010, 15:12
Код

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using std::vector;  using std::string;
using std::cout;    using std::endl;
int main()
{
  string str1("Hello world this is I");
  string str2("am u here world is");
  std::istringstream stream(str1);
  string word;
  vector<string> words;
  while (stream >> word)
    words.push_back(word);  //заполняем вектор словами из первой сторки
    
  vector<string>::const_iterator beg = words.begin();
  while (beg != words.end())
  {
    if (str2.find(*beg) != string::npos)  // Ищем слово во второй строке
      cout << "Word (" << *beg << ") is found" << endl;
    else
      cout << "Word (" << *beg << ") is not found" << endl;
    ++beg;
  }
  return 0;
}


Добавлено через 38 секунд
Спрашивайте если что-то непонятно.

Автор: Bartman2D 10.10.2010, 15:21
УУУУУ Для меня это темный лес что вы написали, я только новичек. мы программируем, на с++, а там вроде из с элементов много. ну и практически все операторы я не знаю) да и библиотеки такие впервые вижу, синтаксис для меня другой. я ничего не понял и этот код на данный момент изучения мне не возможно объяснить. но спасибо, что откликнулись.
мне надо это реализовать  с помощью библиотек 
#include <stdio.h>
#include <math.h>
#include <string.h>
Мы только операторы этих библиотек прошли ну и ещё нескольких.

Автор: vnf 10.10.2010, 15:29
Bartman2D,  ваш код написан на чистом С, код Crafty  - чистый С++ с STL. Вам как надо?

Автор: Bartman2D 10.10.2010, 15:33
Цитата(vnf @ 10.10.2010,  15:29)
Bartman2D,  ваш код написан на чистом С, код Crafty  - чистый С++ с STL. Вам как надо?

О_о я нуб. нам сказали, что изучаем чистый С++. Вот и пишу в таком стиле, как учат. Что за библиотека  <vector> я не знаю. 
using std::vector;  using std::string;
using std::cout;    using std::endl; и вот такие конструкции я впервые вижу, мы их никогда не использовали.

Автор: Crafty 10.10.2010, 15:47
Вот на С
Код

#include <stdio.h>
#include <string.h>

int main()
{
  char str1[] = "Hello world this is I";
  char str2[] = "am u here world is";
 
  char *pch = strtok (str1," ,.-");
  while (pch != NULL)
  {
    if (strstr(str2, pch))
      printf("Word (%s) is found\n", pch);
    else
      printf("Word (%s) is not found\n", pch);
    pch = strtok (NULL, " ,.-");
  }

  return 0;
}

Автор: Bartman2D 10.10.2010, 16:31
Это попонятней. Спасибо, но есть вопрос.
strstr
strtok - что это за функции?
но и как вижу в вашем примере строки уже даны( это конесно легко), но мне нужно, чтобы строки вводил пользователь.

Автор: Crafty 10.10.2010, 16:42
strstr(const char * str1, const char * str2) - возвращает указатель на первое вхождение подстроки str2 в строке str1. Подробнее http://www.cplusplus.com/reference/clibrary/cstring/strstr/.
strtok - использую для разделения строки на отдельные слова. Подробнее http://www.cplusplus.com/reference/clibrary/cstring/strtok/.


Цитата(Bartman2D @  10.10.2010,  17:31 Найти цитируемый пост)
но и как вижу в вашем примере строки уже даны( это конесно легко), но мне нужно, чтобы строки вводил пользователь.

А в чём проблема сделать ввод пользователем? 

Автор: Bartman2D 10.10.2010, 16:48
Цитата(Crafty @ 10.10.2010,  16:42)
strstr(const char * str1, const char * str2) - возвращает указатель на первое вхождение подстроки str2 в строке str1. Подробнее http://www.cplusplus.com/reference/clibrary/cstring/strstr/.
strtok - использую для разделения строки на отдельные слова. Подробнее http://www.cplusplus.com/reference/clibrary/cstring/strtok/.


Цитата(Bartman2D @  10.10.2010,  17:31 Найти цитируемый пост)
но и как вижу в вашем примере строки уже даны( это конесно легко), но мне нужно, чтобы строки вводил пользователь.

А в чём проблема сделать ввод пользователем?

спасибо, полезные функции. )

Автор: bsa 10.10.2010, 23:50
Bartman2D, своему преподу ты скажи, что тебя с твоим "С++" тебя на форуме послали. И сказали что это "С".
А С++ это совершенно другой язык!

Добавлено через 28 секунд

M
bsa
Изменил название темы

Автор: fuckingniger 11.10.2010, 04:23
не думаю что им можно использовать готовые функции)

надо самому написать их)

Добавлено через 7 минут и 53 секунды
если не додуматься самому то вводишь в гугле
алгоритм поиска слова в тексте 

Автор: Logree 11.10.2010, 05:35
Они изучаю язык Си ну или как там говорит его преподаватель "чистый C++", данные функции часть стандартной библиотеки языка(входят в него), а значит являются объектом изучения => использовать данные функции -  нужно. А построение "таких" алгоритмов проходят на паскале.

Автор: bsa 11.10.2010, 09:49
Цитата(Logree @  11.10.2010,  06:35 Найти цитируемый пост)
данные функции часть стандартной библиотеки языка(входят в него), а значит являются объектом изучения => использовать данные функции -  нужно.

Нужно, но только на курсе языка Си. Уже миллион раз был холивар на тему С++ против Си... ЭТО РАЗНЫЕ ЯЗЫКИ И ВМЕСТЕ ИХ УЧИТЬ НЕЛЬЗЯ!!! Если ты не знаешь ни одного из них, а выучить хочешь оба, то сначала нужно выучить С++, а потом уже доучить Си. Наоборот выйдет дольше и корявее.

Автор: djamshud 11.10.2010, 10:46
>сначала нужно выучить С++, а потом уже доучить Си. Наоборот выйдет дольше и корявее.

Все с точностью до наоборот. Препод правильно делает, что сначала учит их си. От простого к сложному.

Bartman2D, если от вас требуется понять алгоритмот А до Я, почитайте про strtok и strstr и напишите свои аналоги.

Автор: bsa 11.10.2010, 12:35
djamshud, имхо, программировать нужно учиться на языке типа паскаля (или бейсика), чтобы ничего не отвлекало. Программу написать на С++ проще, чем на С. Но выучить второй проще. Зато С++ очень сложно учить после С, так как постоянно пытаешься использовать приемы из С, что сильно усложняет процесс обучения.

Автор: mes 11.10.2010, 13:11
Цитата(bsa @  11.10.2010,  11:35 Найти цитируемый пост)
 так как постоянно пытаешься использовать приемы из С,

и если продолжать программировать си-приемами на С++, то так и не сможешь использовать силу C++, а в душе будет расти негодование типа "ООП must die"  smile 
надеюсь никто не обидится smile 


Автор: djamshud 11.10.2010, 13:24
bsa, имхо си можно отнести в категорию паскаля в смысле простоты первоначального изучения языка и дальнейшей прокачки алгоритмических навыков.

>Программу написать на С++ проще, чем на С.

Большую и жирную - да. Маленькую, да еще и в академических целях - нет. В этом топике два примера реализации - лаконичный, элегантный и, что в процессе обучения очень важно, очевидный на си и синтаксически тяжелый на плюсах.

>Зато С++ очень сложно учить после С, так как постоянно пытаешься использовать приемы из С, что сильно усложняет процесс обучения.

Это можно сказать о любой паре не почти одинаковых языков. После изучения своего первого языка, дальнейшие стоит осваивать начиная с парадигм, в них заложеных - в таком случае проблемы минимизируются. Если подходить "в лоб", то при изучении в порядке C++ -> C то же самое на С будут использовать приемы из С++.

Добавлено через 3 минуты и 24 секунды
mes, я отлично знаю С++ и достаточно хорошо ОО-проектирование в целом. И использую плюшки по назначению, а не абы как:).

/me не обиделся.

Автор: mes 11.10.2010, 14:31
Цитата(djamshud @  11.10.2010,  12:24 Найти цитируемый пост)
 Если подходить "в лоб", то при изучении в порядке C++ -> C то же самое на С будут использовать приемы из С++.

имхо, объективно это далеко не то же самое smile


Цитата(djamshud @  11.10.2010,  12:24 Найти цитируемый пост)
 и достаточно хорошо ОО-проектирование в целом. И использую плюшки по назначению, а не абы какsmile.

я не упрекал Вас в незнании, а наоборот остерегался, что воспримете на свой счет.. но Ваша "цитата" уж больно подходила для данного случая  smile 

Автор: djamshud 11.10.2010, 14:50
mes, под "то же самое" я имел в виду, что человек все равно наступит на грабли, пусть и на другие. Языки изучать с умом надо, вот и все.

Автор: Bartman2D 11.10.2010, 15:28
Да ладно вам холивары устраивать. Все сделал, сдал. Тема закрыта, код вот:
Код

#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <windows.h>
#include <string.h>
#include <conio.h>


int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    char str1[100];
    char str2[100];
    int a;
        do
        {
            printf("Введите первую строку на английском языке:\n");
            gets(str1);
            printf("Введите вторую строку на английском языке:\n");
            gets(str2);

            char *str = strtok (str1," ,.-"); //разделяем первое предложение на слова.
            char *strr = strtok (str2," ,.-");
            while (str = NULL)
            {
                if (strstr(strr, str)) //сравниваем слова и вторую строку, если есть вхождения то возвращает ненулевое значение.
                    printf("В обоих предложениях содержатся слова: %s \n", str);
                else
                    printf("\n");//"В этих предложениях нет повторяющихся слов.\n", str);
                    str = strtok (NULL, " ,.-");
            }
            printf("Повторить программу? 1-Да, 0-Нет.");
            scanf("%d", &a);
            getchar();
  
            }while(a!=0);
  
    return 0;
}


Автор: xvr 11.10.2010, 17:09
Цитата(Bartman2D @  11.10.2010,  15:28 Найти цитируемый пост)
Все сделал, сдал. Тема закрыта, код вот:
Да уж. То, что сдал, несмотря на одну грубую ошибку и еще одну тонко спрятанную, наводит на отдельные мысли о качестве обучения  smile 


Автор: toxx 11.10.2010, 17:12
xvr
Код

while (str = NULL)


эта? или где? =)
п.с. чисто для себя искал 

Автор: bsa 11.10.2010, 17:16
Удивительно, что компилятор предупреждение не кинул... Цикл же никогда даже один раз не выполнится!!!
Я уж не говорю про последовательное использование strtok... Такое ощущение, что при проверке даже не запускали...

Автор: toxx 11.10.2010, 17:24
мде, вот и написал...сдал и забыл образование на высоте =)

Автор: xvr 11.10.2010, 19:56
Цитата(toxx @ 11.10.2010,  17:12)
xvr
Код

while (str = NULL)


эта? или где? =)
п.с. чисто для себя искал

Пардон, 3 ошибки  smile 
Эта, плюс лишний strtok в строке 25, плюс поиск по strstr - он не различает границы слов. Т.е. слово abr будет найдено в строке abrakadabra, а не должно  smile

Добавлено через 1 минуту и 30 секунд
Да, и еще ошибка в while (даже если заменить = на ==). Там должно быть !=

Так что 4 ошибки

Автор: ncr 11.10.2010, 21:34
В копилку: если пользователь введёт больше ста символов - будет "ой".

Ну и использование SetConsoleCP / SetConsoleOutputCP для вывода русского текста - моветон, равно как и "магическое число" 1251 в качестве аргумента.

Автор: xvr 11.10.2010, 21:41
Можно организовывать конкурс - кто найдет больше ошибок  smile 

Автор: Bartman2D 1.11.2010, 18:14
Да, начал перебирать заново прогу, передалал кучу всего. Хватит меня тут материть, я к тому времени Си изучал 2недели.
И "!" Случайно упущен, при сдаче он был, да и strstr я замеенил на strcmp, если возвращает 0 то вывести слово на экран.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)