Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Возможности языка Си для работы со структурами- определение структурного типа данных способы объявления п

Работа добавлена на сайт samzan.net: 2016-03-05

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 9.5.2024

ОСНОВЫ ПРОГРАММИРОВАНИЯ И АЛГОРИТМИЧЕСКИХ ЯЗЫКОВ

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 <выражение>; / * если выражение простое * /

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 (<выр>)

 {  <инструкция>

}
Семантика:

while ~ пока
Вычисляется значение выражения;

Если это выражение отличный от 0, то выполняется инструкция тела цикла;

Переход на 1.

Если выражение равно 0, то цикл завершается;

Если в теле цикла несколько инструкций, то их оформляют как составную инструкцию.

Пример:
float y, s, eps, x;

int i, n;

y = 1; n = 1; i = 1; s = x;

while (s / n> eps) 

  {

     y + = s / n;

     I + +;

    n * = x;
  
}

Цикл for:

Синтаксис:
for ([<вир1>],[ <вир2>],[ <вир3>];)

   <инструкция>
Семантика:
<вир1>;
   while (<вир2>)
   {<инструкция>;
   <вир3>;
   }
<вир1> - инициализация
<вир2> - условие завершения цикла

<вир3> - изменение переменной цикла
Каждый из трех выражений может быть отсутствующим, 

но разделяющие их знаки ';' должны быть.

Пример / * бесконечный цикл * /

for (;;)
{............}

Приклад

for ( i = 0; i <= N - 1; i++ ) N -кроків

s + = a[i];

Особенности цикла for в Си:

границы цикла for можно менять внутри  цикла;

как бы ни закончился цикл, его параметр сохраняет свое значение;

можно перенести в for все осуществлении операторы тела цикла;

Операция "," (запятая) 

Используется в операторе for; 

Пары выражений, разделенных запятыми, вычисляются слева направо; 
в каждом из выражений (вир1, вир2, вир3) можно размещать несколько выражений 
Пример 10 / * поворот строки S на месте - reverse (S): * / 

char s [10]; 

{ 
               
int r, i, j; 
              
for (i = 0, j = strlen (s) - 1; i <j; i + +, j -) 
                    
 { 
                         r = s [i]; 
                         s [i] = s [j]; 
                        s [j] = r; 
                  
 } 
           
} 
Запятая, разделяющая аргументы функций, переменные в описаниях и т.п., не является операция "запятая", и она не гарантирует вычисление слева направо.

Цикл do  while

Синтаксис
do
    <инструкция>
    while (<выр>)
Семантика
1. Выполняется <инструкция>;
2. Выполняется <выр>;
3. Если < выр> отлично от 0, то снова выполняется пункт 1) и т.д.;
4. Если < выр> равно 0, то повторение заканчиваются;
5. <инструкция> цикла do - while всегда выполняется хотя бы один раз.
  Пример 
define N 10
.......
int a [N], i, S;
.......
S = 0; i = 0;
  do
     S + = a [i]; i = i +1;
  while (i <N);

Инструкция break
Оператор break обеспечивает преждевременное прекращение циклов for,while, do - while, также как и переключателя.
Этот оператор вызывает немедленный выход из самого внутреннего из циклов или переключателей.сontinue 


Вызывает начало следующего шага цикла while, for, do - while
Пример/ * обработка только положительных элементов                   массива * / 
define N 10 
......... 
int a [N], i; 
........ 
for (i = 0; i <N; i + +) 
{ 
if (a [i] <0) / * пропускаем отрицательные элементы * / 
continue; 
........ / * Обработка положительных * / 

}

GOTO

Пример 
for (.....)
for (.....) {
....
if (<выражение>)
goto <метка>;
......
}
......
<метка>:
.......
Метка имеет вид обычного имени переменной, за которым стоит двоеточие.


ОСНОВЫ ПРОГРАММИРОВАНИЯ И АЛГОРИТМИЧЕСКИХ ЯЗЫКОВ

5.Возможности языка Си для организации работы с файлами прямого доступа: организация, открытие, позиционирование, чтение, запись, закрытие.

Файл - поименованная область памяти.Файли меет такие атрибуты: имя; тип (расширение); размер; Время создания (модификации).
Поэтому в ОС с файлами допустимы такие операции: создание, чтение, уничтожение, переименование, копирования 

В файлах прямого доступу любой элемент доступен по своему «номеру».

Файл в языке Си - это поток ввода-вывода, он идентифицируется в программе указателем на переменную базового типа FILE.

Для каждого файла в оперативной памяти создается буфер ввода-вывода (буфер ВВ). С его помощью осуществляется обмен между оперативной и внешней памятью на двух уровнях: 

физический уровень - между внешней памятью и буфером ввода-вывода

логический уровень - между буфером ввода-вывода и переменной в оперативной памяти

Перед началом работы с файлом в программе его нужно "открыть".
Синтаксис: fopen (p1, p2)
Аргументы:
p1: строка (это имя файла в ОС);
p2: строка (это статус файла):
"r" - файл открыт для чтения (read);
"w" - файл открыт для записи (write);
"a"- файл открыт для добавления (арpend);
Возможны комбинации статусов:
r + w - файл открыт для чтения и записи одновременно (read + write)

После завершения работы с файлом в программе его нужно "закрыть".
Синтаксис:
fclose (<указатель на файл>)
Семантика:
Прекращается связь программы с файлом;
Возвращает:м0, если закрытие выполнено успешно; 1, иначе.

FILE * fo; 
   fo = fopen("test.txt","wt"); 

Запись текстовой строки в файл выполняет функция fprintf():
   fprintf( fo, "Привет!" );
 

Для ввода данных (текстовой строки) используют функцию 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;

};




1. Реферат- Модель покупательского поведения
2. Спаситель Арианы
3. Интраоперационный мониторинг
4. Учебник посвящен анализу и современной интерпретации различных направлений психотерапии
5. Доклад- Эмульсии
6. В Ломоносова посвященное событию которое войдет в историю науки теперь это можно сказать уверенно
7. методическое пособие для студентов медицинского факультета VI семестр г
8. то может и не поверит в это
9. Россия в период просвещенного абсолютизма
10. Формирование и расходование бюджета территориального фонда обязательного медицинского страхования в муниципальном образовании города Норильск
11. Тема- СОЦИАЛЬНЫЕ КОНФЛИКТЫ Выполнила студентка 1 курса факультета экономики и права
12. Разработка методика диагностики технического блока питания видеомонитора EGA
13. Беларускія землі ў складзе Рэчы Паспалітай1
14. Роль игр для закрепления звуков Р, Ръ и Л, Лъ
15. Разработка тестопригодной схемы МПС на базе МП I8080
16. Движение флюидов- происхождение нефти и формирование месторождений углеводородов
17. Влияние НТП на условия труда работников
18. Пояснительная записка к курсовому проекту по дисциплине Строительные конструкции Выполнил-ст
19. і Симетрична та несиметрична перешкоди
20. Лекция. Рекламное позиционирование или концепция трехуровневого позиционирования Росситера Перси Рекла