Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 513
∙ повысить рейтинг »
CradleA
Статус: Профессионал
Рейтинг: 93
∙ повысить рейтинг »
D-mon55
Статус: 2-й класс
Рейтинг: 75
∙ повысить рейтинг »

∙ С / С++

Номер выпуска:1871
Дата выхода:30.05.2016, 16:51
Администратор рассылки:Андрей Кузнецов aka Dr_Andrew (Старший модератор)
Подписчиков / экспертов:19 / 14
Вопросов / ответов:1 / 1

Консультация # 189449: Здравствуйте,помогите,пожалуйста с программами никак не могу сделать. Нужно написать на C а не на C++ и использовать что-то из C++ нельзя. Так же, пожалуйста оставьте комментарии в программах(которые сможете помочь сделать) и идею их решения. Вот задачи: URL &...

Консультация # 189449:

Здравствуйте,помогите,пожалуйста с программами никак не могу сделать. Нужно написать на C а не на C++ и использовать что-то из C++ нельзя. Так же, пожалуйста оставьте комментарии в программах(которые сможете помочь сделать) и идею их решения.

Вот задачи:
URL >>
2-ую и 5-ую я решил.
Но во 5 проблема в том ,что мне сказали чтобы массив был не слева на право, а с права на лево.
а 2-ая вообще не верна,но что то делал
URL >>

