Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
terminator_nemo
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 9
#1

Выделить в массиве последовательность чисел и сравнить выделенное с константами - C++

03.09.2009, 05:57. Просмотров 594. Ответов 8
Метки нет (Все метки)

Привет всем! Прошу помощи! Существует некий массив (его содержимое динамически меняется),например:

C++
1
unsigned char Name1 [200];
и константы:
C++
1
unsigned char Name2[]="abcde";
C++
1
unsigned char Name3[]="54321";
пускай в массив записалось следующее:

1234567890abcde0987654321

Необходимо: Выделить в массиве последовательность чисел(подсвечено красным) и сравнить выделенное с константами Name2 и Name3 на правильность.Если все совпадает,то выполняется какое-то действие,если хоть один не совпадает - то ничего не делать. С уважением Ваш SDS.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2009, 05:57     Выделить в массиве последовательность чисел и сравнить выделенное с константами
Посмотрите здесь:

Заполнить файлы случайными данными, сравнить их, и вывести самую длинную совпадающую последовательность C++
C++ В массиве действительных чисел получить последовательность
C++ В массиве целых чисел найти максимально длинную возрастающую последовательность
C++ Массив: Выделить возрастающую под последовательность элементов наибольшей длины.
C++ В одномерном массиве найти наибольшую последовательность из отрицательных чисел и вывести ее
C++ Из множества целых чисел выделить множество чисел, на которые делится без остатка число 444
Из диапазона целых чисел выделить множество чисел, делящихся без остатка на заданное число. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.09.2009, 06:47     Выделить в массиве последовательность чисел и сравнить выделенное с константами #2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string.h>    
 
...
 
    char *pl, *pn;
 
    pl = (char *) Name1 + 10;
    pn = (char *) Name1 + 20;
 
    if (strncmp(pl, Name2, strlen(Name2))
     || strncmp(pn, Name3, strlen(Name3)))
        return 1;
 
    printf("ok\n");
terminator_nemo
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 9
03.09.2009, 09:01  [ТС]     Выделить в массиве последовательность чисел и сравнить выделенное с константами #3
Немного непонятно,что с чем сравнивается...Нужно ведь выделить только подсвеченную последовательность а здесь указатели только на начальные символы в последовательности.

Добавлено через 13 минут

А если Name1 не будет иметь символа окончания строки в конце,как тогда быть?
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2009, 10:29     Выделить в массиве последовательность чисел и сравнить выделенное с константами #4
Вот код (сразу оговариваюсь что писал в Visual Studio 6.0),
а то как не выложу код так сразу старый стиль заголовков и прочая дребедень
от админов в мой адрес сыпется(думаю что порой не суть важно какую студию юзаешь,
главное чтоб была помощь по проблемме)....

Работа програмки простая вводим строчечку из ЛЮБОГО числа символов,
а дальше получаем ответ есть или нет в ней подстроки Name2 и Name3
Чтобы ввести новую стоку Name1 необходимо ввести единичку...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <windows.h>
#include <stdio.h>
 
//Если уже речь о динамике идёт, то будем в программе 
//Name изменять realloc
char * Name1 = (char *)malloc(sizeof(char));
char Name2[] = "abcde"; 
char Name3[] = "54321"; 
 
void main()
{
    char ch;int sLen = 0;
    printf("Enter string\r\n");
    while((ch = getchar()) != '\n')
    {
        Name1[sLen] = ch;
        sLen++;
        Name1 = (char *)realloc(Name1,sizeof(char)*(sLen + 1));
    }
    if(strstr(Name1,Name2) && strstr(Name1,Name3))
        printf("Name1 is consist of strings Name2 and Name3\r\n");
    else
        printf("Name1 is'n consist of strings Name2 and Name3\r\n");
    Name1 = (char *)realloc(Name1,sizeof(char));
    printf("Enter NUM1 to enter new string Name1\r\n");
    if((ch = getchar()) == '1')
    {
        ch = getchar();
        main();
    }
}
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
03.09.2009, 12:11     Выделить в массиве последовательность чисел и сравнить выделенное с константами #5
Немного непонятно,что с чем сравнивается...Нужно ведь выделить только подсвеченную последовательность а здесь указатели только на начальные символы в последовательности.
Почитай как работает функция strncmp().
1) Добавить символ '\0' в конец и потом сравнить.
Или
2) Проверить длину *Name1 - что там вообще достаточной длины строка для сравнения.
Сам сравнение сделать с помощью memcmp().
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
03.09.2009, 12:12     Выделить в массиве последовательность чисел и сравнить выделенное с константами #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если шаблоны фиксированной длинны и в фиксированных местах, можно так как-то:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <string.h>
 
