Структура простейшей программы на си

Это моя личная ссылка-приглашение на Stepik для вас. Регистрируясь по этой ссылке, записываясь на курсы и решая задачи, Вы помогаете автору данного сайта принять участие в конкурсе платформы Stepik! Подробности конкурса здесь: https://vk.cc/75rKuS

среда, 7 января 2015 г.

Структуры в языке Си.

Видео урок.

Прежде чем говорить о структурах, вспомним массивы. Как вы, наверное, помните, массивы предназначены для хранения однотипных данных. Другими словами каждый элемент массива представляет собой значение определенного типа: целое число, символ, строка. Но зачастую, в программах, требуется хранить в одном месте данные разных типов.

В качестве примера, в этом уроке будем рассматривать программу каталог книг. Про каждую книгу нам известно: название, автор, год издания, количество страниц, стоимость.
Типы переменных, используемые для хранения подобных данных очевидны:
char[] – автор, название.
int – год издания, количество страниц.

Структуры в СИ для начинающих (часть 1)


float – стоимость.

На ум сразу приходит следующий вариант реализации. Завести для каждого отдельного качества отдельный массив. Например:

int book_date[100]; // дата издания
int book_pages[100]; // количество страниц
char book_author[100][50]; // автор
char book_title[100][100]; // название книги
float book_price[100]; //стоимость

Тогда, обращаясь по i -му номеру к соответствующему массиву, мы могли бы получить требуемую информацию. Например, вот так мы могли бы вывести на экран автора, название и количество страниц четвертой книги (не забываем, что нумерация элементов массива начинается с нуля).

printf( «%s-%s %d page» , book_author[3], book_title[3], book_pages[3]);

Оставим пока что эту реализацию, и посмотрим, как выполнить такую же задачу с использованием структур. Но прежде всего, определим, что такое структура.

Что такое структура.

Задумаемся, что такое структура в обычном понимании этого слова. Структура – это строение или внутренне устройство какого-либо объекта.
Структура в языке Си – это тип данных, создаваемый программистом, предназначенный для объединения данных различных типов в единое целое.
Прежде чем использовать в своей программе структуру, необходимо её описать, т.е. описать её внутреннее устройство. Иногда это называю шаблоном структуры. Шаблон структуры описывается следующим образом.
На картинке слева, мы описали шаблон структуры с именем point . В любом шаблоне структуры можно выделить две основных части: заголовок (ключевое слово struct и имя структуры) и тело (поля структуры, записанные внутри составного оператора).
Точка с запятой в конце обязательна, не забывайте про неё.

Возвращаясь к нашему примеру, опишем структуру book с полями date, pages, author, title, price соответствующих типов.

struct book

Структура программы на Си, Переменные, Типы данных


int date; // дата издания
int pages; // количество страниц
char author[50]; // автор
char title[100]; // название книги
float price; // стоимость
>;

Попутно отметим, что в качестве полей структуры могут выступать любые встроенные типы данных и даже другие структуры. Подробнее об этом я расскажу в другом уроке. На имена полей накладываются те же ограничения, что и на обычные переменные. Внутри одной структуры не должно быть полей с одинаковыми именами. Имя поля не должно начинаться с цифры.

Регистр учитывается.
После того, как мы описали внутреннее устройство структуры, можно считать, что мы создали новый тип данных, который устроен таким вот образом. Теперь этот тип данных можно использовать в нашей программе.
ПРИМЕЧАНИЕ: Обычно структуры описываются сразу после подключения заголовочных файлов. Иногда, для удобства, описание структур выносят в отдельный заголовочный файл.

Как объявить структурную переменную (структуру).

Объявление структурной переменной происходит по обычным правилам.
struct book kniga1;

Такое объявление создает в памяти переменную типа book , с соответствующими полями.

Отличие структурной переменной от обычной переменной удобно проиллюстрировать на примере с коробками. Считаем, что обычная переменная это просто коробка, в которую можно положить объект определенного типа, например, целое число.
Структурная переменная, это тоже коробка, внутри которой есть отдельные секции для хранения различных данных. Количество этих секций и типы данных, которые мы можем там хранить, задаются шаблоном структуры. На рисунке я постарался схематично изобразить устройство структурной переменной.

