Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.02.2008, 20:49   #1
FreeJaile
 
Регистрация: 29.02.2008
Сообщений: 7
По умолчанию c\c++ массив слов

Здраствуйте. Мне нужно задать набор слов, построить любую цепочку из них так, чтобы последняя буква одного слова совпадала с первой буквой последующего(над заданием я ещё не работала, поэтому ф-ция 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;
		}
	}
}

Последний раз редактировалось merax; 05.03.2008 в 21:52.
FreeJaile вне форума Ответить с цитированием
Старый 29.02.2008, 23:02   #2
Kriziun
 
Регистрация: 28.02.2008
Сообщений: 8
По умолчанию

Зачем использовать strncmp? она сравнивает строки полностью и возвращает ответ о том, что строки одинаковы.

Вот пример как лучше сделать.
Код:
#include "stdafx.h"
#include "iostream"
#include "string.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{	
	const int q=3;
	int i,length,t=0;
	char * word[3]={"a1b","c12a","b123c"};
	cout<<word[0];
	for(i=0;i<q;i++)
	{
		length=strlen(word[t]);
		for(int j=0;j<q;j++)
			if(word[t][length-1]==word[j][0])
			{
				cout<<","<<word[j];
				t=j;
			}
	}
	return 0;
}
За тобой доработка на устранение повторов слов при переборе
Kriziun вне форума Ответить с цитированием
Старый 29.02.2008, 23:22   #3
FreeJaile
 
Регистрация: 29.02.2008
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Kriziun Посмотреть сообщение
Зачем использовать strncmp? она сравнивает строки полностью и возвращает ответ о том, что строки одинаковы.
проверяет n первых символов... (но конечно это очень нехороший вариант был)

Цитата:
Вот пример как лучше сделать.
За тобой доработка на устранение повторов слов при переборе
ок, спасибо =)

но как бы даже не в этом дело...мне не удается корректно передать массив в функцию (задание на рекурсию, поэтому без этого никак)
FreeJaile вне форума Ответить с цитированием
Старый 29.02.2008, 23:45   #4
Kriziun
 
Регистрация: 28.02.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от FreeJaile Посмотреть сообщение
но как бы даже не в этом дело...мне не удается корректно передать массив в функцию (задание на рекурсию, поэтому без этого никак)
Запросто, из того же примера

Код:
char * word[3]={"a1b","c12a","b123c"};
cheking(word);

/**/

void cheking(char **word);
{
cout<<word[0];
}

Последний раз редактировалось merax; 05.03.2008 в 21:52.
Kriziun вне форума Ответить с цитированием
Старый 29.02.2008, 23:55   #5
FreeJaile
 
Регистрация: 29.02.2008
Сообщений: 7
По умолчанию

ой..точно!)) спасибо ^^
FreeJaile вне форума Ответить с цитированием
Старый 04.03.2008, 23:51   #6
FreeJaile
 
Регистрация: 29.02.2008
Сообщений: 7
По умолчанию

Повторений больше нет...
Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int n = 3;
void checking (char **word);

void main(){
     

	char *word[] = {"three", "two", "one"};
	printf ("\n|----------------------------WORDS----------------------------------|\n");
	for (int i=0; i<n; i++) printf (" word [%d] = %s\n", i+1, word[i]);
	
	checking (word);
}

void checking (char **word){
	int lenth;
	bool ch = false;
	printf ("\n|-------------------------- RESULT ---------------------------------|\n");
	for (int i=0; i<n; i++) {
		lenth = 0;
		lenth = strlen (word [i]);
		if (word[i][lenth-1] == word[i+1][0]){
			if (ch == false){
				printf (" %s, %s", word[i], word[i+1]);
				ch = true;
			}
			else printf (", %s", word [i+1]);
		}
	}
	printf ("\n|-------------------------------------------------------------------|\n");
}
но я так поняла "любая цепочка слов" подразумевает, что цепочка должна быть составлена из любых слов, которые не обязательно следуют друг за другом... у меня есть кое-какие наработки, но очень и очень не стабильные... может, вообще списком легче и эффективней, чем массивом?
FreeJaile вне форума Ответить с цитированием
Старый 03.04.2008, 23:26   #7
FreeJaile
 
Регистрация: 29.02.2008
Сообщений: 7
По умолчанию

Код:
#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;
}
вот на этом месте вылетает на выполнении (т.е. не выводит массив)
Код:
  printf ("\nYou've entered the following array:\n");
    for (i = 0; i<n; i++) printf ("%s ", array[i]);
подскажите, плз, в чем ошибка...
FreeJaile вне форума Ответить с цитированием
Старый 04.04.2008, 00:39   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от FreeJaile Посмотреть сообщение
подскажите, плз, в чем ошибка...
Ошибок много...
1) Хотя это и не оказало влияния, всё-таки функция main определена наоборот: main(int, char**); или более привычно: main(int argc, char* argv[], char* envp[]);. Прототип для main не обязателен - сама себя она "видит", а её вызывать никто не будет.
2) в строке "array = new char *[n]; " выделяется память под массив указателей, но при этом память под сами строки не выделяется.
3) В строке "scanf (" %s", &array[i]); " нужно передавать не адрес элемента массива, а то, что в этом элементе должно находиться - адрес буфера для новой строки, который нужно было выделить ранее ( п.2) ).
4) Неясно, зачем определена глобальная "char **array;" и какая из них предполагалась для использования, в общем - путаница.
Ну и, само собой, память по п.2) нужно будет освободить, что делает функция chain() осталось неизвестным и кое-какие косметические вещи вроде лишних переводов строки. Т.е. примерно это можно написать так:

Код:
#include <stdio.h>
#include <string.h>

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

int main(int argc, char **argv){
	int n;
	char **array;
    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); 
		array[i] = new char[256];
        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);

	for (i = 0; i<n; i++) delete [] array[i];
    delete [] array;
    return 0;
}

Последний раз редактировалось B_N; 04.04.2008 в 00:50.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка, состоящая из нескольких слов. Найти количество слов, которые содержат хотя бы одну букву "А" Mashaa Помощь студентам 13 09.12.2009 13:28
Подсчет слов Stanislav Общие вопросы Delphi 11 28.08.2008 10:37
Вставка слов )Игнат( Общие вопросы Delphi 1 16.03.2008 21:58
Сортировка слов по алфавиту victorio Microsoft Office Word 7 15.12.2007 19:03