Лекция 4 2017 Строки, массивы, структуры (Лекции (2017))
Описание файла
Файл "Лекция 4 2017 Строки, массивы, структуры" внутри архива находится в следующих папках: Лекции 2017, Лекции 2017. PDF-файл из архива "Лекции (2017)", который расположен в категории "". Всё это находится в предмете "программирование" из 2 семестр, которые можно найти в файловом архиве НГУ. Не смотря на прямую связь этого архива с НГУ, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Лекция №4Еще кое что просимволы и строкиПреобразование символов (ASCII)Особенности ввода строкСтруктуры данныхCоздание пользовательских типовданныхРазработка программМетод «сверху-вниз»ЛитератураКурс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Символьный тип данныхВ вычислительных машинах символы не могут хранитьсяиначе, как в виде последовательностей бит (как и числа).сhar – тип данныхВ языке Си размер типа равен одному байтуvoid main(){char a;for(a = 65; a < 91; a++)printf("%d\t", a);}void main(){char a;for(a = 65; a < 91; a++)printf("%c\t", a);}Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Таблица кодировки ASCIIASCII (American standard code for informationinterchange)название таблицы (кодировки, набора), вкоторой некоторым распространённымпечатным и непечатным символамсопоставлены числовые коды.Таблица была стандартизована в 1963 г.Таблица ASCII определяет коды для:• десятичных цифр;• латинского алфавита;• национального алфавита;• знаков препинания;• управляющих символов.Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Таблица кодировки ASCII[0-127]• Последовательное размещениецифр[48 – 57]• Последовательное размещениезаглавных букв[65 – 90]• Последовательное размещениепрописных букв[97 – 122]• ((int)'a' - (int)'A') = 32void main(){char ch;scanf("%c", &ch);if(ch >=97 && ch <= 122)ch = ch - 32;printf("%c", ch);}void main(){char ch;scanf("%c", &ch);if(ch >='a' && ch <= 'z')ch -= ('a' - 'A');printf("%c", ch);}Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Строки в Сиprintf("Hello World");Строка в Си – одномерный массив символов(*)void main(){int i;char str[] = "Hello World";for(i = 0; i < 11; i++)printf("%c", str[i]);}Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Строки в Сиvoid main(){char str[] = "Hello World";printf("%d", sizeof(str));}нуль-символ '\0'при объявлении строковой константынуль-символ добавляется автоматическиvoid main(){char str[] = "Hello World";printf("%s", str);}Автоматический контрольокончания строки:вывод происходит до символа ‘\0’Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Ввод и вывод строк в Си(*) Строка в языке Си – одномерный массив символов,заканчивающийся ‘\0’%s – спецификатор работы со строками при вводе и выводе в языке Сиvoid main(){char str[80];scanf("%s", str);printf("%s", str);}Контроль размера массиваколичество элементов всегда должно быть большеколичества хранящихся символовКурс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Присвоение значений строкам в Си••char str[] = "Hello World";char str[12] = "Hello World";Автоматическое вычисление размера массиваАвтоматическое добавление ‘\0’••Автоматическое добавление ‘\0’ (*)отсутствие контроля корректности размераvoid main(){char str[10] = "Hello World";printf("%s", str);}void main(){char str[3];str[0] = 'H';str[1] = 'i';str[2] = '\0';printf("%s", str);}•Ручной контрольКурс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Работа со строкам в Си• Подсчет количествасимволов в строкеint Count(char* pStr){int i;for(i = 0; *(pStr+i)!='\0'; i++);return i;}void SetAllBig(char* pStr)• Замена всех{прописных буквfor(int i = 0; *(pStr+i) != '\0'; i++)на заглавныеif(*(pStr+i) >= 'a' && *(pStr+i) <= 'z')*(pStr+i) -= 32;}Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Работа со строкам в Сиchar* GetString(){char* pStr;char temp[20];int i, size;scanf("%s", temp);• Динамические строки• Ввод только одного слова( до пустого символа,которым может бытьпробел, табуляция илиперевод строки)for(size = 0; *(temp+size) != '\0'; size++); • Ограничение намаксимальный размерpStr = malloc((size+1)*sizeof(char));for(i = 0; *(temp+i) != '\0'; i++)*(pStr+i)=temp[i];*(pStr+size) = '\0';return pStr;}Курс «Основы программирования». НГУ, ФФ, 2017• Отсутствие контроля запревышением размераscanf("%19s", temp);•Разбиение ввода на частиЛысаков К.Ф.Работа со строкам в Сиchar* GetString(){char* pStr;char temp[20];int i, size;gets(temp);• Динамические строки• Ввод текста( до перевода строки (ENTER))for(size = 0; *(temp+size) != '\0'; size++);• Отсутствие контроля запревышением размераpStr = malloc((size+1)*sizeof(char));for(i = 0; *(temp+i) != '\0'; i++)*(pStr+i)=temp[i];*(pStr+size) = '\0';return pStr;}Возможнопереполнение массива инесанкционированнаязапись в памятьКурс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Работа со строкам в Сиchar* GetString(){char* pStr;char temp[20];int i, size;fgets(temp, 20, stdin);• Динамические строкиfor(size = 0; *(temp+size) != '\0'; size++);• Ввод текста( до перевода строки (ENTER))• Корректная обработкапревышения ввода(разбиение на части)pStr = malloc((size+1)*sizeof(char));for(i = 0; *(temp+i) != '\0'; i++)*(pStr+i)=temp[i];*(pStr+size) = '\0';return pStr;}Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Работа со строкам в Сиchar* GetString(){char* pStr;char temp[20];char ch;int i, size;for(i = 0; (int)ch != 10; i++){ch = getchar();temp[i] = ch;}temp[i] = '\0';• Динамические строки• Посимвольный ввод• 10 – код «перевода строки»• Возможность ручногоконтроля превышенияразмера буфераfor(size = 0; *(temp+size) != '\0'; size++);pStr = malloc((size+1)*sizeof(char));for(i = 0; *(temp+i) != '\0'; i++)*(pStr+i)=temp[i];*(pStr+size) = '\0';return pStr;}Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Работа со строкам в Сиchar* pStr;pStr = GetString();• Вывод строк на консольprintf("%s", p);puts(p);fputs(p, stdin);for(int i = 0; *(p+i)!='\0'; i++)putchar(*(p+i));Курс «Основы программирования». НГУ, ФФ, 2017???Лысаков К.Ф.Многомерные массивы данныхОдномерные массивыint Mas[10];Двумерные массивыМногомерные массивыint Mas[Z][Y][X];Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Двумерные массивы данных#include <stdio.h>#define Width 5#define Height 3void main(){int myArray[Height][Width];int x, y;for ( y = 0; y < Height; y++ )for ( x = 0; x < Width; x++ )myArray[y][x] = y*Width + x;for ( y = 0; y < Height; y++ ){for ( x = 0; x < Width; x++ )printf( "[%d][%d]=%d\t", y, x, myArray[y][x] );printf( "\n" );}}Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Двумерные массивы данных#include <stdio.h>void PrintMassive(int* pMas, int Height, int Width){int x, y;for (y = 0; y < Height; y++ ){for (x = 0; x < Width; x++ )printf( "%d\t", *(pMas+y*Width+x));printf( "\n" );}}int main(){int myArray[2][3] = {{1,2,3},{4,5,6}};PrintMassive(myArray, 2, 3);}Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Двумерные массивы данных#include <stdio.h>???void PrintMassive(int* pMas, int Height, int Width){int x, y;for (y = 0; y < Height; y++ ){for (x = 0; x < Width; x++ )printf( "%d\t", *(pMas+y*Width+x));printf( "\n" );}}int main(){int myArray[2][3] = {{1,2,3},{4,5,6}};int myArray[6] = {1,2,3,4,5,6};PrintMassive(myArray, 2, 3);}Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Группы переменныхint mas[24];Однотипные переменныемассивыchar* pStringПроизвольные типыструктурыstruct Book{int pages;char author[50];char title[100];float price;};Структурный тип данных один из способов создания своих типов данных в языке СиКурс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Структуры данных в языке СиСтруктура - это совокупность переменных, объединенныходним именем, предоставляющая общепринятый способсовместного хранения информации.Объявление структуры приводит к образованию шаблона,используемого для создания объектов структуры.Переменные, образующие структуру, называютсячленами структуры или полями структуры.4 Byte50 Bytepagesauthor100 Bytestruct Book{int pages;char author[50];char title[100];float price;};4 BytepricetitleBookКурс «Основы программирования».
НГУ, ФФ, 2017>= 158 ByteЛысаков К.Ф.Структуры данных в языке Сиstruct Book{int pages;char author[50];char title[100];float price;};void main(){struct Book A;int size;A.pages = 78;scanf("%s", A.author);scanf("%s", A.title);scanf("%f", &A.price);Структурный тип данных Bookpages - поле структуры типа intA – объектДоступ к полям объекта структурычерез (.)size = sizeof(struct Book);}Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Структуры данных в языке Сиstruct Book{int pages;char author[50];char title[100];float price;};void main(){struct Book A;struct Book* pA;pA = &A;Структурный тип данных Bookpages - поле структуры типа intA – объектpA – указатель на объект структурыДоступ к полям структуры черезуказатель на объект (->)pA->pages = 78;scanf("%s", pA->author);scanf("%s", pA->title);scanf("%f", &(pA->price));}Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Структуры данных в языке Сиstruct Book{int pages;char author[50];char title[100];float price;} Book1;Структурный тип данных BookГлобальная переменная Book1 –объект структурыpA – указатель на объект структурыvoid main(){struct Book* pA;pA = &Book1;Доступ к полям структуры черезуказатель на объект (->)pA->pages = 78;scanf("%s", pA->author);scanf("%s", pA->title);scanf("%f", &(pA->price));}Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.TYPEDEF - определение имени новых типов данныхtypedef struct{int pages;char author[50];char title[100];float price;} Book;Book – имя нового типа данныхВозможность инициализациипри создании объектаvoid main(){Book A = {78, "Brian W.
Kernighan, Dennis M. Ritchie","The C programming Language", 15.2};printf("%s\t%s\t%d\t%f\n", A.author, A.title, A.pages, A.price);}Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Работа со структурамиtypedef struct{int pages;char author[50];} Book;Как с обычными типами данных:• объявление• передача в качестве параметров• возвращение значенийvoid InitBookMas(Book* pMas, int size){for(int i = 0; i < size; i++)scanf("%s%d", (pMas+i)->author, &((pMas+i)->pages));}void main(){Book mas[10];InitBookMas(mas, 7);mas[7].pages = 78;}Курс «Основы программирования».