Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с набором слов 
:(
    Опции темы
FreeJaile
Дата 29.2.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Здраствуйте. Мне нужно задать набор слов, построить любую цепочку из них так, чтобы последняя буква одного слова совпадала с первой буквой последующего(этого ещё не делала, поэтому функцию cheking просто как пример работы с этим массивом поместила). Задаю массив. И как я поняла из всего прочитанного, работать с этим массивом я могу только через указатель... но что-то запуталась( 

вот в этой строчке :  "if (strncmp (p[i], p[i+1], 1) == 0)"  выдает ошибку 'strncmp' : cannot convert parameter 1 from 'char' to 'const char *'

Код

const int n = 3;
void cheking (char *p);

void main(){

    //----------------------------------------------------------массив
    char *word[] = {"one", "two", "three"};

    char* p = new char[15];
         for (int i=0; i<n; i++) strcpy(p, word[i]); 

    for (i=0; i<n; i++) printf (" word [%d] = %s\n", i+1, word[i]);

    cheking (p);
    //-----------------------------------------------------------------
}

void cheking (char *p){
    for (int i=0; i<n; i++) {
         if (strncmp (p[i], p[i+1], 1) == 0) {
            printf ("\np[i] = %s p[i+1] = %s\n", p[i], p[i+1]);
            break;
        }
    }
}


Это сообщение отредактировал(а) MAKCim - 1.3.2008, 10:06
PM MAIL   Вверх
Christoph
Дата 29.2.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: нет
Всего: 11



Ошибка пишет то что нельзя конвертировать параметры, мне кажется ты при описании функции указала char* p тоесть будет передавать не массив а одна строка!


--------------------
user posted image
PM MAIL ICQ   Вверх
FreeJaile
  Дата 29.2.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Цитата(Christoph @ 29.2.2008,  22:09)
Ошибка пишет то что нельзя конвертировать параметры, мне кажется ты при описании функции указала char* p тоесть будет передавать не массив а одна строка!

да..точно (я проверяла криво, в цикл вывод р записала)

но так и не поняла как передать массив в функцию =( подскажите, плз

Это сообщение отредактировал(а) FreeJaile - 29.2.2008, 23:08
PM MAIL   Вверх
prof_GCC
Дата 1.3.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.2.2008

Репутация: нет
Всего: нет



Цитата

да..точно (я проверяла криво, в цикл вывод р записала)

но так и не поняла как передать массив в функцию =( подскажите, плз

Все предельно просто, массивы в функции передаются через указатели, поэтому, если у тебя строка, то она указывает на массив символов, т.е. в функцию ты передаешь либо char**, поэтому в функцию сравнения можно смело передовать твою переменную word как только прототип функции станет checking(char**). Крогме того strncmp (p[i], p[i+1], 1) == 0 не соответствует тому, что тебе нужно, ты сравниваешь первые символы строки smile
PM MAIL   Вверх
MAKCim
Дата 1.3.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(prof_GCC @  1.3.2008,  09:31 Найти цитируемый пост)
Крогме того strncmp (p[i], p[i+1], 1) == 0 не соответствует тому, что тебе нужно, ты сравниваешь первые символы строки

вообще говоря, здесь должна быть ошибка Access Violation/Segmentation Fault
т. к char (1 байт) знаково преобразуется к указателю (4 байта или 8 байт)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
prof_GCC
Дата 1.3.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.2.2008

Репутация: нет
Всего: нет



Нет, я имел ввиду после изменения прототипа на checking(char**) и передачи в функцию переменной word
PM MAIL   Вверх
FreeJaile
Дата 19.3.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



мне нужно эту задачу оказывается списком делать((

как в списке сравнить последнюю букву рассматриваемого слова с первой буквой следующего?

использую структуру 

Код

struct words{
    char word[30];
    words* next;
};



подсчитываю длину слова так:


Код

void chain(words* beg){
    int lenth;
    words* curent_p = beg;
    while (curent_p){
        lenth = 0;
        lenth = strlen (curent_p -> word);
        //printf ("\n %d \n", lenth);
        curent_p = curent_p -> next;
    }
    
}


просьба модераторам переименовать тему в..например просто "набор слов" (ну или на усмотрение модератора соответственно)

Это сообщение отредактировал(а) FreeJaile - 19.3.2008, 17:47
PM MAIL   Вверх
klaq
Дата 28.3.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.3.2008

Репутация: нет
Всего: нет



Есть вопрос, коль уж тема по работе с набором слов.
Взаимодействие клиент-сервер по протоколу UDP, клиент посылает на сервер набор слов, тот возвращает количество одинаковых слов. С клиентами и серверами разобрался, а вот со словами похуже, вроде как понимаю, что надо было-бы строку расчленить на слова, их записать в массив и поискать, но вот с реализацией пока никак, подсобите, плиз!
PM MAIL   Вверх
Rififi
Дата 28.3.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



Цитата(klaq @  28.3.2008,  15:19 Найти цитируемый пост)
строку расчленить на слова,

в простейшем случае - функция из стандартной си-библиотеки strtok (есть свои особенности, например strtok не является потоко-безопасной)

или можно boost заюзать:

Код

#include <string>
#include <vector>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

    std::string s = "...";
    std::vector<std::string> res;

    boost::split(res, s, boost::is_any_of("список_разделитклей"));

PM MAIL   Вверх
klaq
Дата 29.3.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.3.2008

Репутация: нет
Всего: нет



Я сделал немного по-другому (входная строка - z) порезал ее на слова и забил их в массив:
Код

while((sscanf(z+=n," %s%n",y[i], &n))>0) i++;


В Си я пока зеленейший новичок, так VB малость, да 1С, так что строго не судите. Теперь вот вторая проблема, как забить в массиве сравнение.
Я пошел простейшим путем)):
Код

for (m=0;m<i;m++)
        for (p=1;p<i;p++)
            if ((y[p]==y[m])&&(p!=m)) 

Но почему-то сравнение y[p]==y[m] не работает. В чем тут может быть дело?
PM MAIL   Вверх
MAKCim
Дата 29.3.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



klaq
strcmp()/strncmp()


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
MAKCim
Дата 29.3.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(klaq @  28.3.2008,  15:19 Найти цитируемый пост)
что надо было-бы строку расчленить на слова, их записать в массив и поискать, но вот с реализацией пока никак, подсобите, плиз! 

я бы сделал так
Код

long offsets[MAX_STRINGS]; /* MAX_STRINGS - максимальное количество слов в строке */
...
/* str - входная строка */
char s, *ptr = str;
int flags = 0, index = 0, position, count;
for (; (s = *str++); ) {
    switch (s) {
        case '\n':
        case '\r':
        /* остальные разделители */
            *(str - 1) = '\0';
            flags = 1;
            break;
        default:
            if (!flags) continue;
            flags = 0;
            offsets[index++] = str - ptr - 1;
    }
}
while (--index >= 0) {
    if (offsets[index] == -1)
        continue;
    count = 1;
    for (position = index - 1; position >= 0; --position) {
        if (offsets[position] == -1)
            continue;
        if (!strcmp(ptr + offsets[position], ptr + offsets[index])) {
            offsets[position] = -1;
            ++count;
        }
    }
    /* count - содержит количество слов ptr + offsets[index] */
}


Это сообщение отредактировал(а) MAKCim - 29.3.2008, 13:07


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
klaq
Дата 29.3.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.3.2008

Репутация: нет
Всего: нет



MAKCim
Большое спасибо! 
Мой вопрос - это задание из обычной лабы по "Комп. сетям" и я без лишних мудрствований сделал через массив  и strcmp, жестко ограничив длину строки и размер массива. Для жизни, конечно, непригодно  smile , но для зачета сойдет.
PM MAIL   Вверх
FreeJaile
Дата 2.4.2008, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Код

#include <stdio.h>
#include <string.h>

int main(char **array, int n);
void chain(char **array, int n);
char **array;

int main(char **array, int n){
    printf ("\nHow many words you'll enter:\n");
    scanf ("%d", &n);
    if (n == 0) {
        printf ("\nError: wrong value\n");
        return 1; 
    }

    array = new char *[n];
    if (array == 0){
         printf ("\nError: array haven't been done\n");
         delete []array;
         return 1;
     }
 
    printf ("\nArray created succsesfully\nPlease, enter words:\n");

    printf ("\nPlease, enter %d words\n", n);
    for (int i = 0; i<n; i++){
        printf("\n%d: ", i+1); 
        scanf (" %s", &array[i]);
    }
    printf ("\nYou've entered the following array:\n");
    for (i = 0; i<n; i++) printf ("%s ", array[i]);

    chain (array, n);

    delete [] array;
    return 0;
}


void chain(char **array, int n){
    int k=0;
    for (int i=0; i<n; i++){
        if (k<n){
            if (array[k][strlen(array[k])-1] == array[i][0]){
                printf ("%s %s", array[k], array[i]);
                k=i;
                chain(array, n);
            }
        }
    }

    if (k==n){
        if (array[i][strlen(array[i])-1] == array[k][0]) printf (" %s %s",array[i], array[k]);
    }
}


вот на этом месте вылетает на выполнении (т.е. не выводит массив)
Код

    printf ("\nYou've entered the following array:\n");
    for (i = 0; i<n; i++) printf ("%s ", array[i]);


подскажите, плз, в чем ошибка...
PM MAIL   Вверх
Dmi3ev
Дата 2.4.2008, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



на первый взгляд
Код

printf ("\nYou've entered the following array:\n");
    for (int i = 0; i<n; i++) printf ("%s ", array[i]);




--------------------

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1178 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.