Отмечу, что я сознательно не касаюсь вопроса о том, как хранится структура в памяти, так как считаю, что для новичков эти тонкости будут излишни.
Кроме того, еще одну удобную интерпретацию структуры дает нам книга K

Важный момент. Порядок и тип аргументов, должен совпадать с порядком и типом полей, описанных в шаблоне структуры. В нашем примере мы сначала записали дату, потом количество страниц, имя автора, название книги и стоимость. Пропустить какой-то аргумент нельзя, но можно не объявлять несколько последних. Т.е. вполне допустима следующая конструкция:

Читайте также:
Программы для ютуба чтобы редактировать видео

struct book kniga1 = ;
Как обращаться к полям структуры.

Для обращения к отдельным полям структуры используется оператор доступа «.» . Да-да, обычная точка.
Примеры:

kniga1.pages = 250; // записываем в поле pages переменной kniga1
// значение 250.
printf( «%s-%s %d page» , kniga1.author, kniga1.title, kniga1.pages);

Задание: Проверить, что хранится в полях структуры до того, как им присвоено значение.
Сейчас, в одной переменной типа book храниться вся информация об одной книге. Но так как в каталоге вряд ли будет всего одна книга, нам потребуется много переменных одного и того же типа book . А значит что? Правильно, нужно создать массив таких переменных, то есть массив структур. Делается это аналогично, как если бы мы создавали массив переменных любого стандартного типа.

struct book kniga[100];

Каждый элемент этого массива это переменная типа book . Т.е. у каждого элемента есть свои поля date, pages, author, title, price . Тут-то и удобно вспомнить о второй интерпретации структуры. В ней массив структур будет выглядеть как таблица.

Используя массив структур получить информацию об отдельной книге можно следующим образом.

printf( «%s-%s %d page» , kniga[3].author, kniga[3].title, kniga[3].pages);

Обращаясь к kniga[3].author мы обращаемся к четвертой строке нашей таблицы и столбику с именем author . Удобная интерпретация, не правда ли?
На данном этапе мы научились основам работы со структурами. Точнее мы переписали с использованием структур тот же код, который использовал несколько массивов. Кажется, что особой разницы нет. Да, на первый взгляд это действительно так. Но дьявол, как обычно, кроется в мелочах.
Например, очевидно, что в нашей программе нам часто придется выводить данные о книге на экран. Разумным решением будет написать для этого отдельную функцию.
Если бы мы пользуемся несколькими массивами, то эта функция выглядела бы примерно так:

void print_book ( int date, int pages, char *author,
char *title, float price)
printf( «%s-%s %d page.nDate: %d nPRICE: %f rub.n» ,
author, title, pages,date, price);
>

А её вызов выглядел как-то вот так:

print_book (book_date[3], book_pages[3], book_author[3],
book_title[3], book_price[3]);

Не очень-то и компактно получилось, как вы можете заметить. Легче было бы писать каждый раз отдельный printf(); .
Совсем другое дело, если мы используем структуры. Так как структура представляет собой один целый объект (большую коробку с отсеками), то и передавать в функцию нужно только его. И тогда нашу функцию можно было бы записать следующим образом:

void sprint_book (book temp)
printf( «%s-%s %d page.nDate: %d nPRICE: %f rub.» ,
temp.author,temp.title, temp.pages,
temp.date, temp.price);
>

И вызов, выглядел бы приятнее:

sprint_book (kniga[3]);

Вот это я понимаю, быстро и удобно, и не нужно каждый раз писать пять параметров. А представьте теперь, что полей у структуры бы их было не 5, а допустим 10? Вот-вот, и я о том же.
Стоит отметить, что передача структурных переменных в функцию, как и в случае обычных переменных осуществляется по значению. Т.е. внутри функции мы работаем не с самой структурной переменной, а с её копией. Чтобы этого избежать, как и в случае переменных стандартных типов используют указатель на структуру. Там есть небольшая особенность, но об этом я расскажу в другой раз.
Кроме того, мы можем присваивать структурные переменные, если они относятся к одному и тому же шаблону. Зачастую это очень упрощает программирование.
Например, вполне реальная задача для каталога книг, упорядочить книги по количеству страниц.
Если бы мы использовали отдельные массивы, то сортировка выглядела бы примерно так.

