• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите решить задачи на C++

  • Автор темы Автор темы Bleak
  • Дата начала Дата начала

Bleak

Ученик
Регистрация
14 Фев 2009
Сообщения
6
Реакции
0
Баллы
0
Помогите решить задачи на C++

Помогите, пожалуйста.
1. Дан прямоугольник с размерами a*b.От него отрезают квадраты максимального размера,пока это возможно.Затем от оставшегося прямоугольника вновь отрезают квадраты максимально возможного размера и т.д.На какие квадраты и в каком их количестве будет разрезан исходный прямоугольник?
2.Дано к грибов. Вводя определенное число,нам экран выдает "Мы собрали к [гриб,грибов или гриба]"пример: Мы собрали 1 гриб или 22 гриба.

заранее спасибо!!!
 
Про грибы типа так...
/* грыбы*/

#include <windows.h>
#include <winuser.h>
#include <iostream>
using namespace std;

void main()
{
int size = 0;
int octatok = 0;
char buf[255]; // включение русского языка в консоли
char res [9];

CharToOem("Введите количество грибов: ",buf);
CharToOem("Mы нашли ",res);
cout << buf;
cin >> size;
octatok=size;

if (size == 1) CharToOem(" гриб",buf);
else
{
while (true)
{
octatok=octatok%10;
if (octatok<9)break;
}
if (octatok == 2 && octatok == 3 && octatok == 4 ) CharToOem(" грибa",buf);
else CharToOem(" грибов",buf);
}

// Вывод результата

cout << res << size << buf<< endl;

cin.get();
}

PS: я не спец в Сях, возможно есть более красивое решение...
 
во второй задаче в условие не въехал, это задача на нахождение машинного нуля?
 
вот пример в цифрах.
дан прямоугольник с размерами 425*131.От него отрезают квадраты со стороной 131.,пока это возможно.Затем от оставшегося прямоугольника вновь отрезают квадраты со стороной,равно 425-131*3=32 ,и т.д.На какие квадраты и в каком количестве будет разрезан исходный прямоугольник.
 
/*квадраты*/

#include <windows.h>
#include <winuser.h>
#include <iostream>
using namespace std;

void main()
{
int a, b, temp, step=0;
int kvadr[100];
char buf[255]; // включение русского языка в консоли


CharToOem("Введите стороны прямоугольника a = ",buf);
cout << buf;
cin >> a;
CharToOem("Введите стороны прямоугольника b = ",buf);
cout << buf;
cin >> b;

while(a!=0 && b!=0)
{
if (a<b)
{
temp=a;
a=b;
b=temp;
}
kvadr[step]=b;
step++;
a=a-b;
}


// Вывод результата

CharToOem("Шаг --- Сторона квадрата",buf);
cout << buf<< endl;
for (int i=0; i< step; i++)
{
cout << i+1 << " --- " << kvadr<< endl;
}

cin.get();
}

Прога работает, хотя я написал ее скорее в стиле паскаля, (ну не сишник я...) И еще массив kvadr[] я объявил на 100 элементов.
 
Последнее редактирование:
Про грибы. Только сообразил, что 101 это тоже гриб, поэтому должно быть так

/* грыбы*/

#include <windows.h>
#include <winuser.h>
#include <iostream>
using namespace std;


/***************************************************************
Главный модуль
*****************************************************************/

void main()
{
int size = 0;
int octatok = 0;
char buf[255]; // включение русского языка в консоли
char res [9];

CharToOem("Введите количество грибов: ",buf);
CharToOem("Mы нашли ",res);
cout << buf;
cin >> size;
octatok=size;

if (size == 1) CharToOem(" гриб",buf);
else
{
while (true)
{
octatok=octatok%10;
if (octatok<9)break;
}
if (octatok == 1 && size!=11) CharToOem(" гриб",buf);
else
{
if (octatok == 2 || octatok == 3 || octatok == 4 ) CharToOem(" грибa",buf);
else CharToOem(" грибов",buf);

}
}

// Вывод результата

cout << res << size << buf<< endl;

cin.get();
}
 
По поводу грибов.
Если я правильно понимаю код, то:
while (true)
{
octatok=octatok%10;
if (octatok<9)break;
}
1. при числе оканчивающимся на "9" войдёт в бесконечный цикл
2. octatok%10 всегда будет < 10
поэтому логичнее будет написать вместо этого куска кода строчку:
Потом - если число равно "12", "13", "14" нужно выводить "грибов", а будет "гриба".

