Главная » Все файлы » Просмотр файлов из архивов » Документы » Краткий конспект семинарских занятий по языку C - Н.Д. Васюкова_ И.В. Машечкин_ В.В.Тюляева_ Е.М.Шляховая

Краткий конспект семинарских занятий по языку C - Н.Д. Васюкова_ И.В. Машечкин_ В.В.Тюляева_ Е.М.Шляховая, страница 2

2019-05-08СтудИзба

Описание файла

Документ из архива "Краткий конспект семинарских занятий по языку C - Н.Д. Васюкова_ И.В. Машечкин_ В.В.Тюляева_ Е.М.Шляховая", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Онлайн просмотр документа "Краткий конспект семинарских занятий по языку C - Н.Д. Васюкова_ И.В. Машечкин_ В.В.Тюляева_ Е.М.Шляховая"

Текст 2 страницы из документа "Краткий конспект семинарских занятий по языку C - Н.Д. Васюкова_ И.В. Машечкин_ В.В.Тюляева_ Е.М.Шляховая"

x=y=z=1;

k=++x && ++y || ++z;

  1. Как будет вычисляться выражение z=x+++y ?

  2. Какое значение примет переменная k?

int k;

k=~(~0<<2);

  1. Определить значение выражения и тип результата.
    а) -3*4L-6/5;

б) (7+6)%5/2;

  1. Какие значения примут целочисленные переменные x,y,z после выполнения следующих операторов:

x=3; y=3; z=1;

z+=x<y?x++;y++;

  1. Реализовать эффективное умножение и деление переменной x на 16, используя операции поразрядного сдвига (указать возможный тип переменной x и диапазон ее начальных значений для корректного выполнения операции).

  2. Используя тернарную операцию, присвоить z наименьшее из значений a, b и c.

  3. int x;

Инвертировать 3 бита переменной x, начиная 5-го, а остальные биты оставить без изменения.

  1. int z;

Обнулить в z все разряды, кроме 5 младших, а в 3 младших разрядах установить 1.

ТЕМА 2. Операторы управления: if, switch, while, do while, for, break, continue. Простейшие функции ввода/вывода: getchar, putchar, printf.

Программа на языке Си состоит из набора функций, одна из которых является главной, называется main и запускается системой первой. Функции состоят из операторов. Выражение становится оператором, если за ним идет точка с запятой. Точка с запятой заканчивает любой оператор, кроме составного оператора { }1 Например: x=0 операция присваивания, а x=0; оператор присваивания. Кроме операторов присваивания в языке Си присутствуют операторы управления.

Условный оператор if-else.

Условный оператор применяется для принятия решения в некоторый момент выполнения программы.

if(<выражение>)<оператор1>[else<оператор2>]

Если выражение истинно, то выполняется оператор1, в противном случае оператор2.Часть else может отсутствовать.

if(a>b) z=a; else z=b;

Если в одной из веток необходимо выполнить несколько операторов, используется составной оператор { }.

Примечание. После правой фигурной скобки точка с запятой не ставится2.

Во вложенных операторах if действует правило: else всегда относится к ближайшему незакрытому оператору if. Для изменения этого порядка выполнения операторов обычно используют составной оператор.

Задача 1. Ввести из стандартного входного потока один символ и, если это цифра, то присвоить целой переменной k нулевое значение, если введенный символ окажется буквой a, то k присвоить значение один, во всех остальных случаях переменной k присвоить значение два.

... int c,k;

c=getchar();

if(c>=’0’ && c<=’9’) k=0;

else if(c==’a’) k=1;

else k=2;

Переключатель switch.

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

switch(<выражение>) {

case <константное выражение 1>: <оп1>...<опN>

[break;]

. . .

case <константное выражение M>: <оп1>...<опN>

[break;]

[default: <оп1> . . . <опN>]

}

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

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

Далее приводится решение задачи 1 с помощью переключателя.

... int c,k;

switch(c=getchar()) {

case ‘0’:

case ‘1’:

case ‘2’:

case ‘3’:

case ‘4’:

case ‘5’:

case ‘6’:

case ‘7’:

case ‘8’:

case ‘9’: k=0; break;

case ‘a’: k=1; break;

default: k=2;

}

Операторы цикла while и do-while.

В операторе цикла с предусловием:

while (<выражение>) <оператор>

и операторе цикла с постусловием:

do <оператор> while(<выражение>);

тело цикла выполняется до тех пор, пока выражение истинно. Если в цикле необходимо выполнить несколько операторов, используется составной оператор {}.

Задача 2. Из стандартного входного потока ввести строку и записать ее в массив str. Длина строки не превышает 80 символов.

... int c,i;

char str[80];

i=0;

while((c=getchar())!=’\n’) str[i++]=c;

str[i]=’\0’;

Оператор цикла for.

Оператор цикла for состоит из заголовка и тела цикла.

for([<выражение1>];[<выражение2>];[<выражение3>])

<оператор>

Оператор тела цикла выполняется до тех пор, пока выражение2 истинно. При отсутствии выражение2 считается истинным. Выражение1 обычно содержит начальные присваивания, а выражение3 - изменение значения параметра цикла на каждой итерации. В этих выражениях часто используют операцию "," (запятая). Алгоритм выполнения цикла for выглядит следующим образом:

< выражение1>;

while(<выражение2>) { <оператор> <выражение3>; }

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

...int m[10], i;

for(i=0;i<10;i++) m[i]=0;

В вырожденном случае все выражения и оператор тела цикла могут отсутствовать. Например: for(;;); - это бесконечный цикл.

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