/* сравнение буфера с шаблонами 
для простоты смещение и длинна шаблонов заданы костантами */
 
#define TEMPLATE_LEN 5
#define TEMPLATE_OFFSET 10
 
/* 1 - если оба шаблона нашлись, 0 - если нет */
int testBuf(char *buf, char *t1, char *t2, int t_len, int t_offset){
    return ( !memcmp(buf + t_offset, t1, t_len) && !memcmp(buf + t_offset*2, t2, t_len) );
}
 
int main(){
    char *test[] = {"1234567890abcde0987654321", "1234567890bacde0987654321", "1234567890abcde0987654312"};
    char *template1 = "abcde";
    char *template2 = "54321";
    int i;
    
    for ( i = 0; i < 3; i++ )
        printf("BUF: %s IS %s\n", test[i], (testBuf(test[i], template1, template2, TEMPLATE_LEN, TEMPLATE_OFFSET)) ? "GOOD" : "BAD");
        
    return(0);
}
если нет - немного доработать...
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.09.2009, 03:51     Выделить в массиве последовательность чисел и сравнить выделенное с константами #7
Цитата Сообщение от terminator_nemo
А если Name1 не будет иметь символа окончания строки в конце,как тогда быть?
точно также

а memcmp может потребоваться когда посреди Name1 возник нуль-символ, а проверять дальше надо (strncpy остановится на нём)
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
04.09.2009, 09:09     Выделить в массиве последовательность чисел и сравнить выделенное с константами #8
Цитата Сообщение от accept Посмотреть сообщение
а memcmp может потребоваться когда посреди Name1 возник нуль-символ, а проверять дальше надо (strncpy остановится на нём)
Кстати да! При таком подходе и шаблоны должны быть в виде не символьных строк, а массивов значений типа char. С задачей бы определиться. Откуда данные берутся? (текстовый файл, бинарный файл, кнопочками вводятся, ещё как-нибудь...)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2009, 14:28     Выделить в массиве последовательность чисел и сравнить выделенное с константами
Еще ссылки по теме:

C++ Найти в массиве чисел последовательность, имеющую максимальную сумму
C++ При выводе на консоль выделить заданную последовательность чисел в матрице скобками
C++ В заданном массиве найти индексы элементов, формирующих монотонно неувеличивающуюся последовательность чисел -
C++ В заданном целочисленном массиве определить максимальную последовательность чётных чисел
В массиве найти произведение двух заданных последовательностей чисел; полученные произведения сравнить C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,341
04.09.2009, 14:28     Выделить в массиве последовательность чисел и сравнить выделенное с константами #9
Друзья! Ну, и ты, тоже, тс...

Посты не читал, ибо условие, знаете ли...
Всё ж-таки предлагаю его уточнить.
Значит, "выделяем" (красным цветом, что ли выделяем или что...) такие 2 последовательности символов
abcde
54321
А если их или какой-нибудь из них нет в массиве Name1 символов? Значит (тс, к тебе обращаюсь), нужно так переделать условие

Определить, есть ли в массиве символов Name1 [200] такие 2 последовательности символов
(в любом порядке и количестве)
abcde
54321
Если есть, выполняем некоторое действие, если хоть одна последовательность отсутствует, действие не выполняем.

Если так, то будем разговаривать.
Yandex
Объявления
04.09.2009, 14:28     Выделить в массиве последовательность чисел и сравнить выделенное с константами
Ответ Создать тему
Опции темы

Текущее время: 20:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru