Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке Си. Учебно-методическое пособие

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
41
Последовательность вызовов этой функции разбивают строку string на лексемы, которые представляют собой последовательности символов, разделенных символами разделителями, представленными в параметре delim. При первом вызове функция принимает строку string в качестве аргумента, чей
первый символ используется в качестве начальной точки для поиска лексем.
При последующих вызовах функция ожидает нулевого указателя и использует позицию сразу после окончания последней лексемы как новую позицию для продолжения сканирования. Изменяет исходную строку – конечный маркер
автоматически заменяется нулевым символом. Возвращается пустой указатель,
если нет найденных лексем.
char *pch; pch = strtok (st, “ .,!”);
массив строк
Пример:
char s[3][80]; for(i=0;i<3;i++) sprintf(s[i],"task%d",i+1); //в отличие от printf sprintf выводит в строку for(i=0;i<3;i++) printf("%s\n",s[i]);
char s[][3]={"t1","t2","t3"};
Примеры алгоритмов обработки строк.
1. Удалить из строки лишние пробелы
for(j=i=0; i<=strlen(st); i++) { while(st[i]==' ' && st[i+1] == ' ') i++; st2[j++]=st[i]; } printf("%s\n",st2);
2. Найти в строке слова, начинающиеся с H
main (){ int n,i=1; char st[] = " Hello1 Word jHehe He2 Hello3 My One My Hel4 "; do{ if(st[i-1]==' ' && st[i]=='H') { while(st[i]!=' ') printf("%c",st[i++]); printf("\n"); } i++; }while(i<strlen(st)); }
42
3. Подсчитать количество встреч слов в строке, отсортировать по алфавиту слова в строке (слова разделяются пробелом)
int main(){ char st[] = "Hello Word Hello Hello My", ms[20][80], st2[80]; int i,j,n,t, m[20]; for(i=j=n=0; st[i]; i++) { //разбиение строки на слова и копирование их в массив //слов if (st[i]==' ' && st[i+1]!=' ') { ms[n][j]=0; j=0; n++; } else ms[n][j++]=st[i]; } ms[n++][j]=0;
for(i=0; i<n; i++) { printf("%s\n",ms[i]); m[i]=1; } printf("\n"); for(i=0; i<n; i++) // подсчет количества одинаковых слов if (m[i]) for(j=i+1; j<n;j++) if(strcmp(ms[i],ms[j])==0) {m[i]++; m[j]=0; }
for(i=0; i<n; i++) { if(m[i])printf("%s %d\n",ms[i],m[i]); } printf("\n");
for(i=0;i<n-1;i++) { //сортировка t=i; for(j=i+1; j<n; j++) if(strcmp(ms[t],ms[j])>0) t=j; strcpy(st2,ms[i]); strcpy(ms[i],ms[t]);strcpy(ms[t],st2); } for(i=0; i<n; i++) printf("%s\n",ms[i]); }
43
4. Пример сортировки с помощью индексного массива
for(i=0;i<n;i++) m[i]=i; for(i=0;i<n-1;i++) { t=i; for(j=i+1; j<n; j++) if(strcmp(ms[m[t]],ms[m[j]])>0) t=j; k=m[t]; m[t]=m[i];m[i]=k; } for(i=0; i<n; i++) printf("%s\n",ms[m[i]]); printf("\n");
5. пример разделения на строки на слова с помощью функции strtok
char st[] = "Hello, Word. Hello Hello! My Word"; char raz[] = " !,."; char *pch; pch = strtok (st, raz); while (pch != NULL) { strcpy(ms[n++],pch); //ms[n++]=pch; printf ("%s\n", pch); pch = strtok (NULL, raz); }
Контрольные вопросы
Инициализация символов и строк. Что является признаком окончания строки? Ввод и вывод символов и строк. Основные стандартные функции обработки строк.
44
6. Текстовый и графический режим
Текстовый режим, создание меню.
Можно использовать библиотеку altconio.h которая включает в себя функции:
gotoxy(x,y); – перевод курсора в заданное место экрана; settextcolor(color_text, color_bg); – установка цвета символов и цвета фона.
При считывании с пофощью функции getch() клавиши со стрелками и функциональные клавиши возвращают код из двух частей. Первый раз – 0 (224 для стрелок в dev-cpp и 0 для цифровой клавиатуры).
По окончании работы программы значение переменной i будет равно номеру выбранного пункта меню.
#include <stdio.h> #include <conio.h> #include "altconio.h"
main() { int ch,i,n; for(i=1;i<=5;i++) { if(i==1) settextcolor (12,8); else settextcolor (15,0); gotoxy(35,9+i); printf("Task %i",i); } i=1; do{ ch=_getch(); gotoxy(35,9+i); settextcolor (15,0); printf("Task %i",i); if(ch==72) i--; if(ch==80) i++; if(i>5)i=1; if(i<1) i=5; gotoxy(35,9+i); settextcolor (12,8); printf("Task %i",i); }while(ch!=13); gotoxy(35,20); settextcolor (15,0); printf("Task %i",i); _getch(); }
Графический режим
В технике и компьютерной графике чаще всего используют
прямоугольный растр, в котором пиксели составляют прямоугольную
45
матрицу. Размер сетки растра, задаваемый в виде N1*N2, где N1 – число пикселей по горизонтали, N2 – число пикселей по вертикали. Это называется разрешающей способностью (или графическим разрешением) экрана.
Количество бит, используемых для кодирования цвета одного пикселя,
называется глубиной цвета (битовой глубиной, цветовым разрешением).
От глубины цвета зависит количество отображаемых цветов, которое
может быть определено как:
M=2k, где M – количество отображаемых цветов, k – глубина цвета.
Соответственно получаем количество цветов 2 – 1 бит на пиксель, 4 – 2
бита, 16 – 4 бита, 256 – 8 бит, HiColor 64к –16 бит, TrueColor 16м – 24 бита. Схема RGB – цвет пикселя задается как сумма RGB (красного зеленого и синего) цветов. RGB значения, как правило, представляются 1 байтом каждый. Таким образом, если R=0, G=255, B=255, то результирующий цвет будет голубой. Если используется цветовая схема с количеством цветов 256 и менее, необходимые цвета хранятся в палитре – таблице цветов, используемой в конкретном растре.
Для 16 стандартных цветов заданы числовое и символьное обозначения:
0 BLACK черный 8 DARKGRAY темно-серый 1 BLUE синий 9 LIGHTBLUE светло-синий 2 GREEN зеленый 10 LIGHTGREEN светло-зеленый 3 CYAN морской волны 11 LIGHTCYAN светлый морской волны 4 RED красный 12 LIGHTRED светло-красный 5 MAGENTA фиолетовый 13 LIGHTMAGENTA светло-фиолетовый 6 BROWN коричневый 14 YELLOW желтый 7 LIGHTGRAY светло-серый 15 WHITE белый
Пример программы, использующей графическую библиотеку <graphics.h>
#include <graphics.h> #include <conio.h> main() { initwindow ( 800, 600 ); // создание графического окна заданного размера. setcolor(3); line (100,100,200,200); getch(); closegraph(); }
46
Основные графические функции
setcolor(color); установка цвета линий setbkcolor(color); установка цвета фона cleardevice(); очистка графического экрана closegraph(); закрытие графического окна putpixel ( x, y, color ); вывод пикселя line ( x1, y1, x2, y2 ); вывод линии moveto ( x1, y1 ); перевод графического курсора lineto ( x2, y2 ); линия в заданные координаты rectangle (x1, y1, x2, y2); прямоугольник bar (x1, y1, x2, y2); закрашенный прямоугольник circle (x,y,r); окружность floodfill (x, y, border_color); заливка области setfillstyle ( style, color ); установка стилями цвета заливки 0 – отключить заливку 1 – сплошная заливка 3,4,5,6 – наклонные линии 7,8 – сетка 9,10,11 – точечные узоры outtextxy ( x, y, "строка" ); вывод строки в графическом режиме settextstyle(font,dir,size); установка стиля вывода символов setlinestyle(style,P,t); установка стиля линий style – 0 – спл, 1 – пункт, 2 – пункт-тире, 3 – тире, 4 – пользователя t – толщина линии p – шаблон (2 байта) пример – 0xFFF0
Пример: вывод на экран звезд различного цвета
#include <graphics.h> #include <conio.h> #include <math.h> #define N 100 #define M 700 const float k=144*3.14159268/180; void star(int x, int y, int r, int c){ setcolor(c); moveto(x,y-r); for(int j=1; j<=5; j++ ) lineto(x+sin(j*k)*r,y-cos(j*k)*r); } main() { int x[N],y[N],r[N];
47
initwindow(M, M); do{ for(int i=0; i<N;i++) { // вывод звезд r[i]=rand()%25+5; x[i]=rand()%(M-50)+25; y[i]=rand()%(M-50)+25; star(x[i],y[i],r[i],rand()%15+1); delay(30); } for(int i=0; i<N;i++) { //стирание звезд star(x[i],y[i],r[i],0); delay(30); } }while(!kbhit()); //цикл до нажатия любой клавиши getch(); closegraph(); }
Пример: построение графика y=sin(x) на отрезке от -20 до 20. Для перевода значения в координату – kx=RX*(x-xmin)/(xmax-xmin) RX-разрешение по x, x – аргумент, kx – координата по X.
ky=RY-RY*(y-ymin)/(ymax-ymin); RY-разрешение по y, y – значение функции, ky – координата по Y.
#include <graphics.h> #include <conio.h> #include <math.h> #define X(x) (800*(x-xmin)/(xmax-xmin)+25) #define Y(y) (600-600*(y-ymin)/(ymax-ymin)+25) #define F(x) (x*sin(x)) main(){ float x, y, xmin=-20, xmax=20, ymin, ymax; initwindow (850, 660); x=xmin; y=F(x); ymin=ymax=y; for(x=xmin;x<=xmax; x+=0.1) { y=F(x); if(y>ymax) ymax=y; if(y<ymin) ymin=y; } line(X(xmin),Y(0),X(xmax),Y(0)); line(X(0),Y(ymin),X(0),Y(ymax));
48
settextstyle(4,0,3); outtextxy(X(0),Y(ymax),"Y"); outtextxy(X(xmax)-20,Y(0),"X"); outtextxy(X(xmin)+20, Y(ymax),"y=sin(x)");
setcolor(12); x=xmin; y=F(x); moveto(X(x),Y(y)); for(x=xmin;x<=xmax; x+=0.1) { y=F(x); lineto(X(x),Y(y)); } getch(); }
Перемещение изображения по экрану
Можно использовать функции
putimage(x1,y1,x2,y2,m) – копирование области экрана в буфер getimage(x1,y1,m,b) – вывод на экран из буфера b – 0 move 1 – xor 2 – or 3 – and 4 - not
Размер буфера n=imagesize(0,0,49,49); (4 байта на пиксель +24 служебные байта) kbhit() – определяет, нажата ли какая-либо клавиша, не приостанавливает программу
Пример программы, перемещающий графический объект по диагонали экрана до нажатия любой клавиши.
#include <graphics.h> #include <stdio.h> main(){ int m[5006]; //буферный массив int n, d=5,x,y; initwindow ( 800, 800 ); circle(25,25,20); getimage(0,0,49,49,m); for(x=y=0; !kbhit(); x+=d, y+=d) { putimage(x,y,m,0); delay(10); putimage(x,y,m,1); if(x>700) d=-5; if(x<50) d=5;
49
} closegraph(); } Пример управления объектом с помощью клавиатуры #include <graphics.h> #include <stdio.h> main(){ int m[5006]; int n, d=5,x,y,ch; initwindow ( 800, 600 ); setcolor(14); circle(25,25,20); getimage(0,0,49,49,m); x=y=0; do { ch=getch(); putimage(x,y,m,1); if(ch==72) y-=5; if(ch==80) y+=5; if(ch==75) x-=5; if(ch==77) x+=5; putimage(x,y,m,1); }while (ch!=13); closegraph(); }
Пример изменения направления движения с помощью клавиатуры
#include <graphics.h> #include <stdio.h> main(){ int x,y,ch, dx=3, dy=2; int m[3606]; initwindow (800, 800); setcolor(14); setfillstyle(1,14); circle(30,30,25); floodfill(30,30,14); getimage(0,0,59,59,m); putimage(0,0,m,1); x=y=400; do { putimage(x,y,m,1); delay(15); putimage(x,y,m,1); x+=dx; y+=dy;
50
if (kbhit()) { ch=getch(); if(ch==72) dy--; if(ch==80) dy++; if(ch==75) dx--; if(ch==77) dx++; } if(x>740) dx=-abs(dx); if(x<0) dx=abs(dx); if(y>740) dy=-abs(dy); if(y<0) dy=abs(dy); }while (ch!=13); closegraph(); }
Контрольные вопросы
Каковы особенности работы с графическим окном? Как задать цвет пикселя? Как задать цвет линий? Как задать стиль заливки? Как залить ограниченную область заданным цветом? Как вывести текст в нужном месте экрана?
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]