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

Редактировать программу - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
maxlennon
1 / 1 / 0
Регистрация: 21.12.2008
Сообщений: 8
21.12.2008, 00:14     Редактировать программу #1
Задача:
Составить функцию для подсчёта числа серий положительных, отрицательных чисел и нулей длиной не менее k в одномерном массиве целых чисел. Серией называется последовательность элементов массива , принадлежащих одному классу: int series (int n, int *k mas, int *k zero, int *k minus, int k и тд).

помогите с редактированием текста.
не особо правильно работает-а ошибки не вижу(((


текст
Код
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>



int series(int n, int *Kmas, int *Kplus, int *Kminus, int *Kzero, int k);

void main(void)
{
	clrscr();
	int x, n, *Kmas, i, k;
	int Kplus, Kminus, Kzero;

	printf("\n Enter the number of elements: ");
	scanf("%d", &n);

	for(i=0; i<n; i++)
	{
		printf("\n Enter %d Element: ", i+1);
		if ((Kmas = malloc(n*sizeof(int))) == NULL)
        return 1;
		scanf("%d", &Kmas[i] );
	}

	printf("\n Now enter k: ");
	scanf("%d", &k);
	if(k<=n){
	Kplus=Kminus=Kzero=0;

	x=series(n, Kmas, &Kplus, &Kminus, &Kzero, k);
	printf("\n\n Sum of + numbers: %d", Kplus);
	printf("\n Sum of - numbers: %d", Kminus);
	printf("\n Sum of 0 numbers: %d", Kzero);
		}
	 else
	 printf("\nk must be less tan n");
	getch();
}

int series(int n, int *Kmas, int *Kplus, int *Kminus, int *Kzero, int k)
{
	int i;
	
	for(i=0; i<k; i++)
	{
		if(Kmas[i]>0)
			*Kplus=*Kplus+1;
		if(Kmas[i]<0)
			*Kminus=*Kminus+1;
		if(Kmas[i]==0)
			*Kzero=*Kzero+1;
	}
	return 1;
	free(Kmas);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.12.2008, 07:10     Редактировать программу #2
у тебя функция не считает количество серий

1 2 3 -1 -1 -1
тут две серии: одна положительная и одна отрицательная

1 2 3 1 2 3 -1 -1 -1 1 2 3 -1 -1 -1
тут 4 серии: две положительных две отрицательных

вообще в проге объявляется указатель Kmas, но в него надо записать адрес блока памяти в которую будешь сохранять числа, иначе он никуда не указывает
типа
Код
    if ((Kmas = malloc(n*sizeof(int)) == NULL)
        return 1;
а в конце программы высвободить его через free(Kmas)
maxlennon
1 / 1 / 0
Регистрация: 21.12.2008
Сообщений: 8
21.12.2008, 20:09  [ТС]     Редактировать программу #3
вот отредактировал! а как прописать, чтобы всё таки серии считала??
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.12.2008, 23:21     Редактировать программу #4
надо до цикла память выделить, т.к. выделяется она один раз как и очищается потом, а у тебя получилось она n раз выделяется а очищается только один

как прописать, чтобы всё таки серии считала
при входе в серию один раз увеличивать её счётчик (флажок для каждой серии который может принимать два значения, внутри или снаружи, при входе флажок выставляется на "внутри" если флажок на "внутри" увеличить счётчик этой серии (чей флажок) и сразу флажок перевести на "снаружи")
для каждого числа (>0 <0 =0) свой флажок такого рода, таким образом счётчики будут срабатывать только на своих флажках и только когда они на "внутри"

тебе зачем n в функции ?
maxlennon
1 / 1 / 0
Регистрация: 21.12.2008
Сообщений: 8
22.12.2008, 01:24  [ТС]     Редактировать программу #5
помоги с самим текстом - очень прошу, не получается ни хрена!
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.12.2008, 08:36     Редактировать программу #6
Код
 
#include <stdio.h>

/* подсчитывает число серий <0 =0 >0 чисел в массиве */
main()
{
    int getser(int *, unsigned, int *, int *, int *);
    int nneg, nzer, npoz;
    int nums[] = { 1, 2, -1, -2, 3, 4, 5, 0, 1 };
    
    if (getser(nums, sizeof nums / sizeof nums[0], &nneg, &nzer, &npoz) > 0)
        return 1;
    printf("negative: %d\n", nneg);
    printf("zeroes: %d\n", nzer);
    printf("pozitive: %d\n", npoz);
    return 0;
}

#define IN   1   /* внутри серии  */
#define OUT  0   /* снаружи серии */

/* getser:  считает число серий <0 =0 >0 чисел */
int getser(int *nump, unsigned n, int *neg, int *zer, int *poz)
{
    int nstate, zstate, pstate;
    
    *neg = *zer = *poz = 0;
    for (nstate = zstate = pstate = OUT; n > 0; nump++, n--)
        if (*nump < 0) {
            zstate = pstate = OUT;
            if (nstate == OUT) {
                nstate = IN;
                (*neg)++;
            }
        } else if (*nump == 0) {
            nstate = pstate = OUT;
            if (zstate == OUT) {
                zstate = IN;
                (*zer)++;
            }
        } else {
            nstate = zstate = OUT;
            if (pstate == OUT) {
                pstate = IN;
                (*poz)++;
            }
        }
    return (*neg || *zer || *poz) ? 0 : 1;
}
считает просто количество серий
maxlennon
1 / 1 / 0
Регистрация: 21.12.2008
Сообщений: 8
22.12.2008, 14:16  [ТС]     Редактировать программу #7
2 вопроса:
1) неужели нельзя мой текст как то чуть чуть изменить???
2) accept - почему твоя программа не запускается ни в одном компилляторе?(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2008, 22:56     Редактировать программу
Еще ссылки по теме:

Файловые операции: генерировать файл, читать, редактировать, записывать C++
Двумерный массив нужно редактировать C++
C++ Как редактировать токены функции strtok?
Редактировать текст используя ms Word API с++ C++
C++ Редактировать рекурсивную функцию

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.12.2008, 22:56     Редактировать программу #8
сохрани файл с расширением .c
может быть int надо добавить перед main (это не обязательно для C)
а вообще в bc3.1 компилится с любым расширением и без int'а
минимальную длину серии функция не принимает, можно встроить чтобы она не считала серии короче чем k

Добавлено через 1 час 15 минут 31 секунду
Код
 
#include <stdio.h>

/* подсчитывает число серий <0 =0 >0 длиной не менее k чисел в массиве */
main()
{
    int getser(int *, unsigned, int *, int *, int *, unsigned);
    int nneg, nzer, npoz;
    int nums[] = { 1, 2, -1, -2, 3, 4, 5, 0, 1, -1 };
    
    if (getser(nums, sizeof nums / sizeof nums[0], &nneg, &nzer, &npoz, 3) > 0)
        return 1;
    printf("negative: %d\n", nneg);
    printf("zeroes: %d\n", nzer);
    printf("pozitive: %d\n", npoz);
    return 0;
}

#define IN   1   /* внутри серии  */
#define OUT  0   /* снаружи серии */

/* getser:  считает число серий <0 =0 >0 чисел */
int getser(int *nump, unsigned n, int *neg, int *zer, int *poz, unsigned k)
{
    int nstate, zstate, pstate, nceil, zceil, pceil;
        
    *neg = *zer = *poz = 0;
    nceil = zceil = pceil = k;    
    nstate = zstate = pstate = OUT;
    for ( ; n > 0; nump++, n--)
        if (*nump < 0) {
            zceil = pceil = k;
            if (nstate == OUT && --nceil > 0)
                continue;
            zstate = pstate = OUT;
            if (nstate == OUT) {
                nstate = IN;
                (*neg)++;
            }
        } else if (*nump == 0) {
            nceil = pceil = k;
            if (zstate == OUT && --zceil > 0)
                continue;
            nstate = pstate = OUT;
            if (zstate == OUT) {
                zstate = IN;
                (*zer)++;
            }
        } else {
            nceil = zceil = k;
            if (pstate == OUT && --pceil > 0)
                continue;
            nstate = zstate = OUT;
            if (pstate == OUT) {
                pstate = IN;
                (*poz)++;
            }
        }
    return (*neg || *zer || *poz) ? 0 : 1;
}
вывод

Код
[guest@localhost tmp]$ ./test
negative: 0
zeroes: 0
pozitive: 1
[guest@localhost tmp]$
терь с ограничителем
Yandex
Объявления
22.12.2008, 22:56     Редактировать программу
Ответ Создать тему
Опции темы

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