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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Си строки 
V
    Опции темы
Bartman2D
Дата 10.10.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста написать программу. Суть программы заключается в том, что: "Даны два предложения. Для каждого слова первого предложения определить, входит ли оно во второе предложение." Уже несколько дней делаю ничего не выходит.
Код
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");


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

Это сообщение отредактировал(а) Bartman2D - 10.10.2010, 14:16
PM MAIL   Вверх
Crafty
Дата 10.10.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#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 секунд
Спрашивайте если что-то непонятно.
PM MAIL   Вверх
Bartman2D
Дата 10.10.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Это сообщение отредактировал(а) Bartman2D - 10.10.2010, 15:28
PM MAIL   Вверх
vnf
Дата 10.10.2010, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Bartman2D,  ваш код написан на чистом С, код Crafty  - чистый С++ с STL. Вам как надо?
PM MAIL   Вверх
Bartman2D
Дата 10.10.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

PM MAIL   Вверх
Crafty
Дата 10.10.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот на С
Код

#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;
}


Это сообщение отредактировал(а) Crafty - 10.10.2010, 15:47
PM MAIL   Вверх
Bartman2D
Дата 10.10.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Это сообщение отредактировал(а) Bartman2D - 10.10.2010, 16:32
PM MAIL   Вверх
Crafty
Дата 10.10.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



strstr(const char * str1, const char * str2) - возвращает указатель на первое вхождение подстроки str2 в строке str1. Подробнее тут.
strtok - использую для разделения строки на отдельные слова. Подробнее тут.


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

А в чём проблема сделать ввод пользователем? 
PM MAIL   Вверх
Bartman2D
Дата 10.10.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Crafty @ 10.10.2010,  16:42)
strstr(const char * str1, const char * str2) - возвращает указатель на первое вхождение подстроки str2 в строке str1. Подробнее тут.
strtok - использую для разделения строки на отдельные слова. Подробнее тут.


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

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

спасибо, полезные функции. )
PM MAIL   Вверх
bsa
Дата 10.10.2010, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



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

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

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

PM   Вверх
fuckingniger
Дата 11.10.2010, 04:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



не думаю что им можно использовать готовые функции)

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

Добавлено через 7 минут и 53 секунды
если не додуматься самому то вводишь в гугле
алгоритм поиска слова в тексте 
PM MAIL   Вверх
Logree
Дата 11.10.2010, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
bsa
Дата 11.10.2010, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



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

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

Это сообщение отредактировал(а) bsa - 11.10.2010, 09:50
PM   Вверх
djamshud
Дата 11.10.2010, 10:46 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



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

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

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
bsa
Дата 11.10.2010, 12:35 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



djamshud, имхо, программировать нужно учиться на языке типа паскаля (или бейсика), чтобы ничего не отвлекало. Программу написать на С++ проще, чем на С. Но выучить второй проще. Зато С++ очень сложно учить после С, так как постоянно пытаешься использовать приемы из С, что сильно усложняет процесс обучения.
PM   Вверх
mes
Дата 11.10.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



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

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




--------------------
PM MAIL WWW   Вверх
djamshud
Дата 11.10.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



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

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

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

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

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

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

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 11.10.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



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

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


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

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


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 11.10.2010, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Bartman2D
Дата 11.10.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

#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;
}



Это сообщение отредактировал(а) Bartman2D - 11.10.2010, 15:39
PM MAIL   Вверх
xvr
Дата 11.10.2010, 17:09 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



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


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


Опытный
**


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

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



xvr
Код

while (str = NULL)


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

Это сообщение отредактировал(а) toxx - 11.10.2010, 17:12
PM MAIL   Вверх
bsa
Дата 11.10.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Удивительно, что компилятор предупреждение не кинул... Цикл же никогда даже один раз не выполнится!!!
Я уж не говорю про последовательное использование strtok... Такое ощущение, что при проверке даже не запускали...
PM   Вверх
toxx
Дата 11.10.2010, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мде, вот и написал...сдал и забыл образование на высоте =)
PM MAIL   Вверх
xvr
Дата 11.10.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(toxx @ 11.10.2010,  17:12)
xvr
Код

while (str = NULL)


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

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

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

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

PM MAIL   Вверх
ncr
Дата 11.10.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В копилку: если пользователь введёт больше ста символов - будет "ой".

Ну и использование SetConsoleCP / SetConsoleOutputCP для вывода русского текста - моветон, равно как и "магическое число" 1251 в качестве аргумента.
PM MAIL   Вверх
xvr
Дата 11.10.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Можно организовывать конкурс - кто найдет больше ошибок  smile 

PM MAIL   Вверх
Bartman2D
Дата 1.11.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Это сообщение отредактировал(а) Bartman2D - 1.11.2010, 18:22
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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