Предлагаю свой вариант:
Код:
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
int k;

	cout << "Введите количество грибов: ";
	cin >> k;

	cout << "Мы собрали: " << tmp << k << " ";

	if ((k > 10) && (k < 20))
		cout << "грибов";
	else
	{
		k %= 10;
		if (k == 1)
			cout << "гриб";
		else if ((k == 2) || (k == 3) || (k == 4))
			cout << "гриба";
		else
			cout << "грибов";
	}
}

Или, в случае если кодировка редактора и кодировка консоли различны и это Windows, то с перекодировкой:
Код:
#include <windows.h>
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
int k;
char tmp[256];

	CharToOem("Введите количество грибов: ", tmp);
	cout << tmp;
	cin >> k;

	CharToOem("Мы собрали: ", tmp);
	cout << tmp << k << " ";

	if ((k > 10) && (k < 20))
		CharToOem("грибов", tmp);
	else
	{
		k %= 10;
		if (k == 1)
			CharToOem("гриб", tmp);
		else if ((k == 2) || (k == 3) || (k == 4))
			CharToOem("гриба", tmp);
		else
			CharToOem("грибов", tmp);
	}
	cout << tmp << "\n";
}
 
Последнее редактирование:
С прогой по квадратам полностью согласен, но сделал бы чуть попроще вывод результата, и м.б. убрал бы жёсткую завязку на винды, но тут на вкус и цвет...
На всякий случай постю свой вариант :)
Код:
#include <iostream>

using namespace std;

bool pri(int &a, int &b)
// Приводит стороны так, что бы "a" было < "b"
// Если прямоугольник вырожденный - возвращает false
{
	if ((a == 0) || (b == 0))
		return false;
	if (a > b)
	{
	int t = a;
		a = b;
		b = t;
	}
	return true;
}

int main(int argc, char **argv)
{
int a, b;
	// Вводим параметры
	cout << "Enter a: ";
	cin >> a;

	cout << "Enter b: ";
	cin >> b;

	while( pri(a, b) ) // Выполняем пока прямоугольник не вырожденный
	{
		// Выводим размерность и количество для текущего квадрата
 		cout << "\n" << a << "x" << a << " : " << b / a;
		// Уменьшаем размер прямоугольника
		b %= a;
	};
}
 
Последнее редактирование:
Большое,как говорится,человеческое спасибо.
 
Здравствуйте! Мне жутко нужна помощь....Допуск к экзамену.... Нужно написать программу стекового калькулятора на Си(((( У меня никак не получается.... Вот условие самой задачи: "На входе - строка, содержащая выражение в постфиксной записи. На выходе - строка, результат вычислений.
пример:
ввод:
1 23 + 4 -
5 1 - *.
вывод:
80
Числа: целые неотрицательные.
Должны поддерживаться следующие двуместные арифметические операции: + - * /
Каждая из них берет аргумент со стека, сначала первый, потом - второй, выполняет над ним действие и результат помещает на вершину стека.
Кроме того должна поддерживаться операция '.' - она берет один аргумент со стека и печатает его на вывод."
Вот такая задача.... Заранее очень благодарна хоть в какой-то помощи))
 
Заранее очень благодарна хоть в какой-то помощи))

Ну если "хоть в какой-то"... Задайте поиск в Сети по ключевым словам "Польская запись", "Польская нотация". В принципе, как я понимаю, это оно и есть. Попадались мне и программы на СИ. Больше ничем помочь, увы, не могу.
 
Вот, набросал стековый калькулятор
Только сам калькулятор - ввод с клавиатуры не реализовывал, сейчас подумаю...
Но считает и выводит на экран по условию задачи тут прописан пример - умножает числа 3, 5 и выводит на экран.
Код:
#include <stdio.h>

#define STACK_LENGTH 20

/* Переменные для хранения стека */
int Stack_Count;
int Stack_Array[STACK_LENGTH];


/* Функции самого стека */
void push(int n) /* Добавить элемент в стек */
{
	if( Stack_Count < STACK_LENGTH )
		Stack_Array[Stack_Count++] = n;
}

int pop() /* Извлечь элемент из стека */
{
	if(Stack_Count != 0)
		return Stack_Array[--Stack_Count];
	else
		return 0;
}

void init() /* Начальная инициализация стека*/
{
	Stack_Count = 0;
}


/* Функции стекового калькулятора */
void add() /* Сложение */
{
	push( pop() + pop() );
}

void sub() /* Вычетание */
{
	push( pop() - pop() );
}

