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

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

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

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

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

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

от 25%

Подписываем

договор

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

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

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

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. Реферат Курсовая работа содержит 31 страницу 18 использованных источников
3. докладов для публикации в сборнике- объем до 3 страниц формат текста Word формат страницы А4 все поля ~ 2 см шри
4. Тематика контрольных работ для бакалавров 2 курса заочного отделения по дисциплине История экономической
5. 941. Позаду Москва Майже півроку йде Велика Вітчизняна Війна.1
6. тенге Доход 3000 Затраты 2000 Прибы
7. деньги. Денежные агрегаты.
8. Роль углеводов в жизнедеятельности человека
9. ЭФКОЗаря.html
10. .1. Понятие социальной ответственности7 1