![](/user_photo/2706_HbeT2.jpg)
- •И.А. Васюткина основы алгоритмизации и программирования.
- •Содержание
- •1.Обзор языКа программирования с
- •2.Этапы создания программы
- •3.Структура программы на языке си
- •3.1. Внутренняя структура программы
- •3.2. Пример программы на си
- •4.Базовые элементы языка си
- •5.Данные в программе на си
- •5.1. Константы
- •5.2. Базовые стандартные типы переменных
- •6.2. Операции отношения
- •6.3. Логические операции
- •6.4. Операции с разрядами
- •6.5. Операции сдвига
- •6.6. Операция условия ?:
- •6.7. Преобразование типов
- •6.8. Операции приведения
- •6.9. Дополнительные операции присваивания
- •7.Операторы языка си
- •Оператор может быть простым и составным. Позволяет пропустить оператор или блок операторов, если условие ложно.
- •1.Схема выполнения оператора
- •8. Оператор множественного выбора
- •9. Операторы цикла while
- •8. Операторы безусловных переходов
- •8.Стандартные функции ввода и вывода
- •8.1. Функция вывода данных на экран printf ()
- •8.2. Модификаторы спецификаций преобразования
- •8.3. Функция ввода данных с клавиатуры sсanf()
- •8.4. Функции ввода/вывода одного символа getchar(), putchar()
- •8.5. Функции небуфиризированного ввода с клавиатуры
- •8.7. Форматирование вывода
- •Заключительная программа
- •9. Массивы
- •9.1. Одномерные массивы
- •Стандартные алгоритмы работы с одномерными массивами
- •Инициализация одномерных массивов
- •9.2. Многомерные массивы
- •Инициализация многомерных массивов
- •9.2.2 Стандартные алгоритмы работы с двумерными массивами
- •10. Функции
- •10.1.Cоздание и использование пользовательских функций
- •10.2.Параметры функции
- •10.3.Возвращение значения функцией
- •10.4.Inline-функции
- •10.5.Значение формальных параметров функции по умолчанию
- •10.6.Перегрузка функций
- •11. Классы памяти и область действия
- •11.1.Глобальные переменные
- •Extern - внешние переменные
- •Статистические внешние переменные - static
- •11.2.Локальные переменные
- •Внутренняя статическая переменная
- •Регистровая переменная
- •Автоматические переменные
- •11.3.Доступ к функциям в многомодульной программе
- •12. Препроцессор языка си
- •12.1. Подстановка имен
- •12.2.Включение файлов
- •12.3.Условная компиляция
- •13. Указатели
- •13.1.Операция косвенной адресации *
- •13.2. Описание указателей
- •13.3.Использование указателей для связи функций
- •13.4.Указатели на одномерные массивы
- •13.5.Указатели на многомерные массивы
- •13.6.Операции над указателями
- •13.7.Передача массива в качестве параметра в функцию
- •13.8.Указатель на void *
- •14. Символьные строки и функции над строками
- •14.1.Массивы символьных строк
- •14.2.Массивы указателей
- •14.3.Указатель как возвращаемое значение функции Передача указателя как параметра функции
- •14.4.Функции, работающие со строками Функции, определеные в заголовочном файле stdio.H
- •14.5. Стандартные библиотечные функции Функции, определеные в заголовочном файле string.H
- •14.6. Преобразование символьных строк
- •Функции, определеные в заголовочном файле ctype.H.
- •15. Ссылки
- •16. Параметры командной строки
- •17. Производные типы данных
- •17.1.Структуры
- •Массивы структур
- •Вложенные структуры
- •17.1.3 Указатели на структуры
- •Операции над структурами
- •Передача структуры в функцию
- •17.2.Объединения
- •17.3. Синоним имени типа
- •17.4.Определение именнованных констант
- •17.5.Перечисления
- •17.6.Битовые поля
- •18. Динамическое выделение памяти
- •2. Функция void* calloc(n,size type);
- •18.2.Операция new с массивами
- •18.3.Инициализаторы с операцией new
- •18.4.Ошибки при использовании динамичской памяти
- •19. Файл
- •19.1.Открытие файла fopen()
- •19.2.Закрытие файла fclose()
- •19.3.Функции ввода/вывода одного символа fgetc(), fputc()
- •19.4.Функции форматированного ввода/вывода в файл
- •Int fprintf(file *stream,”управл.Cтрока”,arg1,…)
- •Int fscanf(file *stream,”управл.Cтрока”,&arg1,…)
- •19.5. Функции ввода/вывода строки символов в файл
- •19.6.Функции управления указателем в файле
- •Int fseek(file *stream, смещение, start)
- •19.7.Ввод/вывод записей фиксированной длины
- •20. Динамические структуры данных
- •20.1.Однонаправленные связные списки
- •Вставка узла
- •Удаление узла из списка
- •20.2.Бинарные деревья
- •21. Размещение данных в памяти
- •22.Модели памяти
- •Список литературы
Массивы структур
Если переменных типа структура много, то определяется массив структур.
void main(void){
struct book libry[100];
int i;
for(i=0; i<100; i++){
puts("Введите название книги");
gets(libry[i].title);
puts("Введите автора книги");
gets(libry[i], author);
puts("Введите цену книги");
scanf("%f",&libry[i].value);
}
}
Индекс применяется к имени массива структур libry[i].
Если libry[2].title[3] – это 4-й элемент в title в 3-й структуре типа book.
Вложенные структуры
Если одна структура содержится или "вложена" в другую, то говорят, что это вложенные структуры.
struct names{ char name[20];
char fio[20];};
struct worker{ struct names people;
char job[20];
float money;};
void main(void){
struct worker driver = {{"Иван", "Иванов"},
"водитель", 1234.1};
Для обращения к элементу вложенной структуры применяется две операции «точка».
puts(driver .people.name);
17.1.3 Указатели на структуры
Указателями на структуры легче пользоваться, чем самими структурами. Структура не может передаваться в качестве аргумента функции, а указатель на структуру может.
struct worker *pdrv;
pdrv = &driver;
struct worker driver[2]; //массив структур
а) pdrv = driver; // pdrv <=> &driver[0];
pdrv+1 <=> &driver[1].
Доступ к элементу структуры осуществляется через операцию ->.
pdrv->job -> driver[0].job ->(*prdv).job
б) pdrv->people.name
Операции над структурами
1) Операция получения элемента.
driver.money=1234;
2) Операция косвенного получения элемента.
pdrv->money=3456;
Передача структуры в функцию
1. Можно передавать элемент структуры в качестве параметра в функцию. Тогда функция не знает, что это структура.
struct funds{
char* bank;
float fonds;
char* name;
float savef;
}stan={"ПРБ", 1023.87, «Иванов И.И.», 123,45};
float sum (float, float);
void main(void){
printf ("У Иванова И.И.всего %.2f рубл.\n", sum(stan.fonds,stan.savef));
}
float sum(float x, float y){
return(x+y);
}
Функция sum() не знает, что ей передается элементы структуры, важно, что они имеют тип float.
2. Если нужно, чтобы она воздействовала на элемент структуры, то нужно передвать адрес элемента и далее работать через указатель определенного типа.
modify(&stan.savef);
3. Сообщение функции, что она имеет дело со структурой. Для этого нужно передать адрес структуры в качестве параметра.
struct funds {...} stan={...};
void main(void){
float sum (struct funds*);
printf ("У Иванова И.И. %.2f рублей\n", sum(&stan));
}
float sum (stuct funds* money){
return(money->fonds+money->savef);
}
Указатель money ссылается на структуру funds. В отличие от массива имя структуры не является её адресом, поэтому указываем адрес &stan.
4. Имеется массив структур. В этом случае имя массива является его адресом.
struct funds {...}stans[2]={{...},{...}};
void main(void){
float sum (struct funds*);
printf ("Всего капитала %.2f рублей\n", sum(stans));
}
float sum(struct funds* money){
float summ;
int i;
for (i=0, summ=0;i<2; i++, money++)
summ+=money->fonds+money->savef;
return (summ);
}
money <=> &stan[0]; увеличивается money++, ссылаемся на stan[1].
Пример 1. Определить номер дня в году.
struct date { int day; int month;
int year; int yearday;}d={25,3,1999};
int date_tab[2][13]={{ 0,31,28,31,30,31,30,31,31,30,31,30,31},
{ 0,31,29,31,30,31,30,31,31,30,31,30,31}};
int day_of_year(struct date *pd) {
int i, day, l=0;
day = pd->day;
if(pd->year%4==0&&pd->year%100!=0||pd->year%400==0) //год высок.
l=1;
for(i=0; i< pd->month; i++)
day+=date_tab[l][i];
return(day);
}
void main(void) {
d.yearday=day_of_year(&d); - вызов функции.
printf(“%d“, d.yearday);
}