Строки C++ помогите написать программу

Тема в разделе "C/C++/C#", создана пользователем User24, 18 янв 2011.

  1. User24

    User24 Гость

    Помогите написать программу удаления четных\нечетных слов в предложении. Или подскажите алгоритм.
     
  2. romanriddick

    romanriddick Гость

    алгоритм очень прост , нужно записать в один масив места (координаты) пробелов, а в другой двумерный масив слова между пробелами ... потом на запрос "какие слова отобразить ???" вывести четные или нечетные слова...
     
  3. User24

    User24 Гость

    Спасибо, за что откликнулись. Вообще надо сделать для четных, но так, чтобы программист мог быстро исправить для нечетных.
     
  4. romanriddick

    romanriddick Гость

    так ето ведь не проблема ... если і - индекс , и і при деление на 2 дает остачу 0 , значит число четное !!!
    для нечетных наоборот
     
  5. User24

    User24 Гость

    ну так получается что и для нечетных не проблема, если остаток от деления =1, основная проблема в том что я нуб в программировании, и плохо представлюю себе структуру программы, не понимаю почему второй массив должен быть двухмерным...
     
  6. romanriddick

    romanriddick Гость

    a[1][1]="asdasd"
    a[1][2]="sdsd"
    .......
    a[j]="...."
    Где i - индекс речення ... j- индекс слова в реченни ...
    можна зделать и одномерным массивом ... но так нагляднее и роботы не так уж и много лишней...
    кроме того препода "сразите" такой задумкой...)))
    я всегда так делаю , хотя можно и один индекс использовать

    при использовании 2-х индексов у вас больше пространства для доделывания проги ... например удалить непарные слова с второго речення

    Добавлено: чуть не забыл .... очень важно!!!
    если в тексте будут "ентеры" то использование двумерного массива обезательное!!!
     
  7. User24

    User24 Гость

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

    romanriddick Гость

    начало проги
    открываем файл
    s-переменнай типу файла
    присваеваем массиву
    if (!eof(file)) && (s!="")
    a = s;
    I++;

    for (j=1;j<=i;j++){
    if(j%2==0)
    b[j]=a[j]
    }

    стереть файл , записать в файл новый масив b[j]
     
  9. User24

    User24 Гость

    #include<iostream>
    #include<string>
    using namespace std;
    int main(void)
    {char str[100] = "This s is a test.\n";
    char b[100];

    int i,k,n,j=0,s=1;
    n=strlen(str);
    for(i=0;i<n;i++)
    {if(str==' ') j++;}
    for (j=0;j<=i;j++){
    if(j%2==0)
    b[j]=str[j];}
    cout<<b<<endl;
    //что у меня всё равно чушь получилась, я тут наверное всю программу переврал
    return 0;}
     
  10. romanriddick

    romanriddick Гость

    я же не могу вместо вас прогу написать)))
    могу только подсказать что легче будет не с клавы а з файла данные ... дальше по алгоритму
    в етом цыкле
    for(i=0;i<n;i++)
    {if(str==' ')
    j++;}


    должен быть вот етот ряд
    if(j%2==0)
    b[j]=str[j];}
     
  11. IrineK

    IrineK Гость

    На входе: вводится с консоли предложение (набор слов, разделенных одним и только одним пробелом, заканчивающийся точкой).
    В процессе выполнения на консоль выводится сформированный массив - отдельные слова. Идет запрос, какие из них убрать: если нечетные - жмем 1, если четные - 2.
    На выходе: оставшиеся слова через пробел, в конце - точка.

    #include<iostream>
    #include <cstring>
    using namespace std;

    int main()
    {
    char str[80];
    char word[40][80];
    int space_pos[40];
    int i,j,k;

    cout<<"The sentence:\n";
    cin.getline(str,80);

    int n=0;
    while(str[n]!='.') n++;

    int m=0;
    for(i=0;i<n;i++)
    if(str==' ')
    {space_pos[m]=i;//позиция пробела
    m++;}
    space_pos[m]=n;//позиция точки
    m++;

    //----------формирование массива слов
    int begin=0;
    int end=space_pos[0];
    for(j=0;j<m;j++)
    {
    for(i=0,k=begin;k<end;k++,i++)
    word[j]=str[k];
    word[j]='\0';
    begin=end+1;
    end=space_pos[j+1];
    }

    for(j=0;j<m;j++)
    cout<<word[j]<<endl;

    //--------удаление слов по запросу (чет/нечет)
    int not_wanted; // 2- для удаления четных слов, 1 - нечетных
    char res[80]; //получившееся предложение
    char rw[20][80]; //оставшиеся слова

    cout<<"\nDelete odd (input 1) or even (input 2) words? ";
    cin>>not_wanted;

    k=0;
    if(not_wanted==2) //оставляем нечетные
    {for(j=0;j<m;j++)
    if(j%2==0)
    {strcpy_s(rw[k],word[j]);
    k++;}
    }
    else if(not_wanted==1)
    {for(j=0;j<m;j++) //оставляем четные
    if(j%2)
    {strcpy_s(rw[k],word[j]);
    k++;}
    }

    strcpy_s(res,rw[0]);
    for(i=1;i<k;i++)
    {strcat_s(res," ");
    strcat_s(res,rw);
    }
    strcat_s(res,".");

    cout<<"\nThe result:\n"<<res<<endl;

    return 0;
    }
     
  12. Rififi

    Rififi Гость

    User24

    Препода я уже так сразил, что лучше сделать как-нибудь попроще

    если попроще, то используй Visual Studio 2010 - всё необходимое в уже комплекте.

    Код (C++):
    #include <locale>
    #include <regex>
    #include <iostream>

    int main()
    {
    setlocale(LC_ALL, "");

    const std::string text =
    "There were three men came out of the west, their fortunes for to try. "
    "And these three men made a solemn vow "
    "\"John Barleycorn must die\".";

    const std::regex rx("\\b\\w+\\b");
    const std::sregex_iterator end;

    std::cout << "Full text: " << text << std::endl;
    std::cout << "Odd words: ";

    size_t index = 0;
    for (std::sregex_iterator it(text.begin(), text.end(), rx); it != end; ++it, index++)
    if (!(index & 1))
    std::cout << it->str() << " ";

    std::cout << std::endl;

    return 0;
    }
    Вывод программы:
    Full text: There were three men came out of the west, their fortunes for to try. And these three men made a solemn vow "John Barleycorn must die".
    Even words: There three came of west fortunes to And three made solemn John must
     
  13. dreamer

    dreamer Гость

    IrineK
    Не нужно тут такий фортелей: можно просто сделать однопроходный алгоритм на основе конечного автомата с состояниями {слово|пробел} и {чётное|нечётное}.

    Rififi
    Если я правильно понимаю, человеку нужно всего лишь продемонстрировать... кхм... знание принципов работы со строками. И, кстати, в Вашем алгоритме индекс лишний: можно вместо него сделать булеву переменную.
     
  14. IrineK

    IrineK Гость

    Код (C++):
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    using namespace std;


    int _tmain(int argc, _TCHAR* argv[])
    {    setlocale(LC_ALL,"");
    string str;
    string arStr[10];
    int N=0,choice;

    cout<<"Введите строку. После ввода нажмите Enter, затем - комбинацию Ctrl+Z+Enter"<<endl;
    while(cin>>str)
    {
    arStr[N]=str;
    N++;
    }
    cin.clear();

    cout<<"Оставить четные слова - введите ноль. Оставить нечетные - введите единицу"<<endl;
    cin>>choice;

    str="";
    if(choice)
    for(int i=0;i<N;i+=2)str+=arStr[i]+" ";
    else
    for(int i=1;i<N;i+=2)str+=arStr[i]+" ";

    cout<<str<<endl;
    return 0;
    }
    Преимущества С++ перед С налицо ;)
     
Загрузка...

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