//#include "stdafx.h"
#include <stdlib.h>
// для функции exit()
#include <string.h>
#include <iostream.h>
#include <cstdio>
// для функций работы с файлами
void main(void) {
char
text[149], // загруженный из файла текст
*_word, // рабочая переменная для корректного
// разделения строки на слова
**words, // здесь будут храниться все слова из строки
fourSW[150], // в этом массиве будут храниться слова длиной в 4
// символа, содержащие буквы и цифры
**repeatWord;
// этот массив будет содержать повторяющиеся слова
words = new char*[150];
repeatWord = new char*[150];
int
i, //
j, // счётчики циклов
k, //
word=0, // количество слов в загруженной строке
lengths[150], // длины каждого слова
digitPos=0, // рабочая переменная, которая будет содержать
// информацию о словах содержащих цифры
repeat[150], // количество повторений для каждого слова
squares[150][3], // кубы цифровых слов
sq=0, // количество цифровых слов
repeats=0; // общее количество различных слов в тексте
FILE *fp; // указатель на дескриптор файла
/* Нижеследующие переменные созданы для показа умения работы со строковыми функциями */
char text1[9]="Proverka";
char text2[10]="Propil'on";
char *p;
if ((fp = fopen("data.txt", "r")) == NULL) goto fileNotExists;
// открываем файл, если не удаётся - уходим в ошибку
fread(&text, sizeof(char), 150, fp);
cout << "Loaded text: " << text << endl << endl;
fclose(fp);
// читаем из файла 150 символов, выводим текст, закрываем файл
/* следующий блок делит считанную строку на массив слов, с которым
гораздо удобнее работать */
do {
if (word==0) {
_word = strtok(text, ",");
} else {
_word = strtok(NULL, ",");
} // для определения каждого последующего слова используется
// функция strtok()
if (_word == NULL) break;
word++;
words[word] = new char[strlen(_word)];
words[word] = _word;
lengths[word] = strlen(_word);
// заносим слово в массив words[], а его длину - в lengths[]
} while (1);
cout << endl << "Words (length = 5) with digits and characters:" << endl;
strcpy(fourSW, "");
/* следующий блок кода найдёт все слова, содержащие и буквы и цифры,
и не имеющие при себе буквы s */
for (i=1; i<=word; i++) {
digitPos=strcspn(words, "s");
// ищем, на какой позиции встречается буква в слове
if (atoi(words)==0 && digitPos>0 && digitPos!=lengths && lengths==4) {
strcat(fourSW, words);
strcat(fourSW, ", ");
}
}
cout << fourSW << endl << endl;
// выводим найденное
/* следующие блок кода ищет все повторяющиеся слова в тексте */
for(i=1; i<=word; i++) {
for(j=i; j<=word; j++) {
if (words==words[j]) {
for(k=1; k<=repeats; k++) {
if (0==strcmp(words, repeatWord[k])) {
repeat[k]++;
goto n1;
}
}
repeats++;
repeatWord[repeats] = new char[lengths];
repeatWord[repeats]=strdup(words);
repeat[repeats]=1;
}
}
}
n1:
cout << "Repeat words: " << endl;
for (i=1; i<=repeats; i++)
if (repeat>1)
cout << repeatWord << " [" << repeat << "], ";
// выводим слова, у которых количество повторений больше единицы
/* следующий блок кода находит цифровые слова и выводит их кубы */
cout << endl << endl << "Numeric words, and its squares: " << endl;
for (i=1; i<=word; i++) {
for(int j=0; j<lengths; j++)
if (atoi(&words[j])==0 && words[j]!='0') goto n2;
sq++;
squares[sq][1]=atoi(words);
squares[sq][2]=(atoi(words)*atoi(words)*atoi(words));
n2:
cout << "";
}
for (i=1; i<=sq; i++)
cout << "Number: " << squares[1] << "; square: " << squares[2] << endl;
cout << endl << "------------------------------------------" << endl << endl;
// весь остальной код показывает умение работать со строковыми функциями
cout << "text1='" << text1 << "';" << endl;
cout << "text2='" << text2 << "';" << endl;
p=strstr(text1, "ov");
cout << "strcmp(text1, text2) = '" << strcmp(text1, text2) << "'" << endl;
cout << "strncmp(text1, text2, 3) = '" << strncmp(text1, text2, 3) << "'" << endl;
cout << "strlwr(text1) = '" << strlwr(text1) << "'" << endl;
cout << "strupr(text2) = '" << strupr(text2) << "'" << endl;
strrev(text1); // функция заменяет строку
cout << "strrev(text1) = '" << text1 << "'" << endl;
strrev(text1);// возвращаем строку после вывода в исходное состояние
cout << "strspn(text2, 'ORP') = '" << strspn(text2, "ORP") << "'" << endl;
cout << "strstr(text1, 'rk') = '" << p << "'" << endl;
cout << "strchr(text1, 'r') = '" << strchr(text1, 'r') << "'" << endl;
cout << "strrchr(text1, 'r') = '" << strrchr(text1, 'r') << "'" << endl;
fp=fopen("output.txt", "w");
for(i=1; i<word; i++) {
fwrite(words, sizeof(char), lengths, fp);
fputs(", ", fp);
}
fclose(fp);
// удаляем все переменные, что мы использовали в процессе
delete repeatWord, repeats, text1, text2, text, _word, fourSW, words, lengths, digitPos, squares, sq, repeat, fp;
exit(0);
fileNotExists:
cout << "File with input data not found" << endl;
}
Поиск в тексте символов (C++)
Длина текста не больше 150 символов, могут быть использованы любые символы. Словом
считается после-довательность символов, не содержащая пробел. Сформировать строку из
5-символьных слов, несо-держащих букву s. Получить массив кубов цифровых слов.
Вот код, который мне удалось реализовать:
Код:
Не получается найти слова, не содержащие "S". Подскажите пожалуйста, будьте любезы, как доделать код для нормальной реализации данной задачи.
Буду очень признателен.
Код:
/* следующий блок кода найдёт все слова, содержащие и буквы и цифры,
и не имеющие при себе буквы s */
for (i=1; i<=word; i++) {
digitPos=strcspn(words, "s");
// ищем, на какой позиции встречается буква в слове
if (atoi(words)==0 && digitPos>0 && digitPos!=lengths && lengths==4) {
strcat(fourSW, words);
strcat(fourSW, ", ");
}
}
и не имеющие при себе буквы s */
for (i=1; i<=word; i++) {
digitPos=strcspn(words, "s");
// ищем, на какой позиции встречается буква в слове
if (atoi(words)==0 && digitPos>0 && digitPos!=lengths && lengths==4) {
strcat(fourSW, words);
strcat(fourSW, ", ");
}
}
заменил на:
Код:
/* следующий блок кода найдёт все слова, содержащие и буквы и цифры,
и не имеющие при себе буквы s */
for (i=1; i<=word; i++) {
if(strstr(words, "s")==NULL)
{
cout<<word<<","
}
}
и не имеющие при себе буквы s */
for (i=1; i<=word; i++) {
if(strstr(words, "s")==NULL)
{
cout<<word<<","
}
}
в результате получил все слова без "s".
И еще: неужели тебе не говорили что в С++ не используются goto
По моему код
Код:
if ((fp = fopen("data.txt", "r")) == NULL) goto fileNotExists;
...
fileNotExists:
cout << "File with input data not found" << endl;
...
fileNotExists:
cout << "File with input data not found" << endl;
более понятен в таком виде (его и читать легче):
Код:
if ((fp = fopen("data.txt", "r")) == NULL)
{
cout << "File with input data not found" << endl;
getch();
exit(0);
}
{
cout << "File with input data not found" << endl;
getch();
exit(0);
}
Как можно данное условие реализовать, подскажите пожалуйста.
Код:
if ((fp = fopen("data.txt", "r")) == NULL)
{
cout << "File with input data not found" << endl;
getch();
exit(0);
}
{
cout << "File with input data not found" << endl;
getch();
exit(0);
}
на строке с "getch();" выдает ошибку error C2065: 'getch' : undeclared identifier. Попробовал описать, ничего не изменилось :(
по-моему ф-ция getch() прописано в header-файле conio (может конечно stdio, но по-моему все-таки conio). подключи его. ;)
Тоже нге вариант
Код:
if(strstr(words, "s")==NULL)
if(strstr(words, "s")==NULL && strlen(words, "s")==5)
if(strstr(words, "s")==NULL && strlen(words, "s")==5)
Код:
/* следующие блок кода ищет все повторяющиеся слова в тексте */
for(i=1; i<=word; i++) {
for(j=i; j<=word; j++) {
if (words==words[j]) {
for(k=1; k<=repeats; k++) {
if (0==strcmp(words, repeatWord[k])) {
repeat[k]++;
goto n1;
}
}
repeats++;
repeatWord[repeats] = new char[lengths];
repeatWord[repeats]=strdup(words);
repeat[repeats]=1;
}
}
}
n1:
cout << "Repeat words: " << endl;
for (i=1; i<=repeats; i++)
if (repeat>1)
cout << repeatWord << " [" << repeat << "], ";
// выводим слова, у которых количество повторений больше единицы
for(i=1; i<=word; i++) {
for(j=i; j<=word; j++) {
if (words==words[j]) {
for(k=1; k<=repeats; k++) {
if (0==strcmp(words, repeatWord[k])) {
repeat[k]++;
goto n1;
}
}
repeats++;
repeatWord[repeats] = new char[lengths];
repeatWord[repeats]=strdup(words);
repeat[repeats]=1;
}
}
}
n1:
cout << "Repeat words: " << endl;
for (i=1; i<=repeats; i++)
if (repeat>1)
cout << repeatWord << " [" << repeat << "], ";
// выводим слова, у которых количество повторений больше единицы
Цитата: mitrof4nov
Подскажите пожалуйста относительно нижеприведенного кода, как правильно исправить ошибку по подсчету повторяющихся слов в тексте. Буду очень признателен.
Код:
/* следующие блок кода ищет все повторяющиеся слова в тексте */
for(i=1; i<=word; i++) {
for(j=i; j<=word; j++) {
if (words==words[j]) {
for(k=1; k<=repeats; k++) {
if (0==strcmp(words, repeatWord[k])) {
repeat[k]++;
goto n1;
}
}
repeats++;
repeatWord[repeats] = new char[lengths];
repeatWord[repeats]=strdup(words);
repeat[repeats]=1;
}
}
}
n1:
cout << "Repeat words: " << endl;
for (i=1; i<=repeats; i++)
if (repeat>1)
cout << repeatWord << " [" << repeat << "], ";
// выводим слова, у которых количество повторений больше единицы
for(i=1; i<=word; i++) {
for(j=i; j<=word; j++) {
if (words==words[j]) {
for(k=1; k<=repeats; k++) {
if (0==strcmp(words, repeatWord[k])) {
repeat[k]++;
goto n1;
}
}
repeats++;
repeatWord[repeats] = new char[lengths];
repeatWord[repeats]=strdup(words);
repeat[repeats]=1;
}
}
}
n1:
cout << "Repeat words: " << endl;
for (i=1; i<=repeats; i++)
if (repeat>1)
cout << repeatWord << " [" << repeat << "], ";
// выводим слова, у которых количество повторений больше единицы
Вообще поиск рулит, http://forum.codenet.ru/showthread.php?t=41766, здесь похожая тема.
uses crt;
var TextIn,TextOut:text;
Count:word;
ch:char;
s:string;
SI:boolean;
begin;
Count:=0;
SI:=false;
assign(TextIn,'In.txt');
reset(TextIn);
assign(TextOut,'Out.txt');
rewrite(TextOut);
while (not eof(TextIn)) do
begin;
repeat
read(TextIn,ch);
s:=s+ch;
if ch<>'s' then SI:=true;
until ch in [' ',',','.'];
if SI then
begin
writeln(Count);
if count<5 then writeln(TextOut,S);
Count:=Count+1;
SI:=False;
end;
s:='';
end;
readkey;
close(TextIn);
close(TextOut);
end.
Если для кого-нибудь потребуется, вот исходник:
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector <string> vec_sort_str;
vector <string> vec_str;
string str;
ifstream inFile("text.txt");
if (inFile.fail())
{
cerr<<"Error!!! Don't read file!!!"<<endl;
exit(1);
}
while (inFile >> str)
{
vec_str.push_back(str);
}
inFile.close();
for (int i=0;i<vec_str.size();i++)
{
str = vec_str;
string::const_iterator iter = find(str.begin(),str.end(),'s');
if (iter == str.end())
vec_sort_str.push_back(str);
}
vec_str.erase(vec_str.begin(),vec_str.end());
for (int i=0;i<vec_sort_str.size();i++)
{
str = vec_sort_str;
for (int j=0;j<str.size();j++) { if (str==',') break;}
if (j == 5) vec_str.push_back(str);
}
for (int i=0;i<vec_str.size();i++)
cout<<vec_str<<endl; //в vec_str находятся все слова в которых не содержится
//символа 's' и которые содержат 5 символов.
return 0;
}
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector <string> vec_sort_str;
vector <string> vec_str;
string str;
ifstream inFile("text.txt");
if (inFile.fail())
{
cerr<<"Error!!! Don't read file!!!"<<endl;
exit(1);
}
while (inFile >> str)
{
vec_str.push_back(str);
}
inFile.close();
for (int i=0;i<vec_str.size();i++)
{
str = vec_str;
string::const_iterator iter = find(str.begin(),str.end(),'s');
if (iter == str.end())
vec_sort_str.push_back(str);
}
vec_str.erase(vec_str.begin(),vec_str.end());
for (int i=0;i<vec_sort_str.size();i++)
{
str = vec_sort_str;
for (int j=0;j<str.size();j++) { if (str==',') break;}
if (j == 5) vec_str.push_back(str);
}
for (int i=0;i<vec_str.size();i++)
cout<<vec_str<<endl; //в vec_str находятся все слова в которых не содержится
//символа 's' и которые содержат 5 символов.
return 0;
}