Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2009, 17:57   #1
Wi1D
Кибернетик
Форумчанин
 
Аватар для Wi1D
 
Регистрация: 22.10.2008
Сообщений: 142
Радость работа с stream

Не могли бы вы мне подсказать почему программа работает только первый раз. НА второй раз она просто пролетает все cin.getline
Я так думаю она из буфера хапает лишнего!как это обойти???вот код
Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
using namespace std;
 
class FRACTION {		//новый класс
private:
	int chis,znam,cel;		//числитель и знаменатель и целая часть
public:
	void set(int new_chis,int new_znam); // задание самой дроби
	int get_chis(); //получение значения числителя
	int get_znam(); //получение значения знаменателя
	int get_cel(); //получение целой части
	void sokr_and_vid(); //сокращаем и выделяем целую часть
 
};
int NOZ(int znam1, int znam2);//наименьший общий знаменатель
void RussianMessage(char *str);
 
void main()  //основная программа
{	FRACTION FR1,FR2,FR3;//дроби
    char stroka[51]; //строка введённая пользователем
	char Scel[20],Schis[20],Sznam[20];
	char knopka,tek_action;
	int znak_minys=0,tcel=0,tchis=0,tznam=0,i,j;//знак в конце.счетчик.и темповские значения	
	RussianMessage("Курсовая работа <Интерпретатор>!Cтудент 1 группы Иванов Иван");cout <<endl;
while (1)
{	FR1.set(0,0);
	FR2.set(0,0);
	FR3.set(0,0);
	tek_action=0;
	j=i=0;
	RussianMessage("Продолжить?!Нажмите n для выхода");	
	
	knopka=getch();
	if (knopka=='n') return;
	system("cls");
	RussianMessage("Введите вашу первую дробь в формате целая часть|числитель/знаменатель \n");
	cin.get(stroka,30);
	if (stroka=="\n") cin.getline(stroka,30);
	while (stroka[i] == ' ') i++;
	if (stroka[i]!= '\0')
	{while (stroka[i] != '|') Scel[j++]=stroka[i++];
	tcel=atoi(Scel);
	j=0;
	i++;
	while  (stroka[i] != '/') Schis[j++]=stroka[i++];
	tchis=atoi(Schis);
	j=0;
	i++;
	while  (stroka[i] != '\0') Sznam[j++]=stroka[i++];
	tznam=atoi(Sznam);
	}
	tchis=tcel*tznam+tchis;
	FR1.set(tchis,tznam);
	RussianMessage("Первая дробь в неправильном виде");
	cout <<endl;	
	cout <<FR1.get_chis()<<"/"<<FR1.get_znam()<<endl;
 
	RussianMessage("Введите вашу вторую дробь в формате целая часть|числитель/знаменатель \n");
	cin.ignore();
	cin.get(stroka,30);
	while (stroka[i] == ' ') i++;
	if (stroka[i]!= '\0')
	{while (stroka[i] != '|') Scel[j++]=stroka[i++];
	tcel=atoi(Scel);
	j=0;
	i++;
	while  (stroka[i] != '/') Schis[j++]=stroka[i++];
	tchis=atoi(Schis);
	j=0;
	i++;
	while  (stroka[i] != '\0') Sznam[j++]=stroka[i++];
	tznam=atoi(Sznam);
	}
	tchis=tcel*tznam+tchis;
	FR2.set(tchis,tznam);
	RussianMessage("Вторая дробь в неправильном виде");
	cout <<endl;	
	cout <<FR2.get_chis()<<"/"<<FR2.get_znam()<<endl;
 
	RussianMessage("Введите нужное действие");
	cout <<endl;
	RussianMessage("Для сложения введите 1");
	cout <<endl;
	RussianMessage("Для вычитания введите 2");
	cout <<endl;
	RussianMessage("Для умножения введите 3");
	cout <<endl;
	RussianMessage("Для деления введите 4");
	cout <<endl;
	RussianMessage("Для сравнения введите 5");
	cout <<endl;
	tek_action=getch();
	switch (tek_action) {
		case '1':
			FR1.set((NOZ(FR1.get_znam(),FR2.get_znam())*FR1.get_chis())/FR1.get_znam(),NOZ(FR1.get_znam(),FR2.get_znam()));			
			FR2.set((NOZ(FR1.get_znam(),FR2.get_znam())*FR2.get_chis())/FR2.get_znam(),NOZ(FR1.get_znam(),FR2.get_znam()));			
			FR3.set((FR1.get_chis()+FR2.get_chis()),FR1.get_znam());
			FR3.sokr_and_vid();
			RussianMessage("Полученный результат");
			cout << endl << FR3.get_cel()<<"|"<<FR3.get_chis()<<"/"<<FR3.get_znam()<<endl;
			break;
		case '2':
			FR1.set((NOZ(FR1.get_znam(),FR2.get_znam())*FR1.get_chis())/FR1.get_znam(),NOZ(FR1.get_znam(),FR2.get_znam()));			
			FR2.set((NOZ(FR1.get_znam(),FR2.get_znam())*FR2.get_chis())/FR2.get_znam(),NOZ(FR1.get_znam(),FR2.get_znam()));			
			FR3.set((FR1.get_chis()-FR2.get_chis()),FR1.get_znam());
			FR3.sokr_and_vid();
			RussianMessage("Полученный результат");
			cout << endl << FR3.get_cel()<<"|"<<FR3.get_chis()<<"/"<<FR3.get_znam()<<endl;
			break;
		case '3':
			FR3.set((FR1.get_chis()*FR2.get_chis()),(FR1.get_znam()*FR2.get_znam()));
			FR3.sokr_and_vid();
			RussianMessage("Полученный результат");
			cout << endl << FR3.get_cel()<<"|"<<FR3.get_chis()<<"/"<<FR3.get_znam()<<endl;
			break;
		case '4':
			FR3.set((FR1.get_chis()*FR2.get_znam()),(FR1.get_znam()*FR2.get_chis()));
			FR3.sokr_and_vid();
			RussianMessage("Полученный результат");
			cout << endl << FR3.get_cel()<<"|"<<FR3.get_chis()<<"/"<<FR3.get_znam()<<endl;
			break;
		case '5':
			cout << "not work";
			break;
		default:
			cout <<endl;			
			RussianMessage("Введите корректно дробь и правильно выберите действие!");
			cout <<endl;
			break;}
 }
}
не существует идеальных программ...и людей тоже..
<== P.S. если я тебе помог нажми весы слева <==