Дата отправки: 20.05.2016, 16:37
Вопрос задал: EccoVIP (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, EccoVIP!
Задачу 2 я бы сделал так:

/* Дан массив размера N.
   Найти количество его промежутков монотонности
   (то есть участков, на которых его элементы возрастают или убывают). 
*/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include <windows.h>

int main()
{
    int N;
    int i, series_count;
    int dir, cnt;
	int *arr;

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

	printf("Введите N:\n");
    scanf("%d", &N);
    while (N <= 1)
    {
        printf("N должно быть > 1\n");
        printf("Введите N:\n");
        scanf("%d", &N);
    };
    
	srand(time(NULL));					//иницируем генератор псевдослучайных чисел

	arr = (int*)malloc(N*sizeof(int));	//запросим память в куче

    //заполнение массива случайными числами
	printf("Исходный массив:\n");
    for (i = 0; i < N; i++)
    {
        arr[i] = rand() % 10;
        printf("%d ", arr[i]);
    }
    printf("\n");

//ищем серии
//направление dir = -1 - или в начале, или равные элементы
//dir = 1 - возрастание
//dir = 0 - убывание
	for (i=cnt=series_count=0,dir=-1; i<N-1; i++)
    {
		//если неравны и направление совпадает
		if ((arr[i] != arr[i+1]) && (dir == (arr[i] < arr[i+1])))
			cnt++;
		else
		{	//если равны или не совпадает направление (включая равенство)
			series_count += (cnt>0);	//считаем ненулевые
			if (arr[i] != arr[i+1])		//для неравных
			{
				dir = (arr[i] < arr[i+1]); //устанавливаем направление
				cnt = 1;				//и считаем, что новая серия уже "нарисовалась"
			}
			else
			{
				dir = -1;				//для равных
				cnt = 0;				//серии нет
			}
		}
    }
	series_count += (cnt>0);			//учтем самую последнюю серию

    printf("Количество серий: %d\n", series_count);

	free(arr);

    return 0;
}

У Вас сравнение идет не с предыдущим, а с i-м и не учитываются одинаковые элементы

В задаче 5 ошибка в функции Smooth2
Надо ж было брать среднее арифметическое не с последующим, а с предыдущим
void Smooth2(float * arr, int N)
{
    size_t i;
    for (i = 1; i<N; i++)
    {
        arr[i] = (arr[i] + arr[i - 1]) / 2.0; // элемент сглаживания принимает зн-е предыдущего деленного пополам
    }
}


Задача 1:
#include <stdio.h>

/* Выяснить, какие цифры (по одной справа и слева) нужно приписать к числу 1022, 
   чтобы полученное число делилось на 7, 8, 9. Распечатать это число.
*/

int main()
{
	int i, j, f=0;

	for (i=1; i<10; i++)
	{
		for (j=0; j<10; j++)
			if (((10220 + i*100000 + j) % (7*8*9)) == 0)
			{
				printf("%d\n", 10220 + i*100000 + j);
				f = 1;
			}
	}
	if (f==0)
		printf("Not found!\n");

	return 0;
}


Задача 4:
Все преобразования делаются без привлечения дополнительной строки
/*
	Дана строка-предложение. 
	Зашифровать ее, поместив вначале все символы, 
	расположенные на четных позициях строки, а затем, 
	в обратном порядке, все символы, расположенные 
	на нечетных позициях 
	(например, строка «Программа» превратится в «ргамамроП»).
*/

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void MakeStr(char* str)
{
	int len = strlen(str);
	int len2 = len>>1;
	int i, j, k;

//сдвинем символы на четных позициях к началу строки
	for(i=0; i<len2; i++)
	{
		k = str[i*2+1];
		for(j=i*2+1; j>i; j--)
			str[j] = str[j-1];
		str[j] = k;
	}
//бывшие нечетные, которые оказались в конце строки, перевернем
	for(i=len2,j=len-1; i<j; i++, j--)
	{
		k = str[i];
		str[i] = str[j];
		str[j] = k;
	}
}

int main()
{
	char str[256];

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    printf("Введите строку: ");
 	gets(str);

	MakeStr(str);
	printf("Результат: %s\n", str);

	return 0;
}


Задача 6:
/*
	Для хранения данных о ноутбуках описать структуру вида (при необходимости дополнив ее):
	struct NOTEBOOK
	{
		charmodel[21];	// наименование
		struct size
		{				// габаритные размеры
			floatx;
			float y;
			float z;
		};
		float w;		// вес
		int price;		// цена
	};
	Написать функцию, которая читает данные о ноутбуках из файла note.txt (см.ниже) 
	в структуру приведенного вида. Написать функцию, которая записывает содержимое 
	структуры в конец бинарного файла. Структура бинарного файла: первые два байта 
	(целое) — число записей в файле; далее записи в формате структуры NOTEBOOK.
	Написать программу, в которой на основе разработанных функций осуществляется 
	чтение данных только для тех ноутбуков, частота процессора которых больше 120 МГц, 
	и запись в бинарный файл по убыванию цены.
	Все необходимые данные для функций должны передаваться им в качестве параметров. 
	Использование глобальных переменных в функциях не допускается.

	В файле note.txt находится текстовая информация о ноутбуках. 
	Каждая строка содержит данные об одной модели. 
	Данные в строке размещаются в следующих полях:

	 1 : 20 	 наименование модели;
	21 : 24 	 цена в долларах (целое число);
	26 : 28 	 масса ноутбука в кг (число с десятичной точкой из четырех символов);
	30 : 43 	 габаритные размеры ноутбука в дюймах (ВЫСОТАхДЛИНАхШИРИНА — три числа с десятичной точкой (4 символа, включая точку, разделенные 'х');
	45 : 47 	 частота процессора в МГц (целое число из трех символов);
	49 : 50 	 максимальный объем ОЗУ в мегабайтах (целое число из двух символов);
	52 : 55 	 размер диагонали дисплея в дюймах (число с десятичной точкой из четырех символов, включая точку);
	57 			 размер видеопамяти в мегабайтах — целое число из одного символа;
	59 : 67 	 разрешающая способность дисплея в пикселах (два целых числа, разделенные 'х');
	69 : 70 	 частота регенерации дисплея в Гц (целое число из двух символов);
	72 : 76 	 объем HDD в гигабайтах (число с десятичной точкой из пяти символов)
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
#include <windows.h>

typedef struct _NOTEBOOK
{
	char	charmodel[21];	// наименование
	int		price;			// цена
	float	w;				// вес
	struct	_size
	{						// габаритные размеры
		float	x;
		float	y;
		float	z;
	}size;
	int		pfreq;			// частота процессора
	int		ram;			// ОЗУ
	float	diag;			// диагональ монитора
	int		vram;			// видеопамять
	struct	_points			// размер монитора в точках
	{
		int		width;
		int		height;
	}points;
	int		vfreq;			// частота регенерации монитора
	float	hdd;			// объем HDD
}NOTEBOOK;

int WriteBinFile(char * pName, NOTEBOOK * pnb)	//запись записи в файл
{
	short		count;
	FILE*		file = fopen(pName, "r+b");		//открываем файл на чтение/запись в двоичном режиме
	
	if (!file)									//если файла нет, то вернется 0
	{
		file = fopen(pName, "wb");				//создаем, открывая на запись
		if (!file)
			return 0;							//если 0, то выходим
		count = 1;								//первые 2 байта - количество записей в файе
		fwrite(&count, sizeof(short), 1, file);	//запишем 1
		fwrite(pnb, sizeof(NOTEBOOK), 1, file);	//и первую запись
	}
	else										//файл уже есть
	{
		fread(&count, sizeof(short), 1, file);	//прочитаем количество
		count++;								//увеличим на 1
		fseek(file, 0, SEEK_SET);				//на начало файла
		fwrite(&count, sizeof(short), 1, file);	//пишем новое количество
		
		fseek(file, 0, SEEK_END);				//в конец файла
		fwrite(pnb, sizeof(NOTEBOOK), 1, file);	//пишем новую запись
	}
	fclose(file);								//закрываем файл
	return 1;									//все ок
}

int ReadNotebook(FILE *file, NOTEBOOK * pnb)	//читаем очередную текстовую строку 
{												// и преобразовываем данные в структуру
	char		line[256];						//буфер для строки
	char*		token;							//указатель для получения подстроки

	if (NULL != fgets(line, 256, file))			//читаем строку, == NULL, если файл кончился
	{
		strncpy(pnb->charmodel, line, 20);		//копируем 20 первых символов в поле имени
		pnb->charmodel[20] = 0;					//закрываем нулем

		token = strtok(line+20, " x\n");		//далее ищем подстроки и преобразовываем
		pnb->price = atoi(token);				// разделители: пробел, х и конец строки
		
		token = strtok(NULL, " x\n");			//получаем следующую подстроку
		pnb->w = (float)atof(token);			//поле w и так далее
		
		token = strtok(NULL, " x\n");
		pnb->size.x = (float)atof(token);
		
		token = strtok(NULL, " x\n");
		pnb->size.y = (float)atof(token);

		token = strtok(NULL, " x\n");
		pnb->size.z = (float)atof(token);

		token = strtok(NULL, " x\n");
		pnb->pfreq = atoi(token);

		token = strtok(NULL, " x\n");
		pnb->ram = atoi(token);

		token = strtok(NULL, " x\n");
		pnb->diag = (float)atof(token);

		token = strtok(NULL, " x\n");
		pnb->vram = atoi(token);

		token = strtok(NULL, " x\n");
		pnb->points.width = atoi(token);

		token = strtok(NULL, " x\n");
		pnb->points.height = atoi(token);

		token = strtok(NULL, " x\n");
		pnb->vfreq = atoi(token);

		token = strtok(NULL, " x\n");
		pnb->hdd = (float)atof(token);

		return 1;								//данные получены
	}
	return 0;									//строк больше нет
}

int main()
{
	NOTEBOOK*	pnb = NULL;						//адресс массива записей
	int			i, j, count;
	NOTEBOOK	temp;							//временная структура

	FILE*		file = fopen("note.txt", "r");	//открываем текстовый файл

    SetConsoleCP(1251);							//для вывода русских букв (если надо)
    SetConsoleOutputCP(1251);

	if (!file)
	{
		printf("File note.txt not found!");		//файл не найден!
		return 1;
	}

	pnb = (NOTEBOOK*)malloc(sizeof(NOTEBOOK));	//выделим память для одной записи
	count = 1;									//счетчик записей (на 1 больше, чем есть на самом деле!)

	while (ReadNotebook(file, &pnb[count-1]))	//читаем, пока есть что читать, индекс записи на 1 меньше, чем count!
	{
		if (pnb[count-1].pfreq > 120)			//проверяем поле частоты
												// если больше 120, то оставляем, а размер массива записей увеличиваем на 1
												// чтобы читать в последнюю
			pnb = (NOTEBOOK*) realloc(pnb, (++count)*sizeof(NOTEBOOK));
	}

	count--;									//реальное количество найденных записей

	for(i=0; i<count-1; i++)					//сортруем пузырьком по полю цены
		for(j=i+1; j<count; j++)
		{
			if (pnb[i].price < pnb[j].price)
			{
				CopyMemory(&temp, &pnb[i].price, sizeof(NOTEBOOK));
				CopyMemory(&pnb[i].price, &pnb[j].price, sizeof(NOTEBOOK));
				CopyMemory(&pnb[j].price, &temp, sizeof(NOTEBOOK));
			}
		}

	for(i=0; i<count; i++)						//выводим в файл
		if (!WriteBinFile("note.bin", &pnb[i]))
			break;								//если ошибка
	
	fclose(file);
	free(pnb);
	return 0;
}

note.txt
Acer Note Light     2699 5.6 02.0x11.8x08.3 100 40 10.4 1 1024x0768 60 0.774
ASW ND5123T         3489 7.2 02.3x11.8x10.1 133 32 12.1 2 1024x0768 70 1.300
ARMNote TS80CD      3699 7.2 02.0x11.5x08.8 133 64 11.3 1 1024x0768 75 1.300
AST Ascentia P50    4499 7.5 02.3x11.3x09.0 133 40 11.3 1 0800x0600 70 0.774
BSI NP8657D         2605 8.0 02.3x11.8x09.3 133 40 11.3 1 1024x0768 60 0.810
BSI NP5265A         3765 8.2 02.5x12.0x09.0 150 32 12.1 2 1024x0768 70 1.300
Dell Xpi PIOOSD     3459 6.0 02.3x11.0x08.8 100 40 10.3 1 1024x0768 60 0.773
Digital HiNote      4799 4.0 01.3x11.0x08.8 120 40 10.4 1 0800x0600 56 1.000
Gateway Solo S5     4499 5.6 02.0x11.9x08.8 133 40 11.3 2 1024x0768 60 0.686
Hertz Z-Optima NB   3995 8.0 02.3x11.9x09.0 150 40 11.2 2 1024x0768 75 1.000
HP Omni Book 5500   6120 7.1 02.0x11.5x09.0 133 64 11.4 1 1024x0768 75 1.300
IBM ThinkPad 560    3749 4.1 01.3x11.8x08.8 120 40 12.1 2 1024x0768 85 0.774
NEC Versa 4080H     4780 6.6 02.3x11.8x09.5 120 48 10.4 1 0800x0600 70 0.776
Polywell Poly 500   3300 7.9 02.3x11.9x09.0 120 40 10.4 1 1024x0768 72 1.000
Samsung SENS 810    3667 8.7 02.3x11.5x09.5 100 32 11.4 2 1024x0768 75 0.773
TwinheadSlimnote    2965 7.4 02.0x11.5x08.0 075 64 10.4 1 1024x0768 70 0.772

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 23.05.2016, 12:37

5
нет комментария
-----
Дата оценки: 23.05.2016, 12:46

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное