Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
ОСНОВЫ ПРОГРАММИРОВАНИЯ И АЛГОРИТМИЧЕСКИХ ЯЗЫКОВ 1. Возможности языка Си для работы со структурами: определение структурного типа данных, способы объявления переменных структурного типа, доступ к элементам структуры. Структура - это одна или несколько переменных, возможно, различных типов данных, которые сгруппированы под одним именем. Способы объявления структуры: Синтаксис: struct [<ім'я = тег>] { <декларация члена 1>; < декларация члена 2>; ... < декларация члена n>; }; struct struct point typedef struct { int x; { int x; { int x; int y; int y; int y; }; } } Point; /* без тега*\ /* с тегом *\ /*новый тип struct point *\ Объявление переменной: Синтаксис: I. <декларація типу структури> <список змінних>; II. struct <тег> <список змінних> struct 2) struct point 3)Point p; { int x; p; int y; } p; /* без тега*\ /* с тегом *\ Доступ к элементам структуры: Синтаксис: <ім'я_структури>.<ім'я_члена> Оператор «.» - Бинарный, инфиксний, левоассоциативный, наивысший приоритет 1) p.x 2) Point *pp; pp-> x; |
ОСНОВЫ ПРОГРАММИРОВАНИЯ И АЛГОРИТМИЧЕСКИХ ЯЗЫКОВ 2.Возможности языка Си для работы с многомерными массивами: определение, размещение в памяти, моделирование с помощью указателей, доступ к элементам массива. Многомерный массив это массив массивов. Синтаксис: <тип><имя массивы> [<размер1>][<размер2>]…[<размер n>] В памяти размещается по строкам. К примеру, int x[2][3]; Моделирование с помощью указателей: Указатель - это переменная, значением которой является адрес Приклад 10: /* 2 способа представления двумерного массивов */ 1) int a[3][4]; 2) int *b[3]; В первом случае массивы, которые являются строками матрицы, должны быть все обинаковой длины. Во втором случае строки могут быть разной длины, в этом заключается преимущество в работе с указателями. Чаще всего этим способом пользуются в работе со строками, Доступ к элементам массива: 1) x[0][2]; 2) int *px=x; рx указывает на некоторый элемент, рx +1 указывает на следующий элемент, px + i - на i-й элемент после рx, рx-1 - на предыдущей (перед рx). |
ОСНОВЫ ПРОГРАММИРОВАНИЯ И АЛГОРИТМИЧЕСКИХ ЯЗЫКОВ 3.Возможности языка Си для работы со вспомогательными алгоритмами: определение функции, прототип функции, способы передачи аргументов, вызов функции. На этапе разработкиалгоритма каждому вспомогательному методу ставят в соответствии вспомогательный алгоритм. В языке Си вспомогательным алгоритмом будет соответствовать понятие функция, которая будет выполнять свои бязанности фиксированным способом и выполнять взаимодействие с другими функциями. Синтаксис: <тип результата> <імя функции> ([<список формальных аргументов>]) { [<декларації>] /* тіло*\ [<інструкції>] /* функції*/ }; Могут быть опущены отдельные компоненты этого определения: если опущено <тип результата>, то по умолчанию тип результата функции - int; если опущены <декларации> в <теле функции>, то у такой функции нет локальных переменных; если опущены <инструкции> в <теле функции>, то не имеет вычисления результата для этой функции - это "пустая функция" (заглушка) Прототип функции это душа функции. Нужен для подсказки компилятору, что она обрабатывается линкером. Синтаксис: <тип результата> <імя функции> ([<список формальных аргументов>]) К примеру, int max_int(int, int); Ожидается вызов функции max_int с двумя целочисленными аргументами, которая возвращает результат целого типа. Вызов функции: <ім'я функції>( [<список аргументів>] ) /* виклик printf: */ printf ("як інструкція"); Инструкция return (возврат) Возвращает результат из функции, которая вызывается, в функцию, которая вызывает. return (<выражение>) / * если выражение сложное * / Способы передачи аргументов: существует три способа передачи аргументов: по значению; по имени; по ссылке. Способ передачи по значению применяется только для входных аргументов Приклад 1: int max_int (int a, int b) { return (a>b) ? a : b;} main() { int max_int(int,int); int m1; m1=max_int (5, 9); } Передача аргументов по имени int max_int (int a, int b) { return (a>b)?a:b;} main( ) { scanf("%d",&a); b = 25; m1 = max_int (a, b); } Передача аргументов по ссылке void obmen (int a, int b) { int r; r = *a; *a = *b; *b = r; } main() { int x,y; void obmen (int*, int*) scanf ("%d,%d",&x,&y); printf("x=%d y=%d,"x,y); obmen(&x,%y); printf ("x=%d y=%d,"x,y); } |
ОСНОВЫ ПРОГРАММИРОВАНИЯ И АЛГОРИТМИЧЕСКИХ ЯЗЫКОВ 4.Возможности языка Си для организации повторяющихся вычислений: инструкции циклов (синтаксис, семантика, примеры) и инструкции, не являющиеся элементами структурного программирования (break, continue, go to). Цикл While { <инструкция> } while ~ пока Если это выражение отличный от 0, то выполняется инструкция тела цикла; Переход на 1. Если выражение равно 0, то цикл завершается; Если в теле цикла несколько инструкций, то их оформляют как составную инструкцию. Пример: int i, n; y = 1; n = 1; i = 1; s = x; while (s / n> eps) { y + = s / n; I + +; n * = x; Цикл for: Синтаксис: <инструкция> <вир3> - изменение переменной цикла но разделяющие их знаки ';' должны быть. Пример / * бесконечный цикл * / for (;;) Приклад for ( i = 0; i <= N - 1; i++ ) N -кроків s + = a[i]; Особенности цикла for в Си: границы цикла for можно менять внутри цикла; как бы ни закончился цикл, его параметр сохраняет свое значение; можно перенести в for все осуществлении операторы тела цикла; Операция "," (запятая) Используется в операторе for; Пары выражений, разделенных запятыми, вычисляются слева направо; char s [10]; { Цикл do while Синтаксис Инструкция break
GOTO Пример |
ОСНОВЫ ПРОГРАММИРОВАНИЯ И АЛГОРИТМИЧЕСКИХ ЯЗЫКОВ 5.Возможности языка Си для организации работы с файлами прямого доступа: организация, открытие, позиционирование, чтение, запись, закрытие. Файл - поименованная область памяти.Файли меет такие атрибуты: имя; тип (расширение); размер; Время создания (модификации). В файлах прямого доступу любой элемент доступен по своему «номеру». Файл в языке Си - это поток ввода-вывода, он идентифицируется в программе указателем на переменную базового типа FILE. Для каждого файла в оперативной памяти создается буфер ввода-вывода (буфер ВВ). С его помощью осуществляется обмен между оперативной и внешней памятью на двух уровнях: физический уровень - между внешней памятью и буфером ввода-вывода логический уровень - между буфером ввода-вывода и переменной в оперативной памяти Перед началом работы с файлом в программе его нужно "открыть". После завершения работы с файлом в программе его нужно "закрыть". FILE * fo; Запись текстовой строки в файл выполняет функция fprintf(): Для ввода данных (текстовой строки) используют функцию fscanf() Функция fseek( ) позволяет выполнять чтение и запись с произвольным доступом и имеет следующий прототип: int fseek(FILE *fp, long count, int access); Здесь fp - указатель на файл, возвращенный функцией fopen( ), count - номер байта относительно заданной начальной позиции, начиная с которого будет выполняться операция, access - способ задания начальной позиции. Переменная access может принимать следующие значения: 0 - начальная позиция задана в начале файла; 1 - начальная позиция считается текущей; 2 - начальная позиция задана в конце файла. |
Типичные задачи: работа с матрицами, строковыми и символьными данными. Работа с файлами последовательного и прямого доступа. Использование структурных типов данных. Работа со списками.
Подсчитать количество элементов в списке:
Найти сумму/произведение элементов
Есть или нет что-то в списке
Добавить элемент в список (malloc)
Удалить (например, каждый n-й эелемент) free caranty
Обязательно нарисовать список. В previus записать next.
Найти сумму/произведение элементов - сделал сумму всех положительных элементов (summ_all_pozitive)
Есть или нет что-то в списке - search_in_list(int data) - ищет элемент с полем дата i
Добавить элемент в список (malloc) -
void add_node(int new_data) - добавить в конец
struct spisok* name_node_add(struct spisok *list, int new_data) - добавить в конец, результат вернуть через имя (она говорила такое)
struct spisok *add_i_elt(struct spisok *list, int i, int new_data) - добавить элемент на i-тую позицию
Удалить (например, каждый n-й элемент)
struct spisok *del_i(struct spisok *list, int i) - удалить элемент с i-той позиции.
#include <stdio.h>
#include <malloc.h> /*в примере было alloc.h. возможно из-за того что под ubuntu компилирую*/
/*Структура списка*/
struct spisok
{
int data;
struct spisok *next;
};
/*Переменная-список*/
struct spisok *my_list;
/*Добавление записи в список*/
void add_node(int new_data)
{
struct spisok *prev=NULL; /*прдыдущий элемент*/
struct spisok *cur=my_list; /*текущий элемент*/
struct spisok *new_node; /*новый элемент*/
/*Идём в конец списка*/
while(cur) /*пока cur не равен NULL (не пустой)*/
{
prev=cur; /*предыдущий сделать текущим*/
cur=cur->next; /*текущий сделать следующим*/
};
/*создание нового элемента*/
new_node=malloc(sizeof(struct spisok)); /*выделим память (столько байт, сколько занимает структура spisok)*/
new_node->data=new_data; /*заполним данные*/
new_node->next=NULL; /*обнулим указатель*/
if(prev) /*если предыдущий элемент не пустой (cur пустой в любом случае)*/
prev->next=new_node; /*добавим new_node в конец списка*/
else /*в списке ещё нет элементов, prev пуст*/
my_list=new_node; /*присвоем списку new_node*/
};
/*добавим элемент, новый список возвращаем по имени*/
/*тоже самое, как и в предидущей, только возвращает результат и*/
struct spisok* name_node_add(struct spisok *list, int new_data) /*среди формальных параметров есть указатель на список */
{
struct spisok *prev=NULL;
struct spisok *cur=list; /*текущему элементу присваиваем значение, переданное в заголовке функции*/
struct spisok *new_node;
while(cur)
{
prev=cur;
cur=cur->next;
};
new_node=malloc(sizeof(struct spisok));
new_node->data=new_data;
new_node->next=NULL;
if(prev)
prev->next=new_node;
else
list=new_node; /*присваиваем новое значение формальному параметру*/
return list; /*возвращаем результат*/
};
/*поиск элемента в списке*/
void search_in_list(int data)
{
struct spisok *list=my_list; /*это нужно что бы запомнить начало списка*/
int rezult=0; /*флаг. если элемент найден - присвоим его единице*/
while(list) /*пока значение list не пустое*/
{
if(list->data==data) /*если нужное значение найдено*/
rezult=1; /*изменим значение флага*/
list=list->next; /*перейдём к следующему элементу*/
};
if (rezult) /*если rezult не равен нулю*/
printf("\nElement %d nayden",data);
else
printf("\nElement %d ne nayden",data);
};
/*посчитать сумму положительных элементов*/
int summ_all_pozitive()
{
struct spisok *list=my_list;
int sum=0;
while(list) /*пока не конец списка*/
{
if(list->data>0) /*если элемент удовлетворяет условию*/
sum=sum+list->data; /*суммировать элементы*/
list=list->next; /*перейти к следующему*/
};
return sum; /*вернуть результат*/
};
/*добавить элемент на позицию i*/
struct spisok *add_i_elt(struct spisok *list, int i, int new_data)
{
struct spisok *cur=list;
struct spisok *prev=NULL;
struct spisok *new_node;
int j=0;
while (cur)
{
if(i==j) /*достигли искомой позиции*/
{
new_node=malloc(sizeof(struct spisok)); //выделяем память для нового элемента
new_node->data=new_data;
if(prev==NULL) /*вставляем в начало*/
{
new_node->next=cur; /*теперь элемент new_node - начало списка*/
return new_node; /*вернём его в качестве результата*/
}
if(cur->next==NULL) /*вставляем элемент в конец списка*/
{
new_node->next=NULL; /*он завершает список и ни на что не указывает*/
cur->next=new_node; /*последний элемент списка должен указыать на него*/
return list;
};
/*если ни одно из предыдущих условий не сработало. элемент из середины списка*/
new_node->next=cur; /*новый элемент будет указывать на текущий*/
prev->next=new_node; /*предыдущий элемент будет указывать на новый*/
return list;
};
j=j+1;
prev=cur;
cur=cur->next;
};
printf("\nВ списке нет элемента с таким номером\n");
};
struct spisok *del_i(struct spisok *list, int i)
{
struct spisok *cur=list;
struct spisok *prev=NULL;
struct spisok *del_node;
int j=0;
while (cur)
{
if(i==j) /*достигли искомой позиции*/
{
if(prev==NULL) /*удалить начало*/
{
del_node=cur; /*запомнить удаляемый элемент*/
cur=cur->next; /*сдвинуть начало на позицию вправо*/
free(del_node); /*удалить сохранённый элемент*/
return cur;
}
if(cur->next==NULL) /*удаляем конечный элемент списка*/
{
prev->next=NULL; /*предыдущий элемент становится окнечным (ни на что не указывает)*/
free(cur); /*удалить текущий элемент*/
return list; /*вернуть результат*/
};
/*если ни одно из предыдущих условий не сработало. элемент из середины списка*/
prev->next=cur->next; /*предыдущий указывает на следующий*/
free(cur); /*удалим текущий*/
return list;
};
j=j+1;
prev=cur;
cur=cur->next;
};
printf("\nВ списке нет элемента с таким номером\n");
return list;
};
/*показать все элементы списка*/
void show_list()
{
struct spisok *list=my_list;
printf("\n");
while(list) /*пока не конец списка (list не пустой)*/
{
printf("%d --> ",list->data); /*показать значение элемента*/
list=list->next; /*перейти к следующему*/
};
printf("\n");
};
int main()
{
my_list=NULL;
add_node(1);
add_node(10);
my_list=name_node_add(my_list, -2);
my_list=name_node_add(my_list, 20);
add_node(100);
show_list();
search_in_list(10);
search_in_list(11);
search_in_list(100);
printf("\nSumm_all_pozitive = %d",summ_all_pozitive());
my_list=add_i_elt(my_list, 0, 2012);
show_list();
my_list=add_i_elt(my_list, 5, 2012);
show_list();
my_list=add_i_elt(my_list, 3, 2012);
show_list();
my_list=del_i(my_list, 0);
show_list();
my_list=del_i(my_list, 6);
show_list();
my_list=del_i(my_list, 2);
show_list();
printf("\n");
return 0;
};