for ( int i = 99; i > 0; i—)
for ( int j = 0; j < i; j++)
if (book_pages[j] > book_page[j+1])
//меняем местами значения во всех массивах
int temp_date;
int temp_pages;
char temp_author[50];
char temp_title[100];
float temp_price;

temp_date = book_date[i];
book_date[i] = book_date[j];
book_date[j] = temp_date;

temp_pages = book_pages[i];
book_pages[i] = book_pages[j];
book_pages[j] = temp_pages;

//и так далее для остальных трех массивов
>

Совсем другой дело, если мы используем структуры.

for ( int i = 99; i > 0; i—)
for ( int j = 0; j < i; j++)
if (knigi[j].pages > knigi[j+1].pages)
struct book temp;
temp = knigi[j]; //присваивание структур
knigi[j] = knigi[j+1];
knigi[j+1] = temp;
>

Неоспоримое удобство, не правда ли?
Надеюсь, у меня получилось достаточно убедительно показать преимущества использования структур.
На этой радостной ноте, я и завершаю сегодняшний урок.

Читайте также:
Программа которая меняет лицо на мультяшное

Практическое задание:

  • Чтение данных в структуру из файла. В файле запись о каждой книге хранится в следующем формате:

Автор||Название||Год издания||Прочитано||Количество страниц||Стоимость

Khnut||Art of programming. T.1||1972||129||764||234.2
Ritchie||The C Programming Language. 2 ed.||1986||80||512||140.5
Cormen||Kniga pro algoritmy||1996||273||346||239

  • Вывод в файл в виде отформатированной таблицы содержимое всего каталога.
  • Функцию добавления книги в каталог.
  • Функцию поиска по названию книги, по автору и по году издания. Например, вводим год издания, на экране формируется таблица с книгами этого года издания.
  • Сортировка книг по стоимости.
  • Функцию подсчитывающее количество прочитанных страниц.

Источник: www.youngcoder.net

Правила записи программы на языке Си

Язык «C» − это универсальный язык программирования, для которого характерны экономичность выражения, современный поток управления и структуры данных, богатый набор операторов. Язык «C» не является ни языком «очень высокого уровня», ни «большим» языком, и не предназначается для некоторой специальной области применения. Но отсутствие ограничений и общность языка делают его более удобным и эффективным для многих задач, чем языки, предположительно более мощные.

Язык Си наряду с тем, что он позволяет освоить хороший стиль программирования, так же как более простые и менее мощные языки высокого уровня (Бейсик, Паскаль), даёт возможность программисту осуществлять непосредственный доступ к ячейкам памяти и регистрам компьютера, требуя при этом знания особенностей функционирования ЭВМ. В этом Си схож с языком низкого уровня — ассемблером. Поэтому язык Си иногда называют ассемблером высокого уровня, хотя на самом деле он представляет собой гораздо более мощное средство решения трудных задач и создания сложных программных систем.

Язык «C», первоначально предназначавшийся для написания операционной системы «UNIX» на ЭВМ DEC PDP-11, был разработан и реализован на этой системе Деннисом Ричи. Операционная система, компилятор с языка «C» и по существу все прикладные программы системы «UNIX» (включая все программное обеспечение, использованное при подготовке этой книги) написаны на «C». Коммерческие компиляторы с языка «C» существуют также на некоторых других ЭВМ, включая IBM SYSTEM/370, HONEYWELL 6000, INTERDATA 8/32. Язык «C», однако, не связан с какими-либо определенными аппаратными средствами или системами, и на нем легко писать программы, которые можно пропускать без изменений на любой ЭВМ, имеющей «C»-компилятор.

Выбор С в качестве базового языка для С++ объясняется следующими его достоинствами:

– универсальность, краткость и относительно низкий уровень;

– адекватность большинству задач системного программирования;

– он идет в любой системе и на любой машине;

– полностью подходит для программной среды UNIX.

