Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Одномерный массив!Помогите дописать код


Автор: aleksejj 9.6.2009, 22:26
Друзья,выручайте!Доделать код!
Код
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define max 100
void gen( int k, int h, int j, int x[max]);
void out (int k, int x[max]);
void BubbleSortInd (int k, int x[max]);
void BubbleSort (int k, int x[max]);
void main()
{
int t[max],n,a,b;
do
{
printf ("\nВведите кол-во элементов массива n (n<=50): ");
scanf ("%d",&n);
}
while (n>max);
printf ("Введите a и b: ");
scanf ("%d%d",&a,&b);
gen(n,a,b,t);
printf ("Сгенерированн массив: \n");
out(n,t);
printf("\nПолученный: \n");
BubbleSortInd(n,t);
out(n,t);
}

void gen( int k, int a, int b, int x[max])
{
int i;
srand (time(NULL)*1000);
for (i=0;i<k;i++)
{

x[i]=(rand()*1.0/(RAND_MAX)*(a-b)+b);

}
}

void out (int k, int x[max])
{
int i;
for (i=0;i<k;i++)
printf ("%d ",x[i]);

}

void BubbleSortInd (int k, int x[max])
{
int i,tek,mx,el;
el = 0;
tek=mx=1;
for(i=1; i<=k+1; i++)
if(i==k || x[i]!=x[i-1])
{
if(tek>mx) { mx = tek; el = i-1; }
tek = 1;
}
else tek++;
++k;
for(i=k+1; i>=el+1; i--)
x[i] = x[i-1];
x[el+1] = x[el];
}


Здесь нужно увеличить каждую максимальную серию на один элемент!
Например:
Был массив==>
x[0]=4
x[1]=1
x[2]=9
x[3]=9
x[4]=9
x[5]=6
x[6]=6
x[7]=9
x[8]=9
x[9]=9
А надо:
x[0]=4
x[1]=1
x[2]=9
x[3]=9
x[4]=9
x[5]=9
x[6]=6
x[7]=6
x[8]=9
x[9]=9
x[10]=9
x[11]=9

Добавлено @ 22:29
Помогите пожалуйста!У меня завтра зачёт по программированию,осталась последняя программма!



M
bsa
Пользуйся кнопкой код

Автор: andrew_121 9.6.2009, 22:39
Код отформатируй! Глаза жалко ломать!

Автор: aleksejj 9.6.2009, 22:44
void BubbleSortInd (int k, int x[max])
{
int i,tek,mx,el;
el = 0;
tek=mx=1;
for(i=1; i<=k+1; i++)
if(i==k || x[i]!=x[i-1])
{
if(tek>mx) { mx = tek; el = i-1; }
tek = 1;
}
else tek++;
++k;
for(i=k+1; i>=el+1; i--)
x[i] = x[i-1];
x[el+1] = x[el];
}
Эта функция отвечает за добавления элементов!Но я не могу сделать,чтобы увеличились все серии и массив увеличился на количество этих элементов

Добавлено через 1 минуту и 10 секунд
void BubbleSortInd (int k, int x[max])
{
int i,tek,mx,el;
el = 0;
tek=mx=1; // tek - длина текущей серии
// mx - максимальная длина
for(i=1; i<=k+1; i++)  // идем до конца массива
 if(i==k || x[i]!=x[i-1])  // если достигли конца массива или
 // текущий элемент не равен предыдущему
     {
 
  if(tek>mx) // если текущая серия длиннее максимальной,
       {
    mx = tek;  // запоминаем длину
    el = i-1;
      }       // и позицию последнего элемента в серии
   
 tek = 1;  // сбрасываем длину текущей серии (т.к. уже  перешли к другой)
  
     }
 else tek++;
 
++k; // увеличиваем размер массива, т.к. сейчас
 // добавим еще один элемент 
  
    for(i=k+1 ; i>=el+1; i--) // идем от конца к последнему элементу самой длинной серии
 x[i] = x[i-1]; // текущий элемент = предыдущему (сдвигаем часть массива вправо)
 x[el+1] = x[el];  // теперь добавляем еще один элемент     
               
   }

Автор: andrew_121 9.6.2009, 22:59
Сказал же - отформатируй код! А ты что сделал?!
Давай условие. С утра сделаю.
На С, или С++ ?

Автор: aleksejj 9.6.2009, 23:04
Дан одномерный целочисленный массив,заполненный случайными числами.Серией называется группа подряд идущих элемениов,а их длинной-количество этих элементов(длина может равняться 1 ).Изменить массив,увеличив все серии наибольшей длины на один элемент.

Добавлено через 51 секунду
НА СИ

Добавлено через 1 минуту и 36 секунд
А во сколько ты примерно сделаешь?Просто у меня зачёт в 10.25!Помоги

Автор: andrew_121 9.6.2009, 23:20
На будущее.
Вот что значит форматировать код.
user posted image

Автор: aleksejj 10.6.2009, 07:36
 smile 

