Примеры программ к Лабораторной работе N5. "Указатели и работа со строками"

/* day_mon3.c -- используются обозначения через указатели */
#include <stdio.h>
#define MONTHS 12

int main (void)
{
	int days[MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int index;
	for (index = 0; index < MONTHS; index++)
		printf("Mecяц %2d имеет %d дней.\n", index + 1, *(days + index)); // то же, что и days[index]
	return 0;
}
/* p_and_s.c -- указатели и строки */
#include <stdio.h>

int main (void)
{
	const char *mesg = "Непозволяйте себя запутать!";
	const char *copy;
	copy = mesg;
	printf("%s\n", copy);
	printf("mesg = %s; &mesg = %p; value = %p\n", mesg, &mesg, mesg);
	printf("copy = %s; &copy = %p; value = %p\n", copy, &copy, copy);
	return 0;
}
/* pnt_add.c -- сложение указателей */
#include <stdio.h>
#define SIZE 4

int main(void)
{
	short dates[SIZE];
	short *pti;
	short index;
	double bills[SIZE];
	double *ptf;
	
	pti = dates;	// назначение указателю адреса массива
	ptf = bills;
	printf("%23s %10s\n", "short", "double");
	for (index = 0; index < SIZE; index++)
		printf("указатели + %d: %10p %10p\n", index, pti + index, ptf + index);
	return 0;
}
/* praise1.c -- использует различные представления строк */
#include <stdio.h>
#include <string.h>
#define PRAISE "Какое прекрасное имя!"

int main (void)
{
	char name[40];
	printf("Kaк Вас зовут?\n");
	scanf("%s", name);
	printf("Здравствуйте, %s. %s\n",name, PRAISE);
	
	printf("Baшe имя состоит из %d символов и занимает %d ячеек памяти.\n", strlen(name), sizeof name);
	printf("Хвалебная фраза содержит %d символов", strlen(PRAISE));
	printf(" и занимает %d ячеек памяти. \n", sizeof PRAISE);
	
	return 0;
}
/* ptr_ops.c -- операции над указателями */
#include <stdio.h>

int main(void)
{
	int urn[5] = {100, 200, 300, 400, 500};
	int *ptr1, *ptr2, *ptr3;
	ptr1 = urn;		// при сваивание указателю адреса
	ptr2 = &urn[2];	// второй экземпляр
					// разыменование указателя и взятие адреса указателя
	printf("значение указателя, разыменованный указатель, адрес указателя:\n");
	printf ("ptr1 = %p, *ptr1 = %d, &ptr1 = %p\n", ptr1, *ptr1, &ptr1);
	
	// сложение указателей
	ptr3 = ptr1 + 4;
	printf("\ncлoжeниe значения int с указателем: \n") ;
	printf("ptr1 + 4 = %p, *(ptr4 + 3) = %d\n", ptr1 + 4, *(ptr1 + 3));
	
	ptr1++; // увеличение значения указателя на 1
	printf("\n значения после выполнения операции ptr1++: \n");
	printf("ptr1 = %p, *ptr1 = %d, &ptr1 = %p \n",	ptr1, *ptr1, &ptr1);
	
	ptr2--; // уменьшение значения указателя на 1
	printf("\n значения после выполнения операции --ptr2:\n");
	printf("ptr2 = %p, *ptr2 = %d, &ptr2 = %p\n", ptr2 , *ptr2 , &ptr2);
	
	--ptr1; // восстановление исходного значения
	++ptr2; // восстановление исходного значения
	printf("\nвосстановление исходных значений указателей:\n");
	printf("ptr1 = %p, ptr2 = %p\n", ptr1, ptr2);
	
	// вычитание одного указателя из другого
	printf("\nвычитание одного указателя из другого: \n");
	printf("ptr2 = %p, ptr1 = %p, ptr2 - ptr1 = %d\n", ptr2, ptr1, ptr2 - ptr1);
	
	// вычитание целого значения из указателя
	printf("\nвычитание из указателя значения типа int:\n");
	printf("ptr3 = %p, ptr3 - 2 = %p\n", ptr3, ptr3 - 2);
	return 0;
}
// strings.c -- коллекционирование пользователей
#include <stdio.h>
#define MSG "вы должны обладать многими талантами. Назовите некоторые." // константа символьной строки
#define LIM 5
#define LINELEN 81	// максимальная длина строки + 1

int main (void) 
{
	char name[LINELEN];
	char talents[LINELEN];
	int i;
	
	// инициализация массива значений типа char заданной размерности
	const char m1[40] = "Постарайтесь уложиться в одну строку.";
	// пусть компилятор сам вычислит размеры массива
	const char m2[] = "Если вам ничего не приходит в голову, придумайте что-нибудь.";
	// инициализация указателя
	const char *m3 = "\nBce, о себе достаточно, а вас как зовут?";
	// инициализация массива указателей на строку
	// массив из 5 указателей
	const char *mytal[LIM] = {"Мгновенное складывание чисел",
					"Точное умножение", "Накапливание данных",
					"Исполнение инструкций с точностью до последней буквы",
					"Знание языка программирования С"
					};
					
	printf("Здравствуйте! Я компьютер по имени Клайд."" У меня масса талантов.\n");
	printf("Ceйчac я расскажу кое-что о них.\n");
	puts("Чтo у меня за таланты? Вот только частичный их перечень.");
	
	for (i = 0; i < LIM; i++)
		puts(mytal[i]); // печать талантов компьютера
	
	puts(m3);
	gets(name);
	printf("Xopoшo, %s, %s\n", name, MSG);
	printf("%s\n%s\n", m1, m2);
	gets(talents);
	puts("Посмотрим, есть ли у меня этот перечень:");
	puts(talents);
	printf("Благодарю за информацию, %s.\n", name);
	return 0;
}