Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Формирование строки по повторяемости слов [C++]

15K
19 сентября 2007 года
koven
9 / / 21.07.2006
Помогите с задачей по С++

Вводится строка слов, разделенных пробелами (возможны лишние пробелы в начале и в конце строки и между словами). Сформировать строку, в которой слова упорядочены по повторяемости. Дубликаты слов следует удалить. При одинаковой повторяемости первым должно следовать слово, первое вхождение которого встречается раньше в исходной строке.

При условии, что работа со строками реализуется через указатели.
Напр.: вместо p использовать конструкции *p++, *p--
489
26 сентября 2007 года
NeO_u
277 / / 11.10.2006
Вот решение: возможно эту задачу можно решить более оптимальным способом, но я ее писал в свободное от работы время и, следовательно, первое что приходило в голову:
*.cpp
Код:
#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;
}



*.h
 
Код:
#ifndef HEADER
#define HEADER
typedef struct _CPYSTR
{
    char *str;
    int count;
}CPYSTR;
#endif HEADER



ЗЫ: будут вопросы, пиши, хотя, помойму, здесь вопросов не должно быть, все очень просто и доступно.
15K
26 сентября 2007 года
koven
9 / / 21.07.2006
NeO_u
спасибо огромное!
интересное решение, по крайней мере, кое-что новое для себя открыл.
вот что написал ранее сам. может кому будет интересно)

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


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, " ");
        }
}


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*);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог