- •Лабораторный практикум
- •Основы программирования на алгоритмическом языке с
- •Лабораторная работа №1 Линейные и разветвляющиеся вычислительные процессы
- •Краткие теоретические сведения
- •Алфавит языка с
- •Классификация данных
- •Декларирование объектов
- •Структура программы
- •Функции вывода информации
- •Функции ввода информации
- •Стандартные математические функции
- •Операция присваивания
- •Операторы перехода
- •If (условие ) оператор1;
- •Оператор выбора switch
- •Пример линейного алгоритма
- •Пример использования оператора if
- •Варианты индивидуальных заданий
- •Оператор цикла for
- •For (выражение_1; выражение_2; выражение_3 ) оператор;
- •Циклы типа while и do–while
- •Вложенные циклы
- •Контрольные вопросы
- •Лабораторная работа № 3 Программирование циклических вычислительных процессов с использованием одномерных массивов и строк
- •Краткие теретические сведения
- •Строки, как одномерные массивы символов
- •Примеры использования стандартных функций работы со строками
- •Варианты индивидуальных заданий
- •Указатели и операции над адресами
- •Операции над указателями (адресная арифметика)
- •Указатели на указатели
- •Таким образом, указатели на указатели – это имена многомерных массивов.
- •Массивы указателей
- •Динамическое размещенея данных
- •Контрольные вопросы
- •Лабораторная работа №5 Функции пользователя
- •Краткие теоретические сведения
- •Область действия переменных
- •Пример работы с функциями Ввести массив NxN (не больше 50) целых чисел и в функции посчитать сумму его положительных значений.
- •Пример на использование структур
- •Контрольные вопросы
- •Лабораторная работа №7 Файлы в языке с.
- •Контрольные вопросы
- •Лабораторная работа №8 Графический режим работы в языке с.
- •Функции для подготовки графической системы
- •Основные функции для получения изображения
- •Контрольные вопросы
- •Команды работы с блоками:
- •Задание опций интегрированной среды.
- •Набор текста программы.
- •Компиляция, редактирование связей, запуск программы на выполнение.
- •Многофайловая компиляция
- •Отладка программы.
- •Использование глобальных переменных, объявленных вне файла.
- •Литература
Пример на использование структур
#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-и, то выделяется подстрока до первого пробела.