В Си существуют свои проблемы, но в языке, разрабатываемом «с нуля» они появились бы тоже, а проблемы Си, по крайней мере, хорошо известны. Более важно то, что ориентация на Си позволила использовать язык «Си с классами» как полезный (хотя и не очень удобный) инструмент в течение первых месяцев раздумий о введении в Си классов в стиле Симулы.

С++ стал использоваться шире, но по мере роста его возможностей, выходящих за пределы Си, вновь и вновь возникала проблема совместимости. Ясно, что отказавшись от части наследства Си, можно избежать некоторых проблем. Это не было сделано по следующим причинам:

– существуют миллионы строк программ на С, которые можно улучшить с помощью С++, но при условии, что полной переписи их на язык С++ не потребуется;

– существуют миллионы строк библиотечных функций и служебных программ на С, которые можно было бы использовать в С++ при условиях совместимости обоих языков на стадии связывания и их большого синтаксического сходства;

– существуют сотни тысяч программистов, знающих С; им достаточно овладеть только новыми средствами С++ и не надо изучать основ языка;

– поскольку С и С++ будут использоваться одними и теми же людьми на одних и тех же системах многие годы, различия между языками должны быть либо минимальными, либо максимальными, чтобы свести к минимуму количество ошибок и недоразумений. Описание С++ было переработано так, чтобы гарантировать, что любая допустимая в обоих языках конструкция означала в них одно и то же.

Практически все используемые в мире ключевые программные средства, в том числе компиляторы, операционные системы, СУБД, системы телекоммуникаций написаны на Си++. Не вызывает сомнений подавляющее превосходство Си++ в области встроенных систем и индустрии компьютерных игр (Doom III, StarCraft и др.). На Си++ реализованы ведущие поисковые Web-системы и крупнейшие Web-порталы: Google, Yahoo, Amazon и др. Создатель Си++ Бьерн Страустроп приводит следующие аргументы в пользу языка: «Си++ является наилучшим языком для многих приложений, где требуется системное программирование, имеются определенные ограничения по ресурсам и выдвигаются серьезные требования к производительности. Одним из примеров служит Google, другим — встроенные системы для миниатюрных устройств».

Читайте также:
Программа дмс 1 согаз что входит

Язык Си был разработан американцем Деннисом Ритчи в исследовательском центре Computer Science Research Center of Bell Laboratories корпорации AT /* описание типов данных */

num=2.345; /*Присвоим переменной num значение 2.345 */

printf(«sin(%f)=%fn», num, sin(num)); /* Вывод на экран */

Любой файл начинается с директив #include, вставляющих в текст программы так называемые заголовочные файлы, которые содержат описания функций, используемых в этом файле. В нашем примере это описания стандартных функций ввода-вывода и математических функций .

Далее следует заголовок главной функции программы main, операторы описания типов данных и исполняемые операторы.

При выполнении программы, созданной на языке Си, операционная система компьютера всегда передаёт управление в программу на функцию с именем main. Обычно, хотя это не обязательно, функция main стоит первой в тексте программы. Следующие за именем функции круглые скобки играют важную роль. В них указываются параметры (аргументы), которые передаются в функцию при обращении к ней.

В данном случае операционная система не передаёт в функцию main никаких параметров, поэтому список аргументов в круглых скобках пустой. В фигурные скобки < >заключены описания и операторы, которые обеспечивают вывод на экран компьютера сообщения «Здравствуй, язык Си!».

В общем случае программа содержит несколько функций. Пример программы из нескольких функций:

Функция main может вызывать для выполнения любую другую функцию. Функции function_1, function_2. function_nмогут вызвать любую функцию, кроме функции main. Функцию main нельзя вызывать изнутри программы, она является управляющей.

Директивы #include должны всегда начинаться с новой строки, остальные же операторы программы могут иметь произвольное положение в файле вплоть до записи в одну строку. При записи не допускается разрывать слова, числа, двухсимвольные операции.

Пробелы используются для отделения слов друг от друга и для придания тексту большей выразительности и могут использоваться везде, за исключением случаев, описанных в предыдущем абзаце. Там, где допускается один пробел, можно поставить любое их количество.

В любом месте программы, там, где может стоять пробел, допускается записывать комментарии.

