- •11. Операторы. Дополнение 135
- •12. Передача данных потоком 145
- •13. Файлы 149
- •14. Структура программы 157
- •15. Указатели, массивы, строки 170
- •16. Работа с экраhом 179
- •Задачи 185
- •Приложения 197
- •Библиографический список 224 введение
- •1. Основные понятия и определения
- •1.1. Компьютер
- •Процессор
- •Периферия
- •1.2. Алгоритмы
- •1.3. Программы и языки
- •Основные понятия языка программирования
- •Выполнение программы
- •Машинный и алгоритмический языки
- •Метаобозначения
- •Этапы обработки программы на компьютере
- •Терминология
- •Трансляция
- •Редактирование связей (компоновка)
- •Загрузка
- •1.4. Данные
- •Системы счисления
- •Типы и совокупности данных
- •Вещественные
- •Логические
- •Совокупности данных
- •2. Элементы языка
- •2.1. История языков с и Basic
- •2.2. Алфавит
- •2.3. Идентификаторы
- •2.4. Знаки разрядки
- •2.5. Комментарии
- •Могут ставиться везде, где допустим знак разрядки. Транслятор рассматривает их как пробел.
- •2.6. Запись текста программы
- •3.1.1. Целые
- •3.1.2. Данные с плавающей точкой
- •3.1.3. Логический тип
- •3.1.4. Символьные данные
- •3.1.5. Дополнительные типы данных
- •3.2. Совокупности данных
- •3.2.1. Массивы
- •Объявления массивов
- •Обращение к элементу массива
- •3.2.2. Структуры
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •4. Выражения
- •4.1. Арифметические операторы Основные
- •Дополнительные
- •Приоритет
- •4.2. Операторы конкатенации
- •4.3. Операторы сравнения
- •4.4. Логические операторы
- •4.5. Обращение к функции
- •4.6. Встроенные функции
- •4.7. Заключительные замечания
- •5.2. Присваивание
- •5.3. Безусловный переход
- •5.4. Инструкция If. Пустая инструкция
- •5.5. Составная инструкция
- •5.6. Циклы
- •5.6.1. Циклы с предусловием
- •Циклы while
- •Циклы for
- •5.6.2. Циклы с постусловием
- •5.6.3. Вложенные циклы
- •5.7. Управляемые переходы
- •5.7.1. Инструкция break
- •5.7.2. Инструкция continue
- •5.7.3. Инструкции exit и continue
- •5.8. Многоальтернативный выбор
- •5.8.1. Инструкция switch (язык с)
- •5.8.2. Инструкция select case (язык Basic)
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •6. Ввод-вывод
- •6.1. Язык Си
- •6.1.1. Управляющая строка
- •6.1.1.1. Спецификация d (целые десятичные числа)
- •6.1.1.2. Спецификация f (десятичные числа с плавающей точкой)
- •6.1.1.3. Спецификация e (десятичные числа с плавающей точкой)
- •6.1.1.4. Спецификация g (универсальная спецификация)
- •6.1.2. Вывод символьной информации
- •6.1.3. Инструкции printf и scanf. Схема ввода-вывода
- •6.2. Язык Basic
- •6.2.1. Метод ReadLine
- •6.2.2. Методы Write и WriteLine
- •7.1.1. Распределение скаляров
- •7 .1.2. Распределение массивов
- •7.1.3. Статическое и динамическое распределение памяти
- •7.2. Блоки
- •7.3. Процедуры
- •7.3.1. Определения процедур
- •Прототипы функций (c)
- •7.3.2. Передача данных между процедурами
- •Механизмы передачи данных
- •Передача скаляров Возвращаемое значение
- •Входные данные
- •Выходные данные
- •Передача массивов
- •Передача функций
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •8. Препроцессор
- •8.1. Определение символических констант
- •8.2. Включение файлов в текст программы
- •9.1. Формирование листинга
- •Перенос:
- •9.2. Комментарии
- •9.3. Имена Имена объектов программы должны быть осмысленными.
- •3. Литералы.
- •9. Ввод-вывод:
- •10.5. Подмассивы (сечения) (c)
- •10.6. Динамические массивы (b)
- •10.7. Структуры и объединения
- •10.7.1. Структуры
- •10.7.3. Поля битов (с)
- •10.7.4. Объединения (смеси) (с)
- •10.7.5. Переменные структуры
- •10.10. Пользовательские типы данных
- •10.11. Преобразование типов
- •10.10.1. Автоматические преобразования
- •10.10.2. Явные преобразования
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •11. Операторы. Дополнение
- •11.1. Уровень 1
- •11.2. Уровень 2 (унарные или одноместные операторы)
- •11.3. Уровень 3 (мультипликативные операторы)
- •11.4. Уровень 4 (аддитивные операторы)
- •11.5. Уровень 5 (сдвиги)
- •11.6. Уровень 6 (отношения)
- •11.7. Уровень 7 (равенство и неравенство)
- •11.8. Поразрядные операторы
- •11.9. Логические операторы
- •11.10. Уровень 13 (условное выражение)
- •11.11. Уровень 14 (операторы присваивания)
- •11.12. Уровень 15 (оператор ',' - запятая)
- •11.13. Некоторые замечания
- •11.14. Постоянные выражения
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •12. Передача данных потоком
- •12.1. Спецификация "s" управляющей строки функций scanf и printf
- •12.2. Функции getchar и putchar
- •12.3. Функции gets и puts
- •12.4. Внутренняя передача данных (функции sscanf и sprintf)
- •13.1. Основные понятия
- •13.2. Описание файла
- •13.3. Открытие и закрытие файлов
- •13.4. Средства языка с
- •13.4.1. Открытие и закрытие файла
- •13.4.2. Основные функции обмена
- •13.5. Средства языка Basic
- •13.5.1. Открытие и закрытие файла Инструкция FileOpen
- •Инструкция FileClose
- •13.5.2. Работа с файлами Инструкция Input
- •Инструкция LineInput
- •Инструкции Write и WriteLine
- •Инструкции Print и PrintLine
- •Дополнительные функции
- •Функция MsgBox
- •14.1. Элементы структуры программы.
- •14.1.2. Язык Basic
- •14.2. Область видимости (действия) и время жизни переменных
- •14.2.1. Язык c
- •14.2.2. Язык Basic
- •14.3. Инициализация данных
- •14.3.1. Язык с
- •2. Массивы.
- •15.1. Указатели
- •Определение указателей
- •Задание значений
- •Вывод значений
- •15.2. Указатели и массивы
- •15.3. Работа со строками
- •15.3.1. Литералы
- •15.3.2. Переменные
- •15.3.3. Операторы и функции
- •15.4. Динамические объекты
- •15.5. Типичные ошибки, связанные с указателями Отсутствие инициализации указателя
- •Двойное указание
- •15.6.2. Однонаправленный список
- •15.7. Указатели и многомерные массивы
- •15.8. Рекурсивные процедуры
- •15.8.1. Рекурсивное решение
- •15.8.2. Нерекурсивное решение. Стек в виде массива
- •15.8.3. Нерекурсивное решение. Стек в виде списка
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •16. Работа с экраhом
- •16.2. Управление окном
- •16.3. Управление атрибутом (цветами символа и фона в окне)
- •16.4. Информация о текстовом режиме
- •16.5. Пример
- •Простые циклы
- •Вложенные циклы
- •Процедуры
- •Работа со строками
- •Приложения
- •П1.1. Установка среды
- •П1.2. Запуск среды
- •П1.3. Меню Файл
- •П1.4. Меню Сервис
- •П1.5. Отладка
- •Начало отладки
- •Установка точек прерывания
- •Прогон до точки прерывания
- •Пошаговое выполнение программы
- •Получение значений объектов программы
- •Приложение 2. Среда разработки Visual Basic п2.1. Запуск среды
- •П2.2. Подготовка к работе с новым проектом
- •П2.3. Окна и режимы работы
- •П2.4. Главное меню
- •П2.5. Меню File (Файл)
- •П2.6. Редактирование текста
- •П2.7. Меню View (Вид)
- •П2.8. Меню Project (Проект)
- •П2.9. Отладка
- •Точки прерывания
- •Определение значений объектов программы в момент прерывания
- •Продолжение работы
- •П2.10. Меню Tools (Сервис)
- •П2.11. Меню Window (Окно)
- •Приложение 3. Ответы на вопросы для самопроверки
- •2. Элементы языка
- •3. Элементы данных
- •4. Выражения
- •5. Основные инструкции
- •6. Ввод-вывод
- •7. Процедуры
- •8. Препроцессор
- •9. Стиль программирования
- •10. Данные. Дополнение
- •11. Операторы. Дополнение
- •12. Передача данных потоком
- •13. Файлы
- •14. Структура программы
- •15. Указатели, массивы, строки
- •16. Работа с экраном
- •Приложение 4. Темы для курсовой работы
- •Библиографический список
Передача массивов
C
Если аргумент процедуры – массив, то в вызываемую процедуру передается по значению (копия!) адрес первого элемента (с нулевыми индексами) и массив не копируется в локальную память функции. При этом в список аргументов включается имя массива.
При объявлении float a[10][10] обращение вида: <имя_функции>(a) эквивалентно обращению: <имя_функции>(&a[0][0]). Следовательно, массивы-параметры занимают память, отводимую в вызывающей процедуре массивам-аргументам, поэтому в прототипе и вызываемой процедуре допустимы их описания вида float b[ ], a[ ][10]; Длины всех измерений, кроме первого, надо задавать, чтобы правильно извлечь из памяти значения нужного элемента массива (см. формулу в параграфе "Распределение массивов"). Допустимо даже несоответствие размерностей аргумента и параметра.
Пример.
Аргументы Параметры
float a[5][5], b[36]; float a[ ], b[ ][6];
Пример. Вычислить: z=uТbu, где {ui]}, i=1...4; {bij]}, i,j=1...4.
/* Вычисление квадратичной формы */
int main( ){
float u[4], // Входной вектор
b[4][4], // Входная матрица
v[4], // Вектор b*u
scalar(float [ ], float [ ]);// Скалярное произведение векторов
int i, j;
/* Умножение матрицы на вектор */
void matrix(float [ ][4], float [ ], float [ ]);// Прототип
printf("Исходный вектор:\n");
for(i=0; i<4; i++){
scanf("%f", &u[ i ]);
}
printf("Исходная матрица:\n");
for(i=0; i<4; i++){
for(j=0; j<4; j++){
scanf("%f", &b[ i ][ j ]);
}
}
matrix(b, u, v);
printf("\n\n\nКвадратичная форма равна %.5g\n", scalar(v, u));
}// End main
/* Умножение матрицы на вектор */
void matrix(float a[ ][4], float x[ ], float y[ ]){
int i, j;
for(i=0; i<4; i++){
for(y[ i ]=j=0; j<4; j++){
y[ i ] += a[ i ][ j ]*x[ j ];
}
}
}// End matrix
/* Скалярное произведение векторов */
float scalar(float x[ ], float y[ ]){
int i;
float z;
for(z=i=0; i<4; i++){
z+=x[ i ]*y[ i ];
}
return z;
}// End scalar
Замечание. Приведенный пример решает поставленную задачу только для размера матрицы 4х4, что не позволяет использовать данное решение для матриц других размеров. Это резко снижает область его применения (свойство массовости алгоритма). Для повышения универсальности алгоритма при использовании массивов в языке C применяют стандартный прием: объявляют массив максимально ожидаемого размера (проигрывая в памяти), затем задают реальные его размеры, контролируя непревышение выделенной памяти. Ниже приводится решение для максимального размера матрицы 30х30.
Пример. Вычислить: z=uТbu, где {ui]}, i=1...m; {bij]}, i,j=1...m.
/* Вычисление квадратичной формы */
int main( ){
float u[30], // Входной вектор
b[30][30], //Входная матрица
v[30], // Вектор b*u
scalar(int, float [ ], float [ ]);// Скалярное произведение векторов
int i, j,
m; // Размер матрицы
bool fl; // true-неправильный ввод
/* Умножение матрицы на вектор */
void matrix(int, float [ ][30], float [ ], float [ ]);
fl=true;
while(fl){
clrscr( );
printf("Размер матрицы:"); scanf("%d",&m);
if(m<1||m>30){
printf("Размер матрицы должен быть в диапазоне [1:%d]\n",30);
getch();
}else fl=false;
}
printf("Исходный вектор:\n");
for(i=0; i<m; i++){
scanf("%f", &u[ i ]);
}
printf("Исходная матрица:\n");
for(i=0; i<m; i++){
for(j=0; j<m; j++){
scanf("%f", &b[ i ][ j ]);
}
}
matrix(m, b, u, v);
printf("\n\n\nКвадратичная форма равна %.5g\n", scalar(m, v, u));
getch( );
}// End main
/* Умножение матрицы на вектор */
void matrix(int m, float a[ ][30], float x[ ], float y[ ]){
int i, j;
for(i=0; i<m; i++){
for(y[ i ]=j=0; j<m; j++){
y[ i ] += a[ i ][ j ]*x[ j ];
}
}
}// End matrix
/* Скалярное произведение векторов */
float scalar(int m, float x[ ], float y[ ]){
int i;
float z;
for(z=i=0; i<m; i++){
z+=x[ i ]*y[ i ];
}
return z;
}// End scalar
Аналогичный прием можно применять и в программировании на языке Basic, однако там имеется возможность при задании размеров выделять память под массивы в соответствии с ними.
Basic
В заголовке вызываемой процедуры для параметра-массива следует использовать ключевое слово ByRef. При этом копирования всего массива в локальную память процедуры не происходит и изменение его содержания приводит к изменению соответствующего аргумента в вызывающей процедуре.
Пример. Реализация предыдущей задачи. Только модуль Main.
Imports System.Console
Module Main
‘ Вычисление квадратичной формы
Sub main( )
Dim i, j, m As Short ‘ Размер матрицы
Dim fl As Boolean ‘ true-неправильный ввод
fl=True
Do While fl
Clear( )
Write("Размер матрицы:") : m=ReadLine( )
If m<1
WriteLine("Размер матрицы должен быть > 0”)
ReadLine( )
Else
fl=False
End If
Loop
‘Объявление массивов
Dim u(m-1) As Single ‘ Входной вектор
Dim b(m-1,m-1) As Single ‘ Входная матрица
Dim v(m-1) As Single ‘ Вектор b*u
WriteLine("Исходный вектор (вводить столбиком)")
For i=0 To m-1
u( i )=ReadLine( )
Next
WriteLine("Исходная матрица (вводить столбиком)")
For i=0 To m-1
For j=0 To m-1
b( i, j)= ReadLine( )
Next j
Next i
matrix(m, b, u, v)
WriteLine( )
WriteLine("Квадратичная форма равна {0:g5}", scalar(m, v, u))
ReadLine( )
End Sub