Последний раз редактировалось BDA; 31.07.2018 в 20:32.
Wi1D вне форума Ответить с цитированием
Старый 29.12.2009, 18:54   #2
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Как всегда, перед cin.getline поставь cin.clear() или cin.ingone(20,'\n');
поиграйся этими функциями
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 29.12.2009, 19:03   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от RoS Посмотреть сообщение
Как всегда, перед cin.getline поставь cin.clear() или cin.ingone(20,'\n');
поиграйся этими функциями
cin.clear()? Она сбрасывает флаги ошибок, она не очищает входной буфер. cin.ignore() верно ) Ещё можно использовать cin.sync(), только он не везде работает, кстати кто-нибудь не подскажет почему? )
netrino вне форума Ответить с цитированием
Старый 29.12.2009, 20:06   #4
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
cin.clear()? Она сбрасывает флаги ошибок, она не очищает входной буфер. cin.ignore() верно ) Ещё можно использовать cin.sync(), только он не везде работает, кстати кто-нибудь не подскажет почему? )
Наверное, потому что это синхронизация буффера с потоком, т.е. подгон потока под тот буфер, в который вводилось cin'ом, а ignore это взятие и отбрасывание символов из потока в принципе...Хотя я в этом не силен
Но ясно одно - что у функция похожее назначение и пока ты на этом собаку не съешь - не разберешься!
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 29.12.2009, 21:13   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от RoS Посмотреть сообщение
Наверное, потому что это синхронизация буффера с потоком, т.е. подгон потока под тот буфер, в который вводилось cin'ом, а ignore это взятие и отбрасывание символов из потока в принципе...Хотя я в этом не силен
Но ясно одно - что у функция похожее назначение и пока ты на этом собаку не съешь - не разберешься!
Да при чём здесь собаки ))
В стандарте написано, что оно синхронизирует буфер и убирает все символы из входного потока
http://cplusplus.com/reference/iostream/istream/sync/
При чём это обычно действительно работает
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
stream services( потоковый сервис) 13th Свободное общение 2 27.12.2009 22:39
Работа с объектом ADODB.Stream voam Microsoft Office Excel 4 15.12.2009 23:31
Variant to Stream & Variant from Stream Oreol Общие вопросы Delphi 1 24.03.2009 13:14
Socket vs Stream JoanM Работа с сетью в Delphi 1 01.04.2008 10:10