// Это тоже комментарии.

Пара символов //, отмечающих начало однострочного комментария, при выполнении программы игнорируется текст до конца строки, начиная с этих символов.

Комментарии должны помогать понять смысл выполняемых программой действий и являются обязательной ее частью. При написании комментариев следует придерживаться ряда простых истин:

– программы читаются людьми, компьютеру комментарии не нужны;

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

– комментарии должны содержать дополнительную информацию, а не перефразировать программу;

– комментарии должны быть расположены так, чтобы программа не была менее наглядной;

– неправильные комментарии хуже, чем их отсутствие.

Стиль программирования, расположение операторов в строках, использование пробелов, выбор имен переменных и т.д. должны быть направлены на то, чтобы сделать программу более понятной людям, ее читающим.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Найдите 2 минуты и прочитайте про:

Понятие конституционного строя РФ и его основы Каждое государство характеризуется определенными чертами, в которых выражается его специфика.
Алгоритм применения пузыря со льдом I. ПОДГОТОВКА К МАНИПУЛЯЦИИ: 1. Приготовьте оборудование: пузырь для льда.
Классификация вещей 1. В зависимости от возможности участия в гражданском обороте: а) вещи.
Юридическая деятельность: понятие, структура Юридическая деятельность – это волевые действия юристов, основанные на юридическом мышлении.
Алгоритм измерения температуры тела в подмышечной впадине I. Подготовка к процедуре: 1. Приготовить сухой чистый термометр: проверить его целостность.

Источник: studopedia.ru

Презентация, доклад Структура программы на Си. Состав языка. (лекция 1)

Вы можете изучить и скачать доклад-презентацию на тему Структура программы на Си. Состав языка. (лекция 1). Презентация на заданную тему содержит 33 слайдов. Для просмотра воспользуйтесь проигрывателем, если материал оказался полезным для Вас — поделитесь им с друзьями с помощью социальных кнопок и добавьте наш сайт презентаций в закладки!

Презентации » Информатика » Структура программы на Си. Состав языка. (лекция 1)

Лекция 1 Структура программы на СиСостав языка В тексте на любом естественном языке можно выделить четыреПроцесс выполнения программы Для того чтобы выполнить программу, требуется перевестиАлфавит языка С++ В алфавит языка Си входят: прописныеИдентификаторы Идентификатор — это имя программного объекта. В идентификаторе могут использоватьсяКлючевые слова Ключевые слова — это зарезервированные идентификаторы, которые имеют Знаки операций Знак операции — это один или более символов,Простые типы данных Тип данных определяет: внутреннее представление данных в памяти компьютера; множествоК спецификаторам типов относятся: К спецификаторам типов относятся: charСтруктура Си-программы Программа на языке С++ представляет собой одну илиСтруктура Си-программы Программа может состоять из нескольких модулей (исходных файлов) и, как правило,функции ввода/вывода в стиле Си Основные функции ввода/вывода в стиле С: int scanfфункции ввода/вывода в стиле Си++ Та же программа с использованием библиотеки классовСтандартные библиотеки Язык Си имеет богатую поддержку в виде более 450Директивы препроцессора Препроцессором называется первая фаза компилятора. Инструкции препроцессора называются директивами.Директива препроцессора # include Для подключения библиотек используется директиваДиректива препроцессора #define Директива #define определяет подстановку в тексте программы. Она используется дляНекоторые стандартные библиотеки ALLOC.H Описание функций управления памятьюФункция форматного вывода PRINTF Мы уже использовали наиболее употребительную функцию выводаФункция форматного ввода SCANF Для интерактивного режима ввода, вероятно, можно использоватьСтрока формата Строка формата - это строка, которая начинается и заканчиваетсяСтрока формата %f в строке формата - это спецификация формата. ВсеСтрока формата Вы можете задать ширину поля, помещая ее между %Строка формата n в строке не является спецификацией формата, а употребляется Пример Си-программы #include <stdio.h>#include main() < float x1,y1,x2,y2; printf(Другие функции вывода PUTS, PUTCHAR Имеются две другие</p><p>Источник: [mask_link href=

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru