Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
reeleel
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 19
1

Программа для поиска серии не работает

15.11.2013, 04:48. Просмотров 517. Ответов 7
Метки нет (Все метки)

Есть код, частично написан мною, частично человек один помог.
Задача - найти самую короткую серию элементов, которые чередуются по знаку, и вывести индекс первого элемента серии.
Сам элемент вроде выводится, индекс вывести не получается.
И еще, мне не совсем понятна часть, где вычисляется j. Что это вообще такое? Счетчик серии? И почему именно j = i - min + 1? У автора спросить сейчас не могу. Заранее спасибо за помощь.

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
32
33
34
35
36
37
38
39
40
41
42
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
 
#define N 10
 
int main()
{
int x[N];
int i;
int k = 1;
int j = 0;
int min = 99;
int flag = 0;
 
for (i = 0; i < N; i++)
{
printf("x[%d]:", i);
scanf_s("%d", &x[i]);
}
 
for (i = 0; i < N; i++)
{
if ((x[i] >= 0 && x[i + 1] < 0) || (x[i] < 0 && x[i + 1] >= 0))
{
k++;
flag = 1;
}
else {
if (flag == 1 && k < min)
min = k;
j = i - min + 1;
k = 1;
}
}
for (int i = j; i < j + min; i++)
printf("%d", x[i]);
 
_getch();
return 0;
 
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2013, 04:48
Ответы с готовыми решениями:

Компилируется но не работает программа поиска площади треугольников
Помогите найти ошибки. #include &lt;stdio.h&gt; #include &lt;math.h&gt; PL(int, int, int); main() { ...

Регулярное выражение для поиска серии одинаковых букв
Прошу помочь с составлением регулярного выражения в текст при конвертации из одной кодировки в...

Не работает программа поиска различных цифр в числе
var g:boolean;n,i,x,k,j:integer; mas:array of integer; begin write('введите натуральное число...

Почему программа поиска простых чисел работает только до 61?
Добрый день, Помогите, пожалуйста, разобраться. Программа для поиска простых чисел. На экран...

Не работает программа поиска несовпадения скобок со стеком, где ошибка*?
Добрый день, задали задачу Есть строка символов, признаком конца, которой являет- ся ;. В строке...

7
ПерС
434 / 358 / 324
Регистрация: 05.11.2013
Сообщений: 1,020
Записей в блоге: 6
Завершенные тесты: 1
15.11.2013, 16:08 2
странная задача.. обычно ищут длинную цепочку, а не короткую...
стало интересно, потратил пяток минут на то, как я вижу такое
в твой код не вникал
вот что вышло
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
32
33
34
35
36
37
#define SIGN(a) ((a)<0?-1:((a)>0?1:0))
void min_alternating_series (int n, int *a, int &start, int &minlen) {
 int z=SIGN(a[0]),s=-1,len=0;
 start=-1; minlen=n;
 for (int i=1; i<n; i++) {
  if (SIGN(a[i])!=z) {
   if (!len) { s=i-1; len=2; }
   else len++;
  }
  else {
   if (len>0 && len<minlen) {
    minlen=len; len=0;
    start=s;
   }
  }
  z=SIGN(a[i]);
 }
 if (minlen==n) minlen=0;
 if (len>0) { minlen=len; start=s; }
}
 
#include <stdio.h>
 
int main () {
 const int n=8;
 int a[n]={1,2,3,4,5,6,7,-8};
 
 int start,len;
 min_alternating_series (n,a,start,len);
 
 printf ("\n");
 for (int i=0; i<n; i++) printf ("%d ",a[i]);
 printf ("\nStart=%d, Len=%d",start,len);
 
 getchar();
 return 0;
}
хм, ноль получается, кста, тоже считается чередованием знака - но это и не оговорено в условии

Добавлено через 5 часов 7 минут
не, на самом деле бредовый код
да и смысл мне неясен. вот массив
-1 2 -3 4
какая тут минимальная серия (-1 2) или весь массив (-1 2 -3 4)
0
reeleel
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 19
15.11.2013, 17:43  [ТС] 3
ПерС, минимальная серия - 4 элемента в вашем примере, мне кажется
0
Thinker
Эксперт С++
4243 / 2217 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.11.2013, 18:00 4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
 
int min_len(int *a, int n)
{
    int i = 1, min = n, len = 1;
    while(i < n)
    {
        for(len = 1; i < n && a[i-1] * a[i] < 0; i++, len++)
            ;
        if (len > 1 && len < min)
            min = len;
        for( ; i < n && a[i-1] * a[i] >= 0; i++)
            ;
    }
    return min;
}
 
int main()
{
    int a[7] = {1, -2, 3, -4, -5, 6, -7};
    printf("min = %d\n", min_len(a, 7));
    return 0;
}
0
15.11.2013, 18:00
ПерС
434 / 358 / 324
Регистрация: 05.11.2013
Сообщений: 1,020
Записей в блоге: 6
Завершенные тесты: 1
15.11.2013, 18:53 5
короче, вот должна быть хорошая функция

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void min_alternating_series (int n, int *a, int &start, int &minlen) {
 int z=SIGN(a[0]),i=1,len,s;
 start=-1;minlen=n+1;
 while (i<n) {
  while (SIGN(a[i])==z) {
   z=SIGN(a[i]); i++; if (i==n) return;
  }
  s=i-1; len=1;
  while (SIGN(a[i])!=z) {
   len++; z=SIGN(a[i]); i++; if (i==n) break;
  }
  if (len<minlen) { minlen=len; start=s; }
 }
}
Тесты:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1 -2 3 -4 5 -6 7 -8
MIN Start=0, Len=8
1 2 3 -4 5 -6 7 -8
MIN Start=2, Len=6
1 2 3 4 5 6 7 -8
MIN Start=6, Len=2
-1 2 3 4 5 6 7 8
MIN Start=0, Len=2
1 2 3 4 5 -6 7 -8
MIN Start=4, Len=4
-1 2 -3 4 5 6 7 8
MIN Start=0, Len=4
1 2 -3 4 0 6 7 8
MIN Start=1, Len=5
1 -2 3 4 -4 6 7 -8
MIN Start=6, Len=2
-1 2 3 -4 5 6 -7 8
MIN Start=0, Len=2
1 -2 3 -4 -5 6 0 -8
MIN Start=0, Len=4
0 1 0 1 1 1 0 1
MIN Start=5, Len=3
Если искомых цепочек несколько найдет первую
поменять знак if (len<=minlen) будет последняя
ноль тоже считает чередованием знака так как SIGN определено в виде
C++
1
#define SIGN(a) ((a)<0?-1:((a)>0?1:0))
если это не надо - можно поменять определение SIGN
0
Thinker
Эксперт С++
4243 / 2217 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.11.2013, 19:32 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
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
 
void Min_len(int *a, int n, int *beg, int *min)
{
    int i = 1, len;
    *min = n;
    *beg = 0;
    while(i < n)
    {
        for(len = 1; i < n && a[i-1] * a[i] < 0; i++, len++)
            ;
        if (len > 1 && len < *min)
        {
            *min = len;
            *beg = i - len;
        }
        for( ; i < n && a[i-1] * a[i] >= 0; i++)
            ;
    }
}
 
void Print(int *a, int n)
{
    int i;
    for(i = 0; i < n; i++)
        printf("%5d", a[i]);
    printf("\n");
}
 
int main()
{
    int a[7] = {1, -2, 3, -4, -5, 6, -7}, beg, min_len;
    Print(a, 7);
    Min_len(a, 7, &beg, &min_len);
    Print(a + beg, min_len);
    return 0;
}
0
ПерС
434 / 358 / 324
Регистрация: 05.11.2013
Сообщений: 1,020
Записей в блоге: 6
Завершенные тесты: 1
16.11.2013, 07:30 7
Цитата Сообщение от Thinker Посмотреть сообщение
Серию же надо было найти, а не просто длину.
функция находит start - номер элемента, с которого начинается серия, и minlen - длину, массив не меняет
не вижу проблем вывести
0
Thinker
Эксперт С++
4243 / 2217 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.11.2013, 09:31 8
Цитата Сообщение от ПерС Посмотреть сообщение
функция находит start - номер элемента, с которого начинается серия, и minlen - длину, массив не меняет
не вижу проблем вывести
я говорил про код из поста #4.
0
16.11.2013, 09:31
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2013, 09:31

Программа для поиска файлов
Ребят хочу вылезти из типичных примеров в книгах и написать прогу для поиска файлов хоть бы самую...

Программа для поиска файлов
нужна программа на c++ or php которая будет искать файл и загружать его на фтп, программа должна...

Программа для поиска по сайту
Здравствуйте, уважаемые форумчане. Объясню свою проблему. Есть один сайт-аукцион, где располагаются...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.