Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 30.10.2022
Сообщений: 1

После каждого 4 элемента в массиве вставить 4 нуля

30.10.2022, 23:02. Показов 2778. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание: после каждого 4 элемента в массиве вставить 5 нулей. Сижу уже 2 часа, и что то не понимаю как реализовать программу. Помогите пожалуйста. Написать надо на чистом языке Си.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int i = 0; i < N; i++)
    {
        if (i % 4 == 0 && i != 0) {
            for (int j = N-1+fl;j>=i;j--)
            {
                a[j + 4] = a[j];
            }
            a[i] = 0;
            a[i + 1] = 0;
            a[i + 2] = 0;
            a[i + 3] = 0;
            fl = fl + 4;    
        }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.10.2022, 23:02
Ответы с готовыми решениями:

В массиве целых чисел вставить после каждого четного элемента массива предшествующий ему нечетный элемент
Нужна помощь! В массиве целых чисел вставить после каждого четного элемента массива предшествующий ему нечетный элемент

В массиве после каждого элемента вставить такой же
дан массив. после каждого элемента вставте такой же.

В массиве после каждого отрицательного элемента вставить ноль
Решить В массиве X(n) после каждого отрицательного элемента вставить ноль. Определить, поменялось ли местоположение минимального...

42
 Аватар для AlexProgramm
227 / 98 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
01.11.2022, 04:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от bormant Посмотреть сообщение
AlexProgramm,
i%4 - остаток от деления i на 4
!(...) - логическое отрицание, 0 становится 1, не-0 - нулём
!(i%4) - 0 когда i не делится нацело на 4 и 1 когда делится
5*!(i%4) - 0 когда i не ..., 5 когда делится
1+5*!(i%4) - 1 когда i не ..., 6 когда делится
j+=... - j увеличить на ...
++i - увеличить i на 1
++i,j+=1*5*!(i%4) - увеличить i на 1, увеличить j на 1 или на 6 (когда надо пропустить ещё и 5 нулей).
Спасибо за разъяснения, все теперь понятно
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
01.11.2022, 17:12
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
# define zero 5 //Сколько нулей вставить
# define count 3 // Через сколько цифер
 
 
void n_Insert(int *sent, int &len){
    int end = sent[len - 1];
    int at = count-1;
    while (true){
        if (sent[len - 1] != end){ len -= zero; return; }
    sent = (int*)realloc(sent, (len + zero)*sizeof(int));
            int i = len - 1;
            for (; i > at; --i)sent[i + zero] = sent[i];
                        int forward = 0;
        while (++forward < zero+1)sent[i + forward] = 0;
        at += (count + zero);
                len += zero;
    }  }
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
     int ln = 16;
     int mass[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
    //----------------------------------------------------
     int *ms = (int*)realloc(NULL, (ln + 1)*sizeof(int));
    for (int i = 0; i < ln; ++i)ms[i] = mass[i];
n_Insert(ms, ln);
    for (int i = 0; i < ln; ++i)printf("%d , ", ms[i]);
        free(ms);
    getchar();
    return 0;
}
Добавлено через 3 часа 40 минут
Мораль - если ты на интах сделать не можешь, а лезешь во флоты,
то лучше брось, и не пиши ничего.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
01.11.2022, 17:27
Наталья8,
"дизайн" у n_Insert() так себе
Во-первых, в функцию приходит указатель на произвольные данные, дергать на нем realloc() идея не очень
Во-вторых, realloc() вернет указатель на новые данные и, строго говоря, не всегда равный исходному Неплохо правильный указатель вернуть вызвавшему.
1
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
01.11.2022, 17:30
Зачем нужен float?
Музыка хорошая. Динамический диапазон широкий.
Данные для пользователя, в которых всё равно ни чего не понятно.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
01.11.2022, 17:52
Критику изучу. спасибо.

Добавлено через 1 минуту
Ну да... Бросает массив с места на место...

Добавлено через 5 минут
C++
1
sent = (int*)realloc(sent, (len + zero)*sizeof(int));
Он указатель самому себе и присваивает... sent = sent;

Добавлено через 13 минут
На float, лет пять работает..
Каким образом, понять невозможно...
(Звук регулирует... на бильдере писал под виндою)
На винде звук float...

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
float backNoScal=1.0;  float currentVolume = 0;
                    short zTime =0;// <-- Задержка
            const short deley(90); // --- задержка константа
                 //-------------------------
 void TForm3::ZVolume(float xVol, float cutoff, bool cont_){// <-- Функция  регулируем громкость
      // Form1->Label1->Caption=String(cutoff);
      endpointVolume->GetMasterVolumeLevel(&currentVolume);//<---каждую итерацию
 if(cont_)Form1->Label2->Caption=String(cutoff);
 
         if (xVol < cutoff)
             { // < ========= Или поднимать движок (достиг порядка!)
        if(zTime < deley){zTime++; return;}// <-- Задержка поднятия движка (30 было)
         // <-- поднимаем движок
if(xVol > 0.1)endpointVolume->SetMasterVolumeLevel(currentVolume+= fabs(currentVolume-1)/500, NULL);
       // fabs(currentVolume-1)/1000 это с низу --- 0.049... с верху --- 0.001
                          return;
                          } else {//<-- если уровень больше заданного
                       //   xVol/= (6.0-fabs(currentVolume/10.0));// Хитрый делитель
if(cont_)Form1->Label1->Caption=String(xVol);
      xVol=xVol - cutoff; // <-- уровень превышения
                    xVol/=4.0;// <--- всё таки надо подбирать для реальной работы
      xVol=-xVol;// <--- изменить знак на минус
float Set_point = (currentVolume+ xVol >= -50.0) ? currentVolume+ xVol : -48.0;// <--- Ограничитель
              // извлекаем уровень звука и отнимаем от него поправку
   if(Set_point < currentVolume-10)Set_point= (currentVolume-10); 
   // хитрый ключ (Не опускать за раз ниже десяти от уроаня)
 
                //-----------------------
   if(Set_point < backNoScal-2){ // <= новая точка ниже старой  Уменьшить громк.
      zTime =(currentVolume < -30.0) ? deley : 0;
// <-- провал ниже -30 задержки нет(устранение провала... это реально тихо !)
         endpointVolume->SetMasterVolumeLevel(Set_point, NULL);// всё со знаком минус (Регулятор)
                            } }
   endpointVolume->GetMasterVolumeLevel(&backNoScal);// запоминаем старое значение
                                    }
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
01.11.2022, 18:21
Цитата Сообщение от Наталья8 Посмотреть сообщение
Он указатель самому себе и присваивает... sent = sent;
А толку? Он в функцию передан по значению, он из функции вернётся? Нет.
C
1
2
3
4
5
6
7
8
9
10
11
void test(int* p) {
  p=NULL;
}
void main() {
  int a, *p=&a;
  test(p);
  if (p==NULL)
    printf("p is NULL");
  else
    printf("p is unmodified!!!");  // this !
}
1
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
01.11.2022, 21:13
В функцию передаёться указатель на начало массива.
функция работает с массивом через этот указатель.
Не надо ни чего возвращать.

Добавлено через 1 минуту
Каким образом работает код?
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
01.11.2022, 21:31





Это надо возвращать?
Вы не смотрите, что у меня харя глупая.
Я много ffmpeg переворочал, а это си....
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
01.11.2022, 21:42
https://www.cyberforum.ru/atta... 1667328135
Вложения
Тип файла: mp4 final_file(2).mp4 (912.4 Кб, 0 просмотров)
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
01.11.2022, 21:46
Результат действа, не указатель, а изменённый массив.
0
 Аватар для analogov net
2532 / 1130 / 495
Регистрация: 17.11.2018
Сообщений: 2,840
01.11.2022, 21:47
Особо не тестил, пару раз запустил, вроде работает:
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define SHIFT 5
#define PART 4
 
int main()
{
    srand( ( unsigned )time( NULL ) );
    int* p, size;
 
    printf( "size  : " );
    scanf( "%d", &size );
 
    size += size / PART * SHIFT;
    p = calloc( size, sizeof( int ));
 
    printf( "source: " );
    for( int i = 0, k = PART; i < size; i += ( k ) ? 1 : SHIFT )
        if( k-- )   printf( "%d ", *( p + i ) = rand() % 50 + 1 );
        else        k = PART;
 
    printf( "\ntarget: " );
    for( int i = 0; i < size; i++ )
        printf( "%d ", *( p + i ) );
 
    free( p );
 
    printf( "\n\n" );
    return 0;
}
1
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
01.11.2022, 23:16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include < string.h >
#pragma warning(disable : 4996)
 
 
void shop(char* n){
    strcpy(n, "level2");
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{   char word[10] = {};
        shop(word);
    printf("%s", word);// Каким образом?
    getchar();
    return 0;
}
Добавлено через 1 час 5 минут
Догнал... Спасибо за науку.
Мастер волшебных циклов...

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
#define SHIFT 5// Нулей
#define PART 4
 
int main()
{
    srand((unsigned)time(NULL));
    int *p, size;
 
    printf("size  : ");
    scanf("%d", &size);
size += size / PART * SHIFT;
/*calloc() Тот же принцип, что и malloc(), но он используется для выделения памяти.
        Настоящая разница между ними заключается в том, что calloc()
        инициализирует все байты в блоке распределения нулями */
    p = (int*)calloc(size, sizeof(int));
//------------------------------------------
    printf("source: ");// когда (k) обнуляеться то скачёк на SHIFT
    for (int i = 0, k = PART; i < size; i += (k) ? 1 : SHIFT)
           if (k--) printf("%d ", *(p + i) = rand() % 50 + 1);// Вывод на экран подряд
    else        k = PART;
//------------------------------------------
    printf("\ntarget: ");
    for (int i = 0; i < size; i++)
        printf("%d ", *(p + i));
 
    free(p);
    getchar(); getchar();
    printf("\n\n");
    return 0;
}
Добавлено через 9 минут
Ну да...
Зачем расставлять нули, когда можно использовать обнулённый массив.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.11.2022, 14:57
Цитата Сообщение от Наталья8 Посмотреть сообщение
Результат действа, не указатель, а изменённый массив
А как вы его (массив) обратно получите?
Тривиальная модель для простоты понимания:
C
1
2
3
4
5
6
7
8
9
10
11
int a=0, b=0, *pa=&a, *pb=&b;
 
void test(int *p) {
  p=pb;  // realloc() выдал новый адрес
  *pb=5; // результат по новому адресу
}
 
void main() {
  test(pa);
  printf("%d\n",*pa);  // 0, новый адрес из функции не вернулся, результат потерялся
}
Ну теперь-то смог объяснить?
1
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
02.11.2022, 16:20
Ну да... В realloc() я не совсем вьезжаю.
Как то оно работает.
Я думал вы опошляете всю теорию
передачи в функцию указателя.

Добавлено через 2 минуты
Наверное надо было его возвращать через ссылку, на всякий случай.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
02.11.2022, 16:31
Я там поставил эту штуку - &. Результат правда не изменился.
Наверное надо с ней....

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void n_Insert(int *&sent, int &len){
    int end = sent[len - 1];
    int at = count - 1;
    while (true){
        if (sent[len - 1] != end){ len -= zero; return; }
        sent = (int*)realloc(sent, (len + zero)*sizeof(int));
        int i = len - 1;
        for (; i > at; --i)sent[i + zero] = sent[i];
        int forward = 0;
        while (++forward < zero + 1)sent[i + forward] = 0;
        at += (count + zero);
        len += zero;
    }
}
Наоборот не ставиться.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
02.11.2022, 16:34
Не пользовал я этими реалоками.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.11.2022, 17:32
Цитата Сообщение от Наталья8 Посмотреть сообщение
надо было его возвращать через ссылку
Если внутри дергать realloc(), то другого пути нет Тут к консенсусу пришли, уже хорошо.

Но лучше отделить мух от котлет, выделение памяти само по себе, вставка нулей -- сама по себе.
Как снаружи узнать, сколько нужно? Ровно так, как это обычно и делают, например:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void n_Insert(int *p, /*inout*/ int &n, int size) {
  if (!p) {
    n+=n/4*5; return;
  }
  // ...
}
 
int main() {
  int *a;
  // ...
  n_Insert(NULL,n,0);
  a=realloc(a,n*sizeof(*a));
  // ...
Добавлено через 8 минут
Цитата Сообщение от Наталья8 Посмотреть сообщение
C
1
void n_Insert(int *&sent, int &len){
это Сишный раздел, не плюсовый
C
1
void n_Insert(int **sent, int *len) {
Добавлено через 28 минут
Цитата Сообщение от Наталья8 Посмотреть сообщение
Не пользовал я этими реалоками.
Так а это тогда чьё?
https://www.cyberforum.ru/post16536796.html
1
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
02.11.2022, 21:08
Ждал ответа... Хорошо ли зто realloc.
И почему их не особо пользуют.
Вы ответили на все вопросы.

Добавлено через 12 минут
Цитата Сообщение от bormant Посмотреть сообщение
Но лучше отделить мух от котлет
Тогда это будет не мой код, а ваш. И реалок там не нужен.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.11.2022, 21:33
Цитата Сообщение от Наталья8 Посмотреть сообщение
ответили на все вопрос
Где?
Основные посылы были в том, что
- внутри функции не здорово дергать realloc(), гораздо безопаснее передавать в нее уже выделенную память, кроме того, если передадут массив на стеке или статический, то функция не выполнит основную свою задачу -- вставку нулей.
- если делать внутри realloc(), то нужно обязательно возвращать ее результат наверх, туда, где будет удаление. Иначе, если realloc() не сможет увеличить переданный блок и выделит новый, то адрес поменяется и а) free() попытается освободить уже освобожденный (в realloc()) блок, и б) новый блок, выделенный realloc() освобожден не будет -- утечка памяти.

При этом сам realloc() плох только если вызывается без особой на то нужды (равно как и malloc() с calloc() -- множество их вызовов ведет к необоснованной фрагментации кучи). Тем более, раз уж лучше делать как лучше, как хуже получится само, то лучше выделить сразу, сколько надо:
C
1
2
3
4
5
6
7
8
int n, m, *a;
printf("n: "); scanf(" %d",&n);  // получим количество чисел
m=n; n_Insert(NULL,&m,0);  //  посчитаем, сколько получится чисел
a=malloc(m*sizeof(*a));  // и выделим памяти, сразу сколько нужно под результат
for (int i=0; i<n; ++i) scanf(" %d",a+i);  // введем числа
printf("A =\n"); for (int i=0; i<n; ++i) printf(" %d",a[i]); printf("\n");
n_Insert(a,&n,m*sizeof(*a));  // положим результат в тот же массив
printf("A'=\n"); for (int i=0; i<n; ++i) printf(" %d",a[i]); printf("\n");
1
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,374
03.11.2022, 01:16
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{   
    const int count = 22,
        shift = 4,// Нули 
        sub = 4;
int source[count]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22};
int size = count;
size += size / sub*shift;// Размер нового массива
int *p = (int*)calloc(size, sizeof(int));
//-----------------
   int kf = sub - 1, *q = p, *ptr_sz = source;
while (ptr_sz != (source + count)){
    printf("%d ", *(q++) = *(ptr_sz++));
if (!kf--){ q += shift;// Перепрыгнуть
            kf = sub - 1;}
                  }
        printf("\n \n");
for (int i = 0; i < size; ++i)printf("%d ", p[i]);
free(p);
getchar();
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2022, 01:16

В двумерном массиве вставить после каждого 2 нечетного элемента 1
В двумерном-массиве вставить после каждого 2 нечетного элемента 1. реализация через массив, не через списки! Добавлено через 24 минуты...

В массиве X(n) после каждого отрицательного элемента вставить ноль
Пожалуйста, помогите! Сломала всю голову, никак не могу справиться с этой задачей((( Написала сие чудо, но программа работает...

В массиве X(n) после каждого отрицательного элемента вставить ноль
В массиве X(n) после каждого отрицательного элемента вставить ноль. Скиньте исходный код.

В массиве вставить после каждого второго элемента минимальное непростое число
Задан массив Y(k) целых чисел. Если он упорядочен, оставить его без изменения. Если массив не упорядоченный, то вставить после каждого ...

В массиве А после каждого отрицательного элемента вставить элемент с заданным значением
Задание: В массиве А после каждого отрицательного элемента вставить элемент с заданным значением вот что у меня есть помоги...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru