Введение в массивы и строки
Что такое массив
Массив — это набор переменных одного типа, хранящихся в памяти подряд. Как ящик с пронумерованными отделениями.
int numbers[5]; // Массив из 5 целых чисел
numbers[0] = 10; // Первый элемент (индекс 0)
numbers[1] = 20; // Второй элемент (индекс 1)
Объявление массивов
Основные способы
- Объявление размера
- Инициализация при объявлении
- Автоматический размер
#include <stdio.h>
int main() {
int scores[3]; // Массив из 3 элементов
// Присваиваем значения по отдельности
scores[0] = 85;
scores[1] = 92;
scores[2] = 78;
printf("Результаты тестов:\n");
printf("Тест 1: %d\n", scores[0]);
printf("Тест 2: %d\n", scores[1]);
printf("Тест 3: %d\n", scores[2]);
return 0;
}
#include <stdio.h>
int main() {
int ages[4] = {25, 30, 18, 45}; // Сразу с значениями
printf("Возрасты сотрудников:\n");
for (int i = 0; i < 4; i++) {
printf("Сотрудник %d: %d лет\n", i + 1, ages[i]);
}
return 0;
}
// Размер определяется автоматически по количеству элементов
int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
float prices[] = {19.99, 45.50, 12.75};
printf("Дней в январе: %d\n", days[0]); // 31
printf("Первая цена: %.2f\n", prices[0]); // 19.99
Работа с массивами
Заполнение и обход
#include <stdio.h>
int main() {
int numbers[5];
// Заполняем массив
printf("Заполняем массив:\n");
for (int i = 0; i < 5; i++) {
numbers[i] = (i + 1) * 10; // 10, 20, 30, 40, 50
printf("numbers[%d] = %d\n", i, numbers[i]);
}
// Вычисляем сумму
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += numbers[i];
}
printf("Сумма всех элементов: %d\n", sum); // 150
return 0;
}
Поиск в массиве
#include <stdio.h>
int main() {
int studentIds[] = {1001, 1005, 1012, 1008, 1003};
int size = 5;
int searchId = 1008;
int found = 0;
int position = -1;
printf("Поиск студента с ID: %d\n", searchId);
for (int i = 0; i < size; i++) {
printf("Проверяем позицию %d: ID = %d\n", i, studentIds[i]);
if (studentIds[i] == searchId) {
found = 1;
position = i;
break; // Нашли - выходим из цикла
}
}
if (found) {
printf("✅ Студент найден на позиции %d\n", position);
} else {
printf("❌ Студент не найден\n");
}
return 0;
}
Двумерные массивы
Массив массивов — таблица с строками и столбцами.
Объявление и инициализация
#include <stdio.h>
int main() {
// Таблица 3×4 (3 строки, 4 столбца)
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
printf("Матрица 3×4:\n");
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 4; col++) {
printf("%3d ", matrix[row][col]);
}
printf("\n");
}
return 0;
}
Введение в строки
Строка — это массив символов, заканчивающийся нулевым символом '\0'.
Объявление строк
- Массив символов
- Структура строки
#include <stdio.h>
int main() {
// Способ 1: массив символов
char name[6] = {'А', 'н', 'н', 'а', '\0'};
// Способ 2: строковый литерал
char city[10] = "Москва";
// Способ 3: автоматический размер
char country[] = "Россия";
printf("Имя: %s\n", name);
printf("Город: %s\n", city);
printf("Страна: %s\n", country);
return 0;
}
char word[] = "Привет";
// Как это хранится в памяти:
// [0]='П', [1]='р', [2]='и', [3]='в', [4]='е', [5]='т', [6]='\0'
printf("Символы строки:\n");
for (int i = 0; word[i] != '\0'; i++) {
printf("word[%d] = '%c'\n", i, word[i]);
}
Основные операции со строками
#include <stdio.h>
int main() {
char message[] = "Программирование";
int length = 0;
// Подсчет длины строки
while (message[length] != '\0') {
length++;
}
printf("Строка: %s\n", message);
printf("Длина: %d символов\n", length);
// Вывод символов по одному
printf("По символам: ");
for (int i = 0; i < length; i++) {
printf("'%c' ", message[i]);
}
printf("\n");
return 0;
}
Практические примеры
Анализ оценок класса
#include <stdio.h>
int main() {
int grades[10] = {85, 92, 78, 95, 88, 76, 94, 82, 90, 87};
int students = 10;
int sum = 0;
int excellent = 0; // Оценки >= 90
int good = 0; // Оценки 80-89
int satisfactory = 0; // Оценки 70-79
printf("Анализ успеваемости класса:\n");
for (int i = 0; i < students; i++) {
int grade = grades[i];
sum += grade;
printf("Студент %2d: %d баллов - ", i + 1, grade);
if (grade >= 90) {
printf("Отлично\n");
excellent++;
} else if (grade >= 80) {
printf("Хорошо\n");
good++;
} else if (grade >= 70) {
printf("Удовлетворительно\n");
satisfactory++;
} else {
printf("Неудовлетворительно\n");
}
}
float average = (float)sum / students;
printf("\n=== СТАТИСТИКА ===\n");
printf("Средний балл: %.1f\n", average);
printf("Отличников: %d\n", excellent);
printf("Хорошистов: %d\n", good);
printf("Троечников: %d\n", satisfactory);
return 0;
}
Работа с именами
#include <stdio.h>
int main() {
char names[3][20] = {
"Александр",
"Екатерина",
"Михаил"
};
int ages[3] = {25, 30, 28};
printf("=== СПИСОК СОТРУДНИКОВ ===\n");
for (int i = 0; i < 3; i++) {
printf("%d. %s - %d лет\n", i + 1, names[i], ages[i]);
}
// Поиск самого молодого
int youngestIndex = 0;
for (int i = 1; i < 3; i++) {
if (ages[i] < ages[youngestIndex]) {
youngestIndex = i;
}
}
printf("\nСамый молодой сотрудник: %s (%d лет)\n",
names[youngestIndex], ages[youngestIndex]);
return 0;
}
Простые алгоритмы
Сортировка пузырьком (упрощенно)
#include <stdio.h>
int main() {
int numbers[] = {64, 34, 25, 12, 22};
int size = 5;
printf("Исходный массив: ");
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
// Простая сортировка
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - 1 - i; j++) {
if (numbers[j] > numbers[j + 1]) {
// Меняем местами
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}
printf("Отсортированный: ");
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
Подсчет символов в строке
- Подсчет букв и цифр
- Подсчет гласных
#include <stdio.h>
int main() {
char text[] = "Hello World 2025!";
int letters = 0, digits = 0, spaces = 0, others = 0;
printf("Анализируем: \"%s\"\n", text);
for (int i = 0; text[i] != '\0'; i++) {
char ch = text[i];
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
letters++;
} else if (ch >= '0' && ch <= '9') {
digits++;
} else if (ch == ' ') {
spaces++;
} else {
others++;
}
}
printf("📊 Статистика:\n");
printf("Букв: %d\n", letters);
printf("Цифр: %d\n", digits);
printf("Пробелов: %d\n", spaces);
printf("Других символов: %d\n", others);
return 0;
}
char sentence[] = "Программирование на языке Си";
char vowels[] = "аеёиоуыэюяАЕЁИОУЫЭЮЯ";
int vowelCount = 0;
printf("Текст: %s\n", sentence);
for (int i = 0; sentence[i] != '\0'; i++) {
char currentChar = sentence[i];
// Проверяем, является ли символ гласным
for (int j = 0; vowels[j] != '\0'; j++) {
if (currentChar == vowels[j]) {
vowelCount++;
break;
}
}
}
printf("Количество гласных: %d\n", vowelCount);
Размер массива
Определение размера
#include <stdio.h>
int main() {
int temperatures[] = {18, 22, 25, 19, 16};
// Вычисляем размер массива
int size = sizeof(temperatures) / sizeof(temperatures[0]);
printf("Размер массива: %d элементов\n", size);
printf("Температуры:\n");
for (int i = 0; i < size; i++) {
printf("День %d: %d°C\n", i + 1, temperatures[i]);
}
return 0;
}
Практические задачи с массивами
Статистика продаж
#include <stdio.h>
int main() {
int sales[7] = {150, 200, 180, 220, 175, 300, 250}; // Продажи по дням
char days[][12] = {"Понедельник", "Вторник", "Среда", "Четверг",
"Пятница", "Суббота", "Воскресенье"};
int total = 0;
int maxSales = sales[0];
int maxDay = 0;
printf("=== ОТЧЕТ О ПРОДАЖАХ ===\n");
for (int i = 0; i < 7; i++) {
printf("%s: %d продаж\n", days[i], sales[i]);
total += sales[i];
if (sales[i] > maxSales) {
maxSales = sales[i];
maxDay = i;
}
}
float average = (float)total / 7;
printf("\n=== ИТОГИ ===\n");
printf("Общие продажи: %d\n", total);
printf("Среднее за день: %.1f\n", average);
printf("Лучший день: %s (%d продаж)\n", days[maxDay], maxSales);
return 0;
}
Поиск и сортировка
- Линейный поиск
- Поиск минимума и максимума
#include <stdio.h>
int main() {
int products[] = {101, 205, 308, 412, 506, 609};
int size = 6;
int searchCode = 308;
printf("Поиск товара с кодом: %d\n", searchCode);
for (int i = 0; i < size; i++) {
printf("Проверяем позицию %d: код %d\n", i, products[i]);
if (products[i] == searchCode) {
printf("✅ Товар найден на позиции %d\n", i);
printf("📦 Код товара: %d\n", products[i]);
break;
}
}
return 0;
}
int prices[] = {1200, 850, 1500, 670, 2100, 950};
int count = 6;
int minPrice = prices[0];
int maxPrice = prices[0];
int minIndex = 0, maxIndex = 0;
for (int i = 1; i < count; i++) {
if (prices[i] < minPrice) {
minPrice = prices[i];
minIndex = i;
}
if (prices[i] > maxPrice) {
maxPrice = prices[i];
maxIndex = i;
}
}
printf("Самый дешевый товар #%d: %d руб.\n", minIndex + 1, minPrice);
printf("Самый дорогой товар #%d: %d руб.\n", maxIndex + 1, maxPrice);
Основы работы со строками
Создание и вывод строк
#include <stdio.h>
int main() {
char greeting[] = "Добро пожаловать!";
char username[50] = "Пользователь";
printf("%s, %s\n", greeting, username);
// Изменение строки посимвольно
username[0] = 'п'; // Строчная буква
printf("Измененное: %s\n", username); // пользователь
return 0;
}
Длина строки
#include <stdio.h>
int stringLength(char str[]) {
int length = 0;
while (str[length] != '\0') {
length++;
}
return length;
}
int main() {
char message[] = "Изучаем строки";
int len = stringLength(message);
printf("Строка: \"%s\"\n", message);
printf("Длина: %d символов\n", len);
// Обход строки
printf("Символы: ");
for (int i = 0; i < len; i++) {
printf("'%c' ", message[i]);
}
printf("\n");
return 0;
}
Копирование строк
#include <stdio.h>
void copyString(char destination[], char source[]) {
int i = 0;
while (source[i] != '\0') {
destination[i] = source[i];
i++;
}
destination[i] = '\0'; // Не забываем нулевой символ!
}
int main() {
char original[] = "Исходная строка";
char copy[50]; // Достаточно места для копии
copyString(copy, original);
printf("Оригинал: %s\n", original);
printf("Копия: %s\n", copy);
return 0;
}
Частые ошибки
Типичные проблемы
// ❌ Выход за границы массива
int arr[5];
arr[5] = 100; // Индекс 5 не существует! (есть только 0-4)
// ❌ Забыть нулевой символ в строке
char name[5] = {'А', 'н', 'н', 'а'}; // Нет '\0'!
printf("%s\n", name); // Непредсказуемый вывод
// ❌ Недостаточный размер для строки
char short_str[5] = "Длинная строка"; // Не поместится!
// ❌ Неинициализированный массив
int numbers[5];
for (int i = 0; i < 5; i++) {
printf("%d ", numbers[i]); // Случайные значения!
}
Важные правила
- Индексы массивов начинаются с 0
- Максимальный индекс = размер - 1
- Строки всегда заканчиваются символом
'\0' - При создании строки размер должен учитывать нулевой символ
Полезные приемы
Инициализация массива значением
#include <stdio.h>
int main() {
int scores[10];
// Заполняем все элементы нулями
for (int i = 0; i < 10; i++) {
scores[i] = 0;
}
// Проверяем результат
printf("Инициализированный массив: ");
for (int i = 0; i < 10; i++) {
printf("%d ", scores[i]);
}
printf("\n");
return 0;
}
Обращение массива
#include <stdio.h>
int main() {
int numbers[] = {1, 2, 3, 4, 5};
int size = 5;
printf("Исходный массив: ");
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
// Обращаем массив
for (int i = 0; i < size / 2; i++) {
int temp = numbers[i];
numbers[i] = numbers[size - 1 - i];
numbers[size - 1 - i] = temp;
}
printf("Обращенный массив: ");
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
Лучшие практики
- Всегда инициализируйте массивы перед использованием
- Проверяйте границы при работе с индексами
- Для строк резервируйте место под нулевой символ
- Используйте константы для размеров массивов
- При копировании строк убедитесь в достаточном размере приемника
Массивы и строки — фундаментальные структуры данных для хранения и обработки наборов информации.