Автор: zim22 10.6.2009, 09:40
andrew_121, вы уверены что в вашем коде будут бросаться только стандартные исключения?
я думаю более правильно добавить в конце ещё один catch(...)

Автор: azesmcar 10.6.2009, 09:45
Цитата(zim22 @  10.6.2009,  09:40 Найти цитируемый пост)
я думаю более правильно добавить в конце ещё один catch(...) 

зачем же catch(...) ?
catch(boost::exception&), а уж после этого можно
Код

catch(...)
{
   show_fatal_error_and_die("ух ты!");
}

Автор: andrew_121 10.6.2009, 10:00
zim22, 
azesmcar, Спасибо за замечания. Полностью согласен smile . Но это был пример форматирования кода smile 

Автор: azesmcar 10.6.2009, 10:04
Цитата(andrew_121 @  10.6.2009,  10:00 Найти цитируемый пост)
Но это был пример форматирования кода 

 smile 
 smile 
просто интересно, а что за #endif? В каком #ifdef е функция main?

Автор: andrew_121 10.6.2009, 10:29
azesmcar, Это файл реализации некого объекта. Выше есть строка
Код

#ifdef 1
...

Для отладки.

Автор: zim22 10.6.2009, 11:18
мне вот интересно, в случае использования function-try блока куда return вставлять?
в каждый catch?
Код

int main()
try
{
  // do smth
  return 0;
} catch(exception&) {
  return 0;
} catch(...) {
  return 0;
}


Автор: Soah 10.6.2009, 11:26
http://www.rsdn.ru/forum/cpp/552965.flat.aspx
http://rsdn.ru/article/cpp/try_finally.xml

Цитата(zim22 @  10.6.2009,  11:18 Найти цитируемый пост)
куда return вставлять?

Код

int main() {
    try {
        // do smth
    } catch(exception&) {
        // ...
    } catch(...) {
        // ...
    }

    return 0;
}

Автор: zim22 10.6.2009, 11:58
Soah, почитал. это всё не то.
Про методику RAII я знаю. Но здесь вопрос не в захвате/освобождении ресурса при выхоже из области видимости, а в том, что функция main должна возвращать статус завершения.
И если в моём блоке try исключения не будет - то последняя строчка (return 0) выполнится. Но если exception будет кинут, то до return 0 мы не дойдём, соответственно необходимо будет сделать return в одном из блоков catch. Вопрос был в том, что если блоков catch несколько - то 
Цитата(zim22 @  10.6.2009,  11:18 Найти цитируемый пост)
 куда return вставлять?в каждый catch?


приведённый в rsdn аналог finally не подходит
Код

#define finally(Saver) \
catch ( ... ) \
{ \
  Saver \
  throw; \
} \
Saver

т.к. он вставляет catch(...)
Но exception может быть перехвачен в блоке catch выше. например в этом случае:
Код

try {throw exception(); }
catch(exeption&){ return -1; }
catch(...){ return -1; }


Приведённый Вами код меня не устраивает. Это не function-try блок и с ним всё проще, return в конце всех catch'ей ставится.
Код

int main() {
    try {
        // do smth
    } catch(exception&) {
        // ...
    } catch(...) {
        // ...
    }

    return 0;
}

function-try блок - это слово try, которое ставится ДО блока кода(открывающейся фигурной скобки), а не внутри него.

он необходимо не так часто, но иногда полезен, например, чтобы перехватывать исключения в constructor initializer list
Standard 15.4
Код

int f( int );
class C {
  int i;
  double d;
public :
  C(int , double );
};
C::C( int ii , double id)
try
: i(f(ii )) , d(id)
{
  / / constructor function body
}
catch (...)
{
  / / handles exceptions thrown from the ctor-initializer
  / / and from the constructor function body
}

Автор: Soah 10.6.2009, 12:07
Цитата(zim22 @  10.6.2009,  11:58 Найти цитируемый пост)
Soah, почитал. это всё не то.

да я уже понял, опять решал другую задачу

Добавлено через 13 минут и 50 секунд
http://www.ddj.com/showArticle.jhtml?articleID=184401297&queryText=%B5m
Цитата

When should you use function try blocks? First, remember that you can't return a value inside a function-try-block handler. So it makes no sense to use a function try block for a non-void function.

Автор: aleksejj 10.6.2009, 16:32
 smile 

Автор: aleksejj 10.6.2009, 21:34
 smile  smile  smile 

Автор: andrew_121 10.6.2009, 21:56
aleksejj, Чего спамишь? Бан хочешь?

Автор: andrew_121 11.6.2009, 05:39
Код

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#define PRINT_SERIES(ser, cnt) { \
    series *p = NULL; \
    for ( p = ser; p != ser+cnt; p++ ) { \
        printf("SER: 0x%08X BEG: 0x%08X-%4d END: 0x%08X-%4d\n", p, p->beg, *p->beg, p->end, *p->end); \
    } \
} \

void ClearScreen() {
    COORD c = {0,0};
    DWORD whocares;
    FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE),' ',2000,c,&whocares);
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

