Post

array

Источник https://proproprogs.ru/c_base/c_vvedenie-v-massivy

1
2
3
4
5
6
7
8
#include <stdio.h>
#define TOTAL_MARKS                13
 
int main(void)
{
         int marks[TOTAL_MARKS];
         return 0;
}

Обход массива с помощью цикла for

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
#define TOTAL_MARKS                13
 
int main(void)
{
         int marks[TOTAL_MARKS];
         marks[2] = 4;
         marks[0] = 2;
         marks[12] = 5;
//       marks[13] = 1;               // никогда так не делайте!!!
 
         for(int i = 0; i < TOTAL_MARKS; ++i)
                   printf("%d ", marks[i]);
 
         return 0;
}

Размер массива ( количество элементов и байт )

1
2
3
4
5
6
7
8
#include <stdio.h>

int main(void)
{
    printf( "%zu %zu\n", sizeof( marks ) / sizeof( *marks ), sizeof( marks ) );

    return 0;
}

Тип size_t. Подсчёт количества элементов

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main ( void ) {
	size_t bytes_marks = sizeof( marks );
	size_t len_marks = bytes_marks / sizeof( marks[ 0 ] );
	
	printf( "%zu zu", len_marks, bytes_marks );
	
	return 0;
}

Указатель ( pointer )

Предположим, что у нас существует некий массив с именем ar

Для получения значения первого элемента, с индексом 0, мы можем использовать звёздочку

*ar

Для того, чтобы пройти по всем элементам, можно использовать *(ar+i)

У первого элемента переменная i будет равна нулю

1
2
for( int i = 0; i < sizeof( ar ) / sizeof( *ar ); ++i )
  printf( "%d ", *( ar + i ) );

copy

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
#include <stdio.h>

// Функция для копирования массива source в массив destination
// sizeSource - размер исходного массива, sizeDestination - размер целевого массива
void copyArray(int source[], int destination[], int sizeSource, int sizeDestination) {
    // Определяем минимальный размер для копирования
    int minSize = (sizeSource < sizeDestination) ? sizeSource : sizeDestination;
    
    for (int i = 0; i < minSize; i++) {
        destination[i] = source[i];
    }
}

int main() {
    // Определим исходный массив
    int sourceArray[] = {1, 2, 3, 4, 5};
    // Определим массив, в который будем копировать
    int destinationArray[3]; // Пусть размер целевого массива будет меньше исходного

    // Вычисляем размеры массивов
    int sizeSource = sizeof(sourceArray) / sizeof(sourceArray[0]);
    int sizeDestination = sizeof(destinationArray) / sizeof(destinationArray[0]);

    // Копируем массив
    copyArray(sourceArray, destinationArray, sizeSource, sizeDestination);

    // Выводим исходный массив
    printf("Исходный массив: ");
    for (int i = 0; i < sizeSource; i++) {
        printf("%d ", sourceArray[i]);
    }

    // Выводим скопированный массив
    printf("\nСкопированный массив: ");
    for (int i = 0; i < sizeDestination; i++) {
        printf("%d ", destinationArray[i]);
    }

    return 0;
}

insert

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
43
44
45
46
47
48
#include <stdio.h>

#define TOTAL_MARKS 100

int main() {
int marks[TOTAL_MARKS];
int num_elements = 0; // текущее количество элементов в массиве
int value, position, i;

// Предположим, что массив уже содержит некоторые значения, и num_elements их количество
// Здесь должен быть код для инициализации массива marks и переменной num_elements

// Чтение значения и позиции для вставки
printf("Введите значение для вставки: ");
scanf("%d", &value);
printf("Введите позицию для вставки: ");
scanf("%d", &position);

// Проверка, достаточно ли места в массиве для вставки
if (num_elements >= TOTAL_MARKS) {
printf("В массиве нет места для вставки нового элемента.\n");
return -1;
}

// Проверка корректности введенной позиции
if (position < 0 || position > num_elements) {
printf("Некорректная позиция для вставки.\n");
return -1;
}

// Сдвиг элементов для освобождения места для нового элемента
for (i = num_elements; i > position; i--) {
marks[i] = marks[i - 1];
}

// Вставка элемента
marks[position] = value;
num_elements++; // Увеличиваем количество элементов после вставки

// Вывод массива после вставки
printf("Массив после вставки:\n");
for (i = 0; i < num_elements; i++) {
printf("%d ", marks[i]);
}
printf("\n");

return 0;
}

