#include <stdafx.h>
#include <iostream>
#include <conio.h>
#include <ctype.h>
#include <windows.h>
#include "test.h"
using namespace std;
const int max = 256;
CPYSTR cpystr[max];
void sortstruct(const int size)
{
char *ctmp = new char[max];
int itmp;
for(int i=0; i<size; i++)
{
itmp = cpystr.count;
ctmp = cpystr.str;
for(int j=i; j<size; j++)
{
if(itmp < cpystr[j].count)
{
cpystr.str = cpystr[j].str;
cpystr.count = cpystr[j].count;
cpystr[j].count = itmp;
cpystr[j].str = ctmp;
itmp = cpystr.count;
ctmp = cpystr.str;
}
}
}
}
char *append_char ( const char *s, const char c )
{
size_t len = strlen ( s );
char *ret = new char[len + 2];
strcpy ( ret, s );
ret[len] = c;
ret[len + 1] = '\0';
return ret;
}
int main(int argc, char* argv[])
{
char *str = new char[max];
char *cmp1 = new char[max];
bool found;
int i=0;
int copyfound=0;
ZeroMemory(str,max);
ZeroMemory(cmp1,max);
cin.getline(str,max,'\n');
do
{
found = false;
if(*str != ' ' )
cmp1 = append_char(cmp1,*str);
*str++;
if((*str == ' ' && i != 0) || *str == '\0')
{
for(int j=0; j<copyfound; j++)
{
if(strcmp(cpystr[j].str,cmp1) == 0)
{
cpystr[j].count++;
found=true;
}
}
if(!found)
{
cpystr[copyfound].str = new char[max];
strcpy(cpystr[copyfound].str,cmp1);
cpystr[copyfound++].count=1;
}
cmp1 = "";
}
i++;
}while(*str != '\0');
sortstruct(copyfound);
for(int j=0; j<copyfound; j++)
{
printf("String: %s\t",cpystr[j].str);
}
getch();
return 0;
}
Формирование строки по повторяемости слов [C++]
Вводится строка слов, разделенных пробелами (возможны лишние пробелы в начале и в конце строки и между словами). Сформировать строку, в которой слова упорядочены по повторяемости. Дубликаты слов следует удалить. При одинаковой повторяемости первым должно следовать слово, первое вхождение которого встречается раньше в исходной строке.
При условии, что работа со строками реализуется через указатели.
Напр.: вместо p использовать конструкции *p++, *p--
*.cpp
Код:
*.h
Код:
#ifndef HEADER
#define HEADER
typedef struct _CPYSTR
{
char *str;
int count;
}CPYSTR;
#endif HEADER
#define HEADER
typedef struct _CPYSTR
{
char *str;
int count;
}CPYSTR;
#endif HEADER
ЗЫ: будут вопросы, пиши, хотя, помойму, здесь вопросов не должно быть, все очень просто и доступно.
спасибо огромное!
интересное решение, по крайней мере, кое-что новое для себя открыл.
вот что написал ранее сам. может кому будет интересно)
main.cpp
Код:
#include "string_op.h"
using namespace std;
int main()
{
char str_in[MAXSTRLN], str_out[MAXSTRLN];
cout << "Enter str -> " ;
cin.getline(str_in, MAXSTRLN);
crt_str_by_freq(str_in, str_out);
cout << "\nResult str: " << str_out << endl;
cin.get();
return 0;
}
using namespace std;
int main()
{
char str_in[MAXSTRLN], str_out[MAXSTRLN];
cout << "Enter str -> " ;
cin.getline(str_in, MAXSTRLN);
crt_str_by_freq(str_in, str_out);
cout << "\nResult str: " << str_out << endl;
cin.get();
return 0;
}
string_op.cpp
Код:
#include "string_op.h"
using namespace std;
void scpy(char* dest, char* str)
{
while(*dest++ = *str++);
}
void scat(char* dest, char* str)
{
while(*dest) dest++;
while(*dest++ = *str++);
}
int scmp(char* p, char* q)
{
while(*p==*q && *p) {
p++;
q++;
}
return *p-*q;
}
void ins_sort(FW* item, int count)
{
int a, b;
FW t;
for(a=1; a<count; ++a) {
t = item[a];
for(b = a-1; b>=0 && t.freq<item.freq; b--)
item[b+1] = item;
item[b+1] = t;
}
}
void crt_str_by_freq(const char* pstr, char* res)
{
FW fw[WRDCOUNT];
FW *pfw_curr = fw;
for(FW *pfw=fw; pfw < fw + WRDCOUNT; pfw->freq=0, *(pfw++)->wrd=0);
while(*pstr==' ') pstr++;
do {
char tmp[MAXWRDLN];
int k = 0;
while (*pstr!=' ' && *pstr && k<MAXWRDLN) {
tmp[k] = *pstr++;
k++;
}
tmp[k] = 0;
FW *p = fw;
while(p<fw+WRDCOUNT && scmp(p->wrd, tmp)!=0) *p++;
if(scmp(p->wrd, tmp) != 0) {
scpy(pfw_curr->wrd, tmp);
pfw_curr->freq++;
pfw_curr++;
}
else
p->freq++;
while(*pstr==' ') pstr++;
} while(*pstr);
ins_sort(fw, WRDCOUNT);
res[0] = 0;
for(FW *pfw=fw; pfw<fw+WRDCOUNT; pfw++)
if(pfw->freq) {
scat(res, pfw->wrd);
scat(res, " ");
}
}
using namespace std;
void scpy(char* dest, char* str)
{
while(*dest++ = *str++);
}
void scat(char* dest, char* str)
{
while(*dest) dest++;
while(*dest++ = *str++);
}
int scmp(char* p, char* q)
{
while(*p==*q && *p) {
p++;
q++;
}
return *p-*q;
}
void ins_sort(FW* item, int count)
{
int a, b;
FW t;
for(a=1; a<count; ++a) {
t = item[a];
for(b = a-1; b>=0 && t.freq<item.freq; b--)
item[b+1] = item;
item[b+1] = t;
}
}
void crt_str_by_freq(const char* pstr, char* res)
{
FW fw[WRDCOUNT];
FW *pfw_curr = fw;
for(FW *pfw=fw; pfw < fw + WRDCOUNT; pfw->freq=0, *(pfw++)->wrd=0);
while(*pstr==' ') pstr++;
do {
char tmp[MAXWRDLN];
int k = 0;
while (*pstr!=' ' && *pstr && k<MAXWRDLN) {
tmp[k] = *pstr++;
k++;
}
tmp[k] = 0;
FW *p = fw;
while(p<fw+WRDCOUNT && scmp(p->wrd, tmp)!=0) *p++;
if(scmp(p->wrd, tmp) != 0) {
scpy(pfw_curr->wrd, tmp);
pfw_curr->freq++;
pfw_curr++;
}
else
p->freq++;
while(*pstr==' ') pstr++;
} while(*pstr);
ins_sort(fw, WRDCOUNT);
res[0] = 0;
for(FW *pfw=fw; pfw<fw+WRDCOUNT; pfw++)
if(pfw->freq) {
scat(res, pfw->wrd);
scat(res, " ");
}
}
string_op.h
Код:
#pragma once
#include <iostream>
const int MAXSTRLN = 256;
const int MAXWRDLN = 16;
const int WRDCOUNT = 15;
struct FW{
int freq;
char wrd[MAXWRDLN];
};
void scpy(char*, char*);
void scat(char*, char*);
int scmp(char*, char*);
void ins_sort(FW*, int);
void crt_str_by_freq(const char*, char*);
#include <iostream>
const int MAXSTRLN = 256;
const int MAXWRDLN = 16;
const int WRDCOUNT = 15;
struct FW{
int freq;
char wrd[MAXWRDLN];
};
void scpy(char*, char*);
void scat(char*, char*);
int scmp(char*, char*);
void ins_sort(FW*, int);
void crt_str_by_freq(const char*, char*);