/***************************************************************************/

typedef struct series {
    int *beg;
    int *end;
} series;

/***************************************************************************/

int count_series(int *beg, int *end) {
    int v = 0;
    int count = 0;
    while ( beg != end ) {
        v = *beg;
        while ( *beg == v && beg != end ) {
            beg++;
            v++;
        }
        count++;
    }
    return count;
}

/***************************************************************************/

void get_series(int *beg, int *end, series *sea) {
    int v = 0;
    int count = 0;
    while ( beg != end ) {
        sea->beg = beg;
        v = *beg;
        for ( ; *beg == v && beg != end; beg++ ) {
            v++;
        }
        sea->end = beg-1;
        count++;
        sea++;
    }
}

/***************************************************************************/

int get_max_series_length(series *beg, series *end) {
    int _max = 0;
    while ( beg != end ) {
        _max = max(beg->end - beg->beg, _max);
        beg++;
    }
    return _max;
}

/***************************************************************************/

int count_max_series(series *beg, series *end, int len) {
    int count = 0;
    while ( beg != end ) {
        if ( beg->end-beg->beg == len ) {
            count++;
        }
        beg++;
    }
    return count;
}

/***************************************************************************/

int main(int argc, char** argv) {

    const int sizeof_int = sizeof(int);
    int maxserlen = 0;
    int maxsercnt = 0;
    int idx = 0;
    int size = 10;
    int count = 0;
    int any_allocated_size = 0;
    int *array_beg = NULL;
    int *result_arr= NULL;
    int *result_arr_curp= NULL;
    int *array_end = NULL;
    series *series_arr = NULL;
    series *series_arr_curp= NULL;
    series *maxser_arr= NULL;

    ClearScreen();
    /* get array_beg size */
//    printf("Choose the size of array_beg: "); fscanf(stdin, "%d", &size);
    if ( size == 0 ) {
        printf("You enter the zero size. Exiting.\n");
        return 0;
    }
    /* allocating memory */
    array_beg = (int*)malloc(size*sizeof_int);
    array_end = array_beg + size;
    /* check if memory allocated */
    if ( array_beg == NULL ) {
        printf("Cannot allocate memory! Exiting.\n");
        return 1;
    }
    /* fill the array_beg */
/*    for ( ; idx < size; idx++ ) {
        array_beg[idx] = rand()%100;
        printf("%d\n", array_beg[idx]);
    }
    printf("\n");
*/
#if 1
    size = 10;
    array_beg[0] = 0;
    array_beg[1] = 1;
    array_beg[2] = 2;
    array_beg[3] = 3;
    array_beg[4] = 5;
    array_beg[5] = 6;
    array_beg[6] = 7;
    array_beg[7] = 8;
    array_beg[8] = 9;
    array_beg[9] = 11;
#endif
    for ( ; idx < size; idx++ ) {
        printf("%d\n", array_beg[idx]);
    }
    printf("\n");
    /* count the series */
    count = count_series(array_beg, array_beg+size);
    /* allocating memory */
    series_arr = (series*)malloc(sizeof(series)*count);
    /* check if memory allocated */
    if ( series_arr == NULL ) {
        printf("Cannot allocate memory! Exiting.\n");
        free(array_beg);
        return 1;
    }
    /* get pointers on a series */
    get_series(array_beg, array_beg+size, series_arr);
    
    PRINT_SERIES(series_arr, count);
    
    /* get the maximum length of series */
    maxserlen = get_max_series_length(series_arr, series_arr+count);
    /* count the maximum length series */
    maxsercnt = count_max_series(series_arr, series_arr+count, maxserlen);
    /* alloc the new array_beg */
    any_allocated_size = (size*sizeof_int)+(maxsercnt*sizeof_int);
    result_arr_curp=result_arr = (int*)malloc(any_allocated_size);
    /* check if memory allocated */
    if ( series_arr == NULL ) {
        printf("Cannot allocate memory! Exiting.\n");
        free(array_beg);
        free(series_arr);
        return 1;
    }
    series_arr_curp = series_arr;
    while ( series_arr_curp != series_arr+count ) {
        any_allocated_size = (series_arr_curp->end-series_arr_curp->beg+1)*sizeof_int;
        memcpy(result_arr_curp, series_arr_curp->beg, any_allocated_size);
        result_arr_curp += series_arr_curp->end-series_arr_curp->beg+1;
        if (series_arr_curp->end-series_arr_curp->beg+1 == maxserlen) {
            *result_arr_curp = *series_arr_curp->end+1;
            result_arr_curp++;
        }
        series_arr_curp++;
    }
    
    for ( idx = 0; idx < size+maxsercnt; idx++ ) {
        printf("%d\n", result_arr[idx]);
    }

    free(array_beg);
    free(series_arr);
    free(result_arr);
    
    return 0;
}

/***************************************************************************/


Автор: andrew_121 11.6.2009, 10:32
Гм...
Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)