Все выпуски  

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


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

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

CradleA
Статус: Профессор
Рейтинг: 159
∙ повысить рейтинг »
Хватов Сергей
Статус: Академик
Рейтинг: 39
∙ повысить рейтинг »
solowey
Статус: Студент
Рейтинг: 5
∙ повысить рейтинг »

∙ С / С++

Номер выпуска:1956
Дата выхода:26.04.2019, 02:45
Администратор рассылки:Андрей Кузнецов aka Dr_Andrew (Старший модератор)
Подписчиков / экспертов:43 / 32
Вопросов / ответов:3 / 3

Консультация # 189449: Здравствуйте,помогите,пожалуйста с программами никак не могу сделать. Нужно написать на C а не на C++ и использовать что-то из C++ нельзя. Так же, пожалуйста оставьте комментарии в программах(которые сможете помочь сделать) и идею их решения. Вот задачи: URL &...
Консультация # 109627: Здраствуйте ! Я хотел бы узнать можно ли создать програму на С++ для базы данных написаной на SQl ? Существует ли какая виртуальная среда программирования на SQL в Windows OS ? Подскажите литературу по написанию приложений на С++ по SQL ? А вобще мне нужно: - Сформировать структуру таблиц баз данных; - Обеспечить требов...
Консультация # 91926: у меня возникла проблемма правильной установки и регистрации компонентов, к примеру ZeosDBO. установить то их установил, а вот скомпилить прогу с их использование не получается. подскажите как правильно регистрировать компоненты в Builder 6.0. только пожалуста подробнененько так как для первого класса....

Консультация # 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


Задача 3:
/*
	Написать функцию, возвращающую номер строки целочисленной прямоугольной матрицы, 
	в которой находится сама¤ длинная серия одинаковых элементов.
*/

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

int GetNumRow(int * row, int m)	//поиск в строке максимального количества одинаковых элементов
{
	int i, j, cnt, max=0;
	int num;

	for(i=0; i<m; i++)			//по элементам строки
	{
		num = row[i];			//очередной элемент
		if (num != -1)			//обработанные пропускаем
		{
			for(cnt=j=0; j<m; j++)	//по всем элементам считаем совпадающие
			{
				if (row[j] == num)	//считаем одинаковые
				{
					cnt ++;
					row[j] = -1;	//и помечаем найденные, чтобы не обрабатывать их еще раз
				}
			}
			if (cnt > max)
				max = cnt;			//ищем максимум
		}
	}
	return max;					//возвращаем первое максимальное количество одинаковых
}

int GetNum(int * arr, int n, int m)	//поиск номера сроки, в которой максимальное количество одинаковых
{
	int i, curr;

	int max = GetNumRow(arr, m);	//считаем пока, что максимальное в первой строке
	int imax = 0;					//индекс максимального количества

	for(i=1; i<n; i++)				//по всем остальным строкам
	{
		curr = GetNumRow(&arr[i*m], m); //получаем максимальное в очередной строке
		if (max < curr)
		{
			max = curr;				//новое максимальное
			imax = i;				//индекс строки
		}
	}
	return imax+1;				//вернем индекс, увеличенный на 1 (счет с 1!)
}

int main()

{
    int N, M;
    int i, j;
	int *arr;

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

	do
	{
		printf("¬ведите количество строк N: ");
		scanf("%d", &N);
		if (N <= 1)
			printf("N должно быть > 1\n");
    }while (N <= 1);

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

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

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

	printf("Искомый номер строки = %d\n", GetNum(arr, N, M));
	
	free(arr);

	system("pause");

    return 0;
}

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

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

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

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

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

Здраствуйте !
Я хотел бы узнать можно ли создать програму на С++ для базы данных
написаной на SQl ? Существует ли какая виртуальная среда программирования на SQL в Windows OS ? Подскажите литературу по
написанию приложений на С++ по SQL ?
А вобще мне нужно:
- Сформировать структуру таблиц баз данных;
- Обеспечить требования нормализации таблиц;
- Сформировать SQL-запросы для создания таблиц баз данных с указанием, первичных и внешних ключей и требуемых ограничений, SQL-запросы для добавления, изменения и выборки необходимых данных.
- Запросы, указанные в условии задачи оформить в виде представлений.
При решении задачи предполагается использования серверных СУБД, обеспечивающих полную поддержку языка запроса SQL.
+ кроме всего етого создать приложение на С++ для етой базы даных.
Помогите мне please !!!

Дата отправки: 16.11.2007, 00:33
Вопрос задал: Nikolas Franchsko Matrilotti
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лясин Александр Владимирович:

Здравствуйте, Nikolas Franchsko Matrilotti!
Начнём по порядку.
1. Написать программу на C++ - которая работает с БД можно.
2. По поводу виртуальной среды - то её как таковой нет, но есть средства (в том числе и для Windows), которые позволяют работать с различными БД.
а) ODBC - очень старое средство, представляющее собой набор драйвров с унифицированным программным интерфейсом. По просту говоря - является одним из стандартов (один из самых старых) доступа к БД. На данный момент считается устаревшим - но отлично работает. Схема работы упрощённо следующая - с помощью драйвера (это dll) приложение подключается к БД, после чего есть возможность работать с БД с помощью SQL-запросов, а также создавать таблицы, удалять таблицы и т.п. Но в конечном итоге всё зависит от реализации конкретного драйвера.
б) ADO - интерфейс для работы с БД более верхнего уровня - нежели DBC, в итоге, в случаях работы не с MS Access работает через тоже ODBC.
с) Это API для работы с сервером той платформы, с который хотите работать.
Для начала достаточно.
Если вас интересует теория построения БД и/или форма построения запросов - здесь http://www.proklondike.com/index.php?mainpart=5 вы найдёте много интересного.
Я бы для начала рекомендовал http://www.proklondike.com/contentview.php?content=184, Мартин Грубер "Понимание SQL".
Чтобы быстрее освоить работу с БД именно в С++ - можете установить Borland C++ Builder 6.0, т.к. в нём есть возможность "поэкспериментировать" с БД ещё на стадии проектирования программы.
Из серверных платформа для Windows я бы рекомендовал FireBird - это открытая платформа, её можно скачать и использовать абсолютно бесплатно.
Про него можно почитать здесь http://www.ibase.ru

Консультировал: Лясин Александр Владимирович
Дата отправки: 16.11.2007, 07:47
Рейтинг ответа:

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

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

у меня возникла проблемма правильной установки и регистрации компонентов, к примеру ZeosDBO. установить то их установил, а вот скомпилить прогу с их использование не получается. подскажите как правильно регистрировать компоненты в Builder 6.0. только пожалуста подробнененько так как для первого класса.

Дата отправки: 18.06.2007, 15:13
Вопрос задал: Трофимов Александр Юрьевич
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Sashko:

Здравствуйте, Трофимов Александр Юрьевич!
Ответ удален и перенесен в ветку форума «О деятельности экспертов и работе портала – Удаленные ответы для обсуждения» [ Климова М. ]
= = =
Ответ является откровенным хамством. Эксперту объявлено официальное предупреждение.

Консультировал: Sashko
Дата отправки: 18.06.2007, 16:54
Рейтинг ответа:

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


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

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

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


В избранное