...int m[10], i;

for(i=0;i<10;m[i++]=0);

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

Задача 3. Определить длину строки. Нулевой байт не считать.

...char s[100];

int len, i;

for(i=0;s[i];i++);

len=i;

Задача 4. Удалить из строки все пробелы.

...char s[100];

int i, j;

for(i=0,j=0;s[i];i++)

if(s[i]!=’ ‘) s[j++]=s[i];

s[j]=’\0’;

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

#include <stdio.h>

main()

{ int c, m[256]={0}, i, j, max;

while((c=getchar())!=’\n’) m[c]++;

for(i=1,max=m[0];i<256;i++)

if(max<m[i]) max=m[i];

for(i=0;i<256;i++)

if(m[i]){

printf(“%c”,i);

for(j=0;j<80*m[i]/max;j++) putchar(‘*’);

putchar(‘\n’);

}

}

Операторы break и continue.

Оператор break; вызывает немедленный выход из тела цикла или из переключателя switch.

Оператор continue; вызывает немедленный переход к следующей итерации цикла (while, do-while или for).

Задачи.

  1. #define MAXLEN 256

char str[MAXLEN];

int i;

Пусть в символьный массив str записана строка, длина которой меньше MAXLEN.

    1. Реверсировать строку, не используя дополнительных массивов.

    2. char str1[MAXLEN];

Копировать строку str в str1.

    1. Преобразовать строку в целое.

    2. Целое число, записанное в переменной i, преобразовать в строку.

  1. Входной поток состоит из слов. Длина слова не превышает 80 символов. Разделители между словами: пробел, запятая, конец строки.

    1. Распечатать входной поток по одному слову в строке.

    2. Распечатать размер самой длинной строки.

    3. Распечатать самую длинную строку.

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

  3. Ввести строку из стандартного входного потока в массив типа char, удалить из строки комментарии. (/* . . . */) Дополнительные массивы не использовать.

  4. Написать машинно-независимую программу, обнуляющую каждую четную двоичную единицу в числе типа int.

  5. Написать машинно-независимую программу, транспонирующую двоичный код целого.

ТЕМА 3. Понятие указателя. Работа с адресами. Указатели и массивы.

Одной из отличительных особенностей языка Си является возможность использования в программах указателей. Указателем является переменная, значение которой есть адрес3 некоторой области памяти Си - программы. Указатель может ссылаться на переменные определенного типа и функции.

Например:

char c, *p;

где c – это переменная символьного типа, а p – это указатель на объекты символьного типа. Указатель p может содержать адрес любого объекта символьного типа.

Унарная операция & - это операция взятия адреса объекта, например: p=&c; а унарная операция * - это операция косвенной адресации (или раскрытия ссылки). Например, оператор *p=’a’; интерпретируется следующим образом: объекту, на который ссылается указатель p, присвоить значение, равное коду символа 'а'.

При увеличении значения указателя на единицу на самом деле адрес увеличивается на размер объекта. Например:

double x=1.5,y=7.1,*dp;

dp=&x;

dp++;

y=*dp-3;

Для примера будем считать, что переменные x и y размещены в памяти рядом (подавляющее большинство компиляторов разместит их рядом, но в стандарте языка Си это не зафиксировано), тогда после операции dp++, значение указателя dp увеличится на sizeof(double) и он будет указывать уже на переменную y. В следующем операторе присваивания значение переменной y уменьшится на три.

Примечание. Унарные операторы * и & имеют более высокий приоритет, чем арифметические операторы, и одинаковый приоритет с унарными операторами ++ и -- . Выражение *p++ интерпретируется следующим образом: взять значение по адресу, хранящемуся в указателе p, а затем увеличить адрес в p на размер объекта, на который ссылается указатель. Операции * и ++ имеют одинаковый приоритет, но выполняются справа налево. Поэтому сначала будет выполнена постфиксная операция p++, но при этом увеличение значения адреса будет отложено до окончания вычисления всего выражения. Аналогично, в случае *--p адрес в p уменьшится прежде, чем по этому указателю будет получено число, т.к. здесь -- - префиксная операция.

В языке Си можно также определить указатель на неопределенный тип:

void *vp;

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

int *ip, k;

void vp;

ip=&k;

vp=ip; // Правильно

ip=vp; // Неправильно

ip=(int*)vp; // Правильно

Над указателем типа void* нельзя выполнять операцию косвенной адресации без явного приведения типа.

k+=*(int*)vp; // Правильно

(int*)vp++; // Неправильно

((int*)vp)++; // Правильно

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

double m[10], *dp;

Чтобы присвоить указателю dp адрес начала массива m, можно написать dp=m; или dp=&m[0]; что эквивалентно. Увеличение значения указателя на единицу приводит к следующему элементу массива.

dp=m; - адрес m[0]

dp+1 - адрес m[1]

dp+i - адрес m[i]

*(dp+i) - m[i]

m++; /* ошибка, константный указатель

изменять нельзя */

Задача1. В вещественном массиве найти максимальное значение.

double m[100], *p, max;

. . .

for( p=m+1,max=*m;p<m+100;p++)

if(max<*p) max=*p;

Указатели можно присваивать, сравнивать, вычитать и складывать с целыми числами.

Задача 2. Определить длину строки.

char str[100],*p, len;

. . .

p=str;

while(*p) p++;

len=p-str;

Задача 3. Скопировать строку s в t.

char s[100], t[100], *p1, *p2;

. . .

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5259
Авторов
на СтудИзбе
420
Средний доход
с одного платного файла
Обучение Подробнее