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

  • Автор темы User24
  • Дата начала
U

User24

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

romanriddick

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

User24

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

romanriddick

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

User24

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

romanriddick

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

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

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

User24

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

romanriddick

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

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

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

User24

Гость
#9
#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;}
 
R

romanriddick

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


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

IrineK

Гость
#11
На входе: вводится с консоли предложение (набор слов, разделенных одним и только одним пробелом, заканчивающийся точкой).
В процессе выполнения на консоль выводится сформированный массив - отдельные слова. Идет запрос, какие из них убрать: если нечетные - жмем 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;
}
 
R

Rififi

Гость
#12
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
 
D

dreamer

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

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

IrineK

Гость
#14
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;
}
Преимущества С++ перед С налицо ;)