Консультация # 189449: Здравствуйте,помогите,пожалуйста с программами никак не могу сделать. Нужно написать на C а не на C++ и использовать что-то из C++ нельзя. Так же, пожалуйста оставьте комментарии в программах(которые сможете помочь сделать) и идею их решения. Вот задачи: URL &...
Здравствуйте,помогите,пожалуйста с программами никак не могу сделать. Нужно написать на C а не на C++ и использовать что-то из C++ нельзя. Так же, пожалуйста оставьте комментарии в программах(которые сможете помочь сделать) и идею их решения.
Вот задачи: URL >> 2-ую и 5-ую я решил. Но во 5 проблема в том ,что мне сказали чтобы массив был не слева на право, а с права на лево. а 2-ая вообще не
верна,но что то делал URL >>
/* Дан массив размера 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 Надо ж было брать среднее арифметическое не с последующим, а с предыдущим
#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;
}
/*
Для хранения данных о ноутбуках описать структуру вида (при необходимости дополнив ее):
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;
}
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!