ДСо18-05-функции-и-консоль-С++ (Лекции Северов Часть 3)
Описание файла
Файл "ДСо18-05-функции-и-консоль-С++" внутри архива находится в папке "Лекции Северов Часть 3". PDF-файл из архива "Лекции Северов Часть 3", который расположен в категории "". Всё это находится в предмете "вычислительная математика" из 6 семестр, которые можно найти в файловом архиве МФТИ (ГУ). Не смотря на прямую связь этого архива с МФТИ (ГУ), его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Carnegie MellonФункции иввод/вывод С/С++Алгоритмыи алгоритмические языкиgoo.gl/c8pyqxЛекция 5, 5 октября, 2018Лектор:Дмитрий Северов, кафедра информатики 608 КПМdseverov@mail.mipt.ruhttp://cs.mipt.ru/wp/?page_id=60771УКАЗАТЕЛИ¢¢¢Переменные, содержащие адресОписание и инициализацияint *Pc, **Pd;int a=5, b[]={1,2,3}, *Pa=&a, *Pb=b;char *s=²String²;Присваивание значенияconst int *b ={1,2,3};Pd=&Pb; Pc=&b[1];2Операции с указателямиint n, b, a[10], *pb=&a[0], *pe=&a[9], *pc;¢¢Арифметическиеn = pe - pb; // кол-во элементов (не байт!)pb++;// &a[1] (адрес следующего// элемента но не байта!)pc = pe – 1; // &a[8]pb + pe;// ОШИБКА !!!Разыменованияb = *pc;// b = a[8];NB: операции с указателями являютсяразмерными!!!3Операции с указателямиstruct complex { double Re; double Im; } a, *p;p = &a;¢Разыменованияa.Re = 1.;p->Im = 0.;NB: операции с указателями являютсяразмерными!!!4Универсальные указателиvoid *P, *Q;¢ Запрещены операции¢§ Арифметические§ Разыменования¢Типичное применениеP= malloc(sizeof(double));// P = new double;Q= calloc(N,sizeof(int)); // Q = new(int[N]);free(Q);// delete(Q);Q= realloc(Q,M);¢Универсальный указатель можно§ Инициализировать значением указателя любого типа§ Преобразовать в указатель любого типа5#include <iostream>using namespace std;int main() {const int n= 64;char str[]= "Hello, World!\n";void *p, *ps= str;char **pps= (char**)&ps;int *a, *pb, *pe;Hello, World!0x7fff5fbff559 0x7fff5fbff4e0 H0x100519920=pb pb+1=0x1005199240x100519928: a[2]= 20x00x100519920 2063a=0x100519920 a[0]=0a[n-1]=630 a[n]=64cout << str << ps << " " << pps << ' ' << (**pps) << endl;p= malloc(4*n); pb= a= (int*)p; for (int i=0; i<n; i++) a[i] = i;cout<< pb << "=pb\t pb+1=" << pb+1 << "\n";cout<< pb+2 << ": a[2]= » << *(pb+2) << endl;free(a); pb=a=NULL;cout << pb << endl;}pb=a=new int[n]; for(int i=0;i<n;i++) *(a+i)=10*i;cout << a << "\t" << *(pb+2) <<endl;pe=&a[n-1];cout <<pe-pb<< endl;a=(int*)realloc(a,2*n);cout<<"a="<< a <<"\ta[0]="<<*a<<"\na[n-1]="<<a[n-1]<<" a[n]="<<a[n]<<endl;6Ссылки*)Другое имя переменной (псевдоним)¢ Описание и инициализацияint a=5, &b=a;// a и b – разные имена одной// и той же области памяти¢*)только в С++7Тип FILE*struct _iobuf {typedef struct _iobuf FILE;char *_ptr;Илиint _cnt;#define FILE struct _iobufchar *_base;int _flag;FILE *a;int _file;FILE* fopen(int _charbuf;const char* name,int _bufsiz;const char* accesschar);*_tmpfname; };int fclose(FILE* a);8Определение новых действийФункции9Соглашения функции1.
Имеет список аргументов (параметров)2. Возвращает значение3. Объявляется указанием своего имени и типавозвращаемого значения4. Определяется перечислением операторов1011Пример 1: решето ЭратосфенаСоздание динамического массива2345678910111213141516171811010101010101010Заполнение признаком простоты121314Пример 1: решето ЭратосфенаСоздание динамического массива2345678910111213141516171811010101010101010Создание двумерного динамического массиваconst int n=3, m=5;int (*a)[m] = new int[n][m]; // *b[m]// a = (int(*)[m])malloc(n*m*4);4 байта20 байт151617Операции Инкремента и Декремента1.
*++Ptr // *(Ptr += 1) – перевод указания наследующий элемент с использованием его значения привычислении выражения2. --*Ptr // *Ptr -= 1 – уменьшение текущего элементана единицу с использованием этого значения в вычислениивыражения3. *Ptr++ // (t=Ptr,Ptr+=1,*t) – использованиезначения текущего элемента и перевод указания наследующий элемент4. (*Ptr)-// (t=*Ptr,*Ptr-=1,t) –использование в вычислении текущего значения элемента споследующим его уменьшением на единицу181920Пример 2: операции со строками¢¢¢¢Вычисление длины строки (strlen(a))*)char *b=a; while(*b++); return b-a-1;Копирование (strcpy(a,b))while(*a++ = *b++);Сравнение (strcmp(a,b))while(*a++ == *b++) if(!*(a-1)) return 0;return *(a-1) - *(b-1);Конкатенация (strcat(a,b))char a[N]={…,’\0’},*p=a;while(*p)p++; while(*p++=*b++);*)#include <string.h> - библиотечные функции Си21Основные функции ввода/вывода¢int getchar(void);¢int putchar(int);¢¢¢int getche(void);int getch(void);int putch(int);int [f]putc(int, FILE*);¢int [f]getc(FILE*);¢¢int printf("%s", char*);int puts(const char*);¢int fputs(char*, FILE*);¢¢int scanf("%s", char*);char* gets(char*);¢char* fgets(char*, int, FILE*);¢22Вывод на экран и в поток#include <stdio.h>#include <conio.h>#include <string.h>int main() {const char *s1="This isoutput into the stdout stream",*s="to the console";char *p, s2[]="This is output intothe stdout stream";// *s1='a';while(*s1) putchar(*s1++);}putchar('\n');p=strstr(s2,"stdout");*(p+3)='e'; *(p+5)=*(p+4)='r';p=s2;while(*p) fputc(*p++,stderr);fputc('\n',stderr);p=strstr(s2,"into");while(*p++=*s++); p=s2;while(*p) putch(*p++);putch('\n');return 0;23Вывод на экран и в поток#include <stdio.h>#include <conio.h>#include <string.h>int main() {const char *s1="This isoutput into the stdout stream",*s="to the console";char *p, s2[]="This is output intothe stdout stream";// *s1='a';while(*s1) putchar(*s1++);}putchar('\n');p=strstr(s2,"stdout");*(p+3)='e'; *(p+5)=*(p+4)='r';p=s2;while(*p) fputc(*p++,stderr);fputc('\n',stderr);p=strstr(s2,"into");while(*p++=*s++); p=s2;while(*p) putch(*p++);putch('\n');return 0;2425262728Пример 3: потеря быстродействия¢¢¢Для заданных строк s1 и s2 найти номер символа, с которогоначинается вхождение строки s2 в строку s1.int strncmp(char* s1, char* s2, int n) – производит сравнение неболее n символов из двух строк и возвращает значение 0 –только в случае если строки совпадают.int main(int argn, char* argv[ ])§ argn – количество слов в командной строке§ argv – параметры, переданные программе2930.