sort

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>
 
int main(void) 
{
         char a[] = {-3, 5, 0, -8, 1, 10};
         int size = sizeof(a) / sizeof(a[0]);
         int pos;
         for(int i = 0; i < size-1; ++i) {
                   pos = i;
                   for(int j = i+1; j < size; ++j) {
                            if(a[pos] > a[j])
                                      pos = j;
                   }
                   if(pos != i) {
                            int t = a[i];
                            a[i] = a[pos];
                            a[pos] = t;
                   }
         }
 
         for(int i = 0; i < size; ++i) 
                   printf("%d ", a[i]);
 
         return 0;
}

mamo

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
// автор - Мамонов Сергей

#include <stdio.h> 

#define TOTAL 10

int main ( void ) {
  int digs[ TOTAL ] = { 0 };
  size_t count = 0;
  size_t sz_ar = sizeof( digs ) / sizeof( *digs );

  while ( count < sz_ar && scanf( "%d", &digs[ count ] ) == 1 )
    count++;
      
  int num = -1;
  // int indx = -1; // попробую вот это убрать из кода ниже
  
  for ( int i = 0; i < count; ++i ) {
    if ( digs[ i ] == 5 ) {
	  count = count < TOTAL ? count + 1 : count;
	  for ( int j = count - 1; j > i; j-- )
	    digs[ j ] = digs[ j - 1 ];          // сдвигаем что можно - вправо
	  if ( i + 1 < TOTAL )  
	    digs[ i + 1 ] = num--;              // тут был возможен выход за пределы i + 1  
	}                                       // я добавил условие i + 1 < TOTAL
  }
  
  for ( int i = 0; i < count; i++ )
    printf( "%d ", digs[ i ] );
  
  return 0;
}

// автор - Сергей Мамонов

// https://stepik.org/lesson/1191295/step/6?discussion=9121391&thread=solutions&unit=1204283

copy 2

Источник https://proproprogs.ru/c_base/c_strokovye-funkcii-strlen-strcpy-strncpy-strcat-strncat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main(void) 
{
         char source[100] = "Source string";
         char destination[10];
 
         const char* src = source;
         char* dst = destination;
         int max_len_copy = sizeof(destination);
 
         while(*src != '\0' && max_len_copy-- > 1)
                   *dst++ = *src++;
         *dst = '\0';
 
         puts(destination);
         
         return 0;
}

strcat

Источник https://pubs.opengroup.org/onlinepubs/009695399/functions/strcat.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
 
int main(void) 
{
         char str_cat[100] = "Sergey";
         char str[15] = "Balalkirev";
 
         strcat(str_cat, str);
         printf("%s", str_cat);
 
         printf("\n");
 
         size_t max_add = sizeof(str) - strlen(str) - 1;
         strncat(str, str_cat, max_add);
         str[sizeof(str) - 1] = '\0';
         printf("%s", str);
 
         return 0;
}

strcmp

Источник https://proproprogs.ru/c_base/c_strokovye-funkcii-sravneniya-poiska-simvolov-i-fragmentov

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
int main(void) 
{
         char s1[12] = "Hello";
         char s2[10] = "Hello";
 
         int res = strcmp(s1, s2);
         if(res == 0)
                   puts("Strings are equal!");
         else
                   puts("Strings are not equal!");
 
         return 0;
}

strchr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
 
int main(void) 
{
         char str[] = "Abrakadabra";
         char *ptr = strchr(str, 'a');
         
         printf("str = %p\nptr = %p\n", str, ptr);
         if(ptr != NULL)
                   printf("*ptr = %c\n", *ptr);
 
         return 0;
}
This post is licensed under CC BY 4.0 by the author.