void mul() /* Умножение */
{
	push( pop() * pop() );
}

void div() /* Деление */
{
	push( pop() / pop() );
}

void print() /* Печать последнего элемента */
{
	printf( "Last: %d\n", pop() );
}

/* Главная функция */
int main()
{
	init();
	push(3);
	push(5);
	mul();
	
	print();

	return 0;
}
 
Последнее редактирование:
Вот окончательная версия: принимает от пользователя строки и обрабатывает их, как только вводится строка начинающаяся с символа решетки ('#') сразу прекращает работу.
Элементы должны быть разделены между собой пробелами.
Т.е. так:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACK_LENGTH 80
#define BUFFER_LENGTH 81

/* Переменные для хранения стека */
int Stack_Count;
int Stack_Array[STACK_LENGTH];


/* Функции самого стека */
void stack_push(int n) /* Добавить элемент в стек */
{
	if( Stack_Count < STACK_LENGTH )
		Stack_Array[Stack_Count++] = n;
}

int stack_pop() /* Извлечь элемент из стека */
{
	if(Stack_Count != 0)
		return Stack_Array[--Stack_Count];
	else
		return 0;
}

void stack_init() /* Начальная инициализация стека*/
{
	Stack_Count = 0;
}


/* Функции стекового калькулятора */
void stack_add() /* Сложение */
{
	stack_push( stack_pop() + stack_pop() );
}

void stack_sub() /* Вычетание */
{
	stack_push( stack_pop() - stack_pop() );
}

void stack_mul() /* Умножение */
{
	stack_push( stack_pop() * stack_pop() );
}

void stack_div() /* Деление */
{
	stack_push( stack_pop() / stack_pop() );
}

void stack_print() /* Печать последнего элемента */
{
	printf( "Last: %d\n", stack_pop() );
}

/* Функции работы с пользователем */
void parse(char *str) /* Функция распознавания строки */
{
char *st;

	for(st = strtok(str, " "); st != NULL; st = strtok(NULL, " "))
	{
		switch(*st)
		{
			case '+':
				stack_add();
				break;
			case '-':
				stack_sub();
				break;
			case '*':
				stack_mul();
				break;
			case '/':
				stack_div();
				break;
			case '.':
				stack_print();
				break;
			default:
				stack_push(atoi(st));
				break;
		}
	}
}


/* Главная функция */
int main()
{
char buf[BUFFER_LENGTH];

	stack_init(); // Инициализируем стек

	buf[0] = BUFFER_LENGTH; // Устанавливаем максимальную длину буфера ввода

	printf( "Введите строки для вычисления:\n" );
	printf( "(для выхода введите строку, начинающуюся с символа '#')\n" );

	for( scanf("%s", buf); (strlen(buf) > 0) && (buf[0] != '#'); scanf("%s", buf) ) // Запрашиваем строки и выполняем их
		parse(buf);
	
	return 0;
}

Ну вот как-то так...

P.S. Немного исправил имена (pop на stack_pop и т.д.) для лучшей понятности.
 
Очень выручили!!!! Просто ОГРОМНОЕ спасибо)))))
 
Упс...одна строчка лишняя затесалась!!!
На работу программы она никак не влияет, но все-таки она лишня!!!!!
Я сначала через cgets ввод делал - потом вспомнил что он не везде есть)

Вот эту строчку из main убрать надо:
Код:
buf[0] = BUFFER_LENGTH; // Устанавливаем максимальную длину буфера ввода

Вот окончательная версия:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACK_LENGTH 80
#define BUFFER_LENGTH 81

/* Переменные для хранения стека */
int Stack_Count;
int Stack_Array[STACK_LENGTH];


/* Функции самого стека */
void stack_push(int n) /* Добавить элемент в стек */
{
	if( Stack_Count < STACK_LENGTH )
		Stack_Array[Stack_Count++] = n;
}

int stack_pop() /* Извлечь элемент из стека */
{
	if(Stack_Count != 0)
		return Stack_Array[--Stack_Count];
	else
		return 0;
}

void stack_init() /* Начальная инициализация стека*/
{
	Stack_Count = 0;
}


/* Функции стекового калькулятора */
void stack_add() /* Сложение */
{
	stack_push( stack_pop() + stack_pop() );
}

void stack_sub() /* Вычетание */
{
	stack_push( stack_pop() - stack_pop() );
}

void stack_mul() /* Умножение */
{
	stack_push( stack_pop() * stack_pop() );
}

