- •Содержание
- •Лабораторная работа №1 Линейные и разветвляющиеся вычислительные процессы
- •Краткие теоретические сведения
- •Алфавит языка с
- •Классификация данных
- •Декларирование объектов
- •Структура программы
- •Функции вывода информации
- •Функции ввода информации
- •Стандартные математические функции
- •Операция присваивания
- •Операторы перехода
- •If (условие ) оператор1;
- •Оператор выбора switch
- •Пример линейного алгоритма
- •Пример использования оператора if
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Циклы типа while и do–while
- •Вложенные циклы
- •Контрольные вопросы
- •Строки, как одномерные массивы символов
- •Примеры использования стандартных функций работы со строками
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа №4 Многомерные массивы, указатели, динамическое распределение памяти
- •Указатели и операции над адресами
- •Операции над указателями (адресная арифметика)
- •Указатели на указатели
- •Таким образом, указатели на указатели – это имена многомерных массивов.
- •Массивы указателей
- •Динамическое размещенея данных
- •Контрольные вопросы
- •Лабораторная работа №5 Функции пользователя
- •Краткие теоретические сведения
- •Область действия переменных
- •Пример работы с функциями Ввести массив NxN (не больше 50) целых чисел и в функции посчитать сумму его положительных значений.
- •Контрольные вопросы
- •Лабораторная работа № 6 Программирование алгоритмов с использованием структур
- •Краткие теоретические сведения
- •Пример на использование структур
- •Контрольные вопросы
- •Лабораторная работа №7 Файлы в языке с.
- •Контрольные вопросы
- •Лабораторная работа №8 Графический режим работы в языке с.
- •Функции для подготовки графической системы
- •Основные функции для получения изображения
- •Контрольные вопросы
- •Команды работы с блоками:
- •Задание опций интегрированной среды.
- •Набор текста программы.
- •Компиляция, редактирование связей, запуск программы на выполнение.
- •Многофайловая компиляция
- •Отладка программы.
- •Использование глобальных переменных, объявленных вне файла.
- •Литература
- •Лабораторный практикум
- •Редактор
- •Белорусский государственный университет
- •Отпечатано на ротапринте бгуир, 22000, Минск, п.Бровки, 6
Контрольные вопросы
Чем функция пользователя отличается от стандартной функции ?
Способы передачи аргументов в функцию?
Поясните понятие “локальные” и “глобальные” переменные?
Для чего и каким образом применяется оператор return ?
Лабораторная работа № 6 Программирование алгоритмов с использованием структур
Цель работы:
Изучить особенности работы с составным типом данных – структуры.
Краткие теоретические сведения
Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется описанием:
struct имя_структуры {
описание элементов;
};
Для выделения памяти под структуру надо определить структурную переменную:
struct имя_структуры имя_переменной;
При определении структур можно задавать начальные значения элементам структур. Для ввода значений элементов структур можно использовать оператор cin>> потокового ввода или оператор ввода scanf.
Над структурами допускаются следующие операции:
1) Взятие адреса структуры. Адрес структуры может быть получен путем применения операции указатель (&) к структурной переменной.
2) Доступ к элементу структуры можно выполнить с помощью операций: точка (.) - прямой доступ или стрелка ( -> ) - доступ по указателю.
Структурная переменная может использоваться так же, как и переменные типов float,int,char и т.д. Например:
struct gr /* имя структуры */
{ char fio[10]; /* элемент структуры */
int est[25]: /* элемент структуры */
int nomer; /* элемент структуры */
} gruppa1; /* имя структурной переменной */
struct gr gruppa2; /* объявление структурной переменной */
Если описатель структуры записан до размещения всех функций в исходном файле, то он будет доступен каждой из функций в этом файле. При определении структурной переменной можно инициалиировать (станавливать значения полям структуры). Например
struct date { int day,month,year;};
d[5]={ { 1,3,1980},
{ 5,1,1990},
{ 1,1,2002}
};
Пример на использование структур
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
struct Spisok {
char Fio[20];
char Grup[10];
int Ot[3];
float S_Bal;
} *sved;
void Vvod(int nom,struct Spisok *sved)
{ cout << "\n Vvedi svedenia " << (nom+1);
cout << "\n FIO - "; gets(sved->Fio);
cout << " Nomer Gr - "; cin >> sved->Grup;
float s=0;
for(int i=0;i<3;i++) {
cout << "\n Otcenki - "; cin >> sved->Ot[i];
s+=sved->Ot[i];
}
sved->S_Bal=s/3.;
return; }
void main(void)
{ struct Spisok Stud[50]; int i,N; char Bukva;
clrscr();
cout << "\n Vvedi kol-vo < 50 "; cin >> N;
for(i=0;i<N;i++) Vvod(i,&Stud[i]);
cout << "\n Spisok Students";
for(i=0;i<N;i++)
printf("\n %20s %10s %4.2f",Stud[i].Fio,Stud[i].Grup,Stud[i].S_Bal);
cout << "\n Poisk FIO (bukva) "; cin >> Bukva;
cout << "\n Sveden Students";
int kod_p=0;
for(i=0;i<N;i++)
if(Stud[i].Fio[0]==Bukva){ kod_p=1;
printf("\n %20s %10s %4.2f",Stud[i].Fio,Stud[i].Grup,Stud[i].S_Bal); }
if(kod_p==0) cout << " Takix HET!";
cout << "\n Poisk zapisi";
Vvod(-1,sved);
kod_p=0;
for(i=0;i<N;i++)
if(memcmp(sved,&Stud[i],sizeof(sved))==0) { kod_p=1;
printf("\n Poisk \n %20s %10s",Stud[i].Fio,Stud[i].Grup); }
if(kod_p==0) cout << " Takix HET!";
getch();
}
Язык Си допускает использовать в структурах особый тип полей - битовых. Поле битов - это группа соседних (двоичных) разрядов ( бит), расположенных в области памяти переменной целого типа.
Целесообразно использование полей бит тогда, когда для хранения информации в структуре данных достаточно несколько бит.
Синтаксис описания битового поля :
тип[имя]:ширина;
Элементами структуры могут быть одна или несколько структурных переменных. Рассмотрим примеры программ работы со структурами.
ПРИМЕР 1
/* Программа демонстрирует передачу в функцию sum */
/* элементов avans и zarp структуры st */
#include <conio.h>
#include <stdio.h>
#define k 2
#define PE printf("\n ..СУММА АВАНСА ЗА %d МЕСЯЦА......",k);
#define PE1 printf("\n===================================");
#define PE2 printf("\n");
struct fund{
char *mes_avans;
float avans;
char *mes_zarp;
float zarp;
};
main()
{
static struct fund st={"АВГУСТ",
600000,
"ОКТЯБРЬ",
900000
};
float sum(),res;
res=sum(st.avans,st.zarp);
printf(" \n Oбщая сумма равна %8.2f руб.",res);
PE2;PE1;getch();
}
float sum(x,y)
float x,y;
{
clrscr();PE;PE1;PE2;
return(x+y);
}
ПРИМЕР 2
/* Программа демонстрирует передачу в функцию пользователя sum * /
/* АДРЕСА структуры str */
/* адрес структуры str передается с помощью операции указатель */
/* у функции sum - один параметр, который описан как указатель * /
/* на структуру с шаблоном spis. При обращении к функции sum */
/* происходит присвоение значения адреса структурной переменной */
/* str, и с помощью указателя t можно обращаться к элементам */
/* структуры типа spis, например : t->vans и t->za */
#include <stdio.h>
#include <conio.h>
struct spis{
char *s_vans;
float vans;
char *s_za;
float za;
};
main()
{
static struct spis str={"сентябрь",
600,
"октябрь",
1000
};
float sum(),res;
res=sum(&str);
printf(" общее количество экземпляров=%8.0f штук",res);
getch();
}
float sum(t)
struct spis *t;
{ clrscr();
return(t->vans+t->za);
}
ПРИМЕР 3
/* Программа демонстрирует передачу в функцию sum */
/* АДРЕСА МАССИВА структур */
/* стартовый адрес массива структур st помещается в переменную */
/* типа указатель m. Теперь в функции sum известен начальный */
/* адрес массива структур. Зная этот адрес , можно обратиться */
/* к элементам самой первой структуры, используя операцию -> */
/* Это элементы m->avans и m->zarp. Для того, чтобы получить адрес */
/* следующей структуры, надо увеличить переменную-указатель на 1, */
/* что и делается при вычислении третьего выражения в цикле for */
#include <stdio.h>
#include <conio.h>
struct fund{
char *mes_avans;
float avans;
char *mes_zarp;
float zarp;
};
main()
{
static struct fund st[2]={{"сентябрь",
500000,
"октябрь",
700000
},
{"ноябрь",
600000,
"декабрь",
800000
}
};
float sum();
printf(" общая сумма= %8.3f ",sum(st));
getch();
}
float sum(m)
struct fund *m;
{
float res;
int i; clrscr();
for(i=0,res=0;i<2;i++,m++)
res+=m->avans+m->zarp;
return(res);
}
ПРИМЕР 4.
Вести сведения о студентах учебной группы, каждый элемент массива студенческой группы содержит:
а) фамилию и имя;
в) итоги сдачи экзамена по программированию.
Программа выводит информацию остуденте по его порядковому номеру в списке группы(индекс массива, содержащего введенную информацию)
Текст С-программы может иметь вид:
#include <stdio.h>
#include <conio.h>
struct student
{
char fio[10]; // поле для ФИО студента
int est1; // поле для оценки
} gruppa[25]; // массив для списка группы
void main(void)
{
int i,j,k,priznak;
clrscr();
printf("\n Формирование списка до 25 человек");
/*------Формирование списка----------*/
for (i=1;i<=25;i++)
{
printf("\n Введите сведения о студенте %d и\
\n признак режима работы программы (0-окончить ввод )\
\n",i);
printf("\n Фамилия и инициалы: ");
fflush(stdin); // функция очистки буфера ввода
gets(gruppa[i].fio);
printf("\n Введите оценкy по программированию: ");
fflush(stdin);
scanf("%d",&gruppa[i].est1);
k=i; // запоминаем текущий номер введенной
// информации
printf(" \n Признак? ");
scanf("%d",&priznak);
k=i;
if(!priznak)break;
}
/*---------Просмотр списка------------*/
for (i=0; i<25; i++)
{
printf("\n Сведения о каком студенте?\n");
scanf("%d",&j);
if(j>k)
{
printf("\n НЕТ СВЕДЕНИЙ! ");
continue; // в случае отсутствия информации
} // переход на следующий шаг цикла
printf(" \n СТУДЕНТ: %s \n",gruppa[j].fio);
printf(" \n ВЕСЕННЯЯ СЕССИЯ, ОЦЕНКА\
по ПРОГРАММИРОВАНИЮ: %d",gruppa[j].est1);
printf("\n Признак? ");
scanf("%d",&priznak);
if(!priznak)break;
}
puts("\n РАБОТА ПРОГРАММЫ ЗАВЕРШЕНА! Press any key...");
getch();
}
Варианты индивидуальных заданий
В программах предусмотреть ввод исходной информации о четырех студентах
- фамилия и инициалы;
- год рождения;
- год поступления в БГУИР;
- оценки за первый семестр:
- физика;
- высшая математика;
- информатика;
1. Распечатать список студентов, упорядоченный по алфавиту.
2. Распечатать список студентов. упорядоченный по году рождения.
3. Распечатать список студентов-отличников. упорядоченный по году поступления.
4. Распечатать анкетные данные студентов. сдавших сессию на 4 и 5.
5. Распечатать список студентов. фамилии которых начинаются с буквы Б и их оценки по всем предметам.
6. Распечатать анкетные данные отличников.
7. Распечатать список студентов, фамилии которых начинаются с буквы А и их даты рождения.
8. Распечатать анкетные данные студентов, имеющих оценку 3 в сессию.
9. Распечатать список студентов и их оценки. Фамилии студентов начинаются с букв В и Г.
10. Распечатать фамилии и даты рождения студентов, не имеющих оценок 3.
11. Вычислить общий средний балл всех студентов и распечатать список студентов со средними баллами выше общего среднего балла.
12. Вычислить общий средний балл всех студентов и распечатать список студентов, имеющих средний балл ,равный общему среднему баллу.
13. Распечатать анкетные данные студентов, имеющих оценку 2.
14. Распечатать анкетные данные студентов, имеющих оценку 5 по информатике.
15. Распечатать анкетные данные студентов, имеющих оценку 4 по физике и оценку 5 по высшей математике.
16. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L кратна 2-м, то удаляются все числа, которые делятся на 2.
17. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L четная, то удаляются 2 первых и 2 последних символа.
18. Выяснить, имеются ли среди символов S1...Sn некоторой строки все буквы, входящие в слово DOS.
19. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L нечетная, то удаляется символ, стоящий посередине строки.
20. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Составить программу для замены в строке длиной К символов каждого второго символа ! на $.
21. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Составить программу для замены в строке длиной К символов всех пробелов на символ $.
22. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L >10, то удаляются все цифры.
23. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L кратна числу 3, то удаляются все числа, делящиеся на число 3.
24. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L кратна числу 5, то подсчитывается количество скобок всех видов.
25. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L кратна числу 4, то первая часть строки меняется местами со второй.
26. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L=10, то удаляются все A..Z.
27. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L >15, то удаляются все a..z.
28. В строке символов поменять местами символы на четных и нечетных позициях.
29. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L >6-и, то выделяется подстрока { } скобках.
30. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L >5-и, то выделяется подстрока до первого пробела.