void stack_div() /* Деление */
{
	stack_push( stack_pop() / stack_pop() );
}

void stack_print() /* Печать последнего элемента */
{
	printf( "Last: %d\n", stack_pop() );
}

/* Функции работы с пользователем */
void parse(char *str) /* Функция распознавания строки */
{
char *st;

	for(st = strtok(str, " "); st != NULL; st = strtok(NULL, " "))
	{
		switch(*st)
		{
			case '+':
				stack_add();
				break;
			case '-':
				stack_sub();
				break;
			case '*':
				stack_mul();
				break;
			case '/':
				stack_div();
				break;
			case '.':
				stack_print();
				break;
			default:
				stack_push(atoi(st));
				break;
		}
	}
}


/* Главная функция */
int main()
{
char buf[BUFFER_LENGTH];

	stack_init(); // Инициализируем стек

	printf( "Введите строки для вычисления:\n" );
	printf( "(для выхода введите строку, начинающуюся с символа '#')\n" );

	for( scanf("%s", buf); (strlen(buf) > 0) && (buf[0] != '#'); scanf("%s", buf) ) // Запрашиваем строки и выполняем их
		parse(buf);
	
	return 0;
}

P.S. Сорри всем что новым постом кидаю - если старый править то не заметят боюсь))
 
здравствуйте!буду очень признательна, если поможете!
нужно написать программу в си!
заключается в следующем:
"реализовать модуль для работы с очередью из целых чисел через двусвязный список.
должны быть:
struct InQueue {
...
};

int enqueue(struct IntQueue *q, int x);
int dequeue(struct IntQueue *q, int *x);
void init_queue(struct IntQueue *q);
void free_queue(struct ....);

+тестирующая программа"

очень очень буду благодарна!
 
здравствуйте, у меня большая проблема((, задача на зачет никак не получается, помогите, буду превысоко благодарен...

вот текст задачи:

Сортировка строк текста считанных с stdin. Сохранить в динамической памяти, массив. метод сортировки-выборкой. Результат на stdout.

P.S. очень нужно, вопрос жизни и смерти...
 
здравствуйте!буду очень признательна, если поможете!
нужно написать программу в си!
заключается в следующем:
"реализовать модуль для работы с очередью из целых чисел через двусвязный список.
должны быть:
struct InQueue {
...
};

int enqueue(struct IntQueue *q, int x);
int dequeue(struct IntQueue *q, int *x);
void init_queue(struct IntQueue *q);
void free_queue(struct ....);

+тестирующая программа"

очень очень буду благодарна!

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

Вот, набросал тут, сама очередь работает - прогнал её пару раз по тестам.
Тестирующую программу посмотрю гляну когда будет больше времени, если к этому моменту тут никто не допишет)

Код:
#include <stdio.h>

#define MAXCOUNT 100

#define FAIL 0;
#define SUCCESS 1;

struct IntQueue
{
	int Array[MAXCOUNT];
	int *first;
	int count;
};

int enqueue(struct IntQueue *q, int x)
{
int *next = q->first + q->count;

	if(q->count >= MAXCOUNT)
		return FAIL;

	q->count++;
	*next = x;

	return SUCCESS;
}

int dequeue(struct IntQueue *q, int *x)
{
	if(q->count < 1)
		return FAIL;

	*x = *(q->first);

	if(q->first == q->Array + MAXCOUNT)
		q->first = q->Array;
	else
		q->first++;

	q->count--;

	return SUCCESS;
}

void init_queue(struct IntQueue *q)
{
	q->first = q->Array;
	q->count = 0;
}

void free_queue(struct IntQueue *q)
{
	q->count = 0;
}

int main()
{
struct IntQueue it;
int n;

	init_queue( &it );
	
	enqueue( &it, 5 );
	enqueue( &it, 6 );
	enqueue( &it, 7 );
	
	dequeue( &it, &n );
	printf( "Первое: %d\n", n );

	dequeue( &it, &n );
	printf( "Второе: %d\n", n );

	dequeue( &it, &n );
	printf( "Третье: %d\n", n );

}


здравствуйте, у меня большая проблема((, задача на зачет никак не получается, помогите, буду превысоко благодарен...

вот текст задачи:

Сортировка строк текста считанных с stdin. Сохранить в динамической памяти, массив. метод сортировки-выборкой. Результат на stdout.

P.S. очень нужно, вопрос жизни и смерти...

До какого времени актуально? Задача не сложная, помочь могу, но банально не хватает времени.
 
Назад
Сверху