Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 15.12.2012, 18:06   #1
Gnomowar
Новичок
 
Аватар для Gnomowar
 
Регистрация: 27.04.2012
Сообщений: 4
Репутация: 10

skype: gnomowar
По умолчанию Нужно найти ошибку.

Всем привет, есть следующий код программы, вычисляющей среднее арфм. и среднее геометрич. двух чисел, а так же периметр трапеции по двум основаниям и высоте.

Код:

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <limits.h>

int proga2() {
	int del, letters, probel, n, minus, tochka, error;
	float chislo, h, a, b, p, c;
	char ch,exit;
	while(1)
	{
	letters = probel = minus = tochka = n = error = 0;
	chislo = -1;
	del = 1;

	printf("Vvedite vusoty i 2 osnovaniya \n");

	do {
		scanf("%c", &ch);
		if(ch>=INT_MAX)
			{printf("Error");
		return 0;
		}
		if (ch == ' ' && n == 0) 
			letters = 0;
		else if (ch == '-' && n == 0) {
			++ minus;
			++n;
		}
		else if ((ch == ',' || ch == '.') && tochka == 0) {
			++tochka;
			++n;
		}
		else if (ch < '0' || ch > '9') {
			++letters;
			++n;
		} 
		else if ((ch == '0' && chislo == 0) && tochka == 0) {
			++ letters;
			chislo = -1;
			++n;
		}
		else {
			if (chislo < 0)
				chislo = 0;
			chislo = chislo * 10 + ch - '0';
			if (tochka > 0)
				del *= 10;
			++n;
		}

	} while (letters == 0);

	if (letters > 1 || chislo < 0) 
		++error;
	else if (letters == 1 && chislo == 0 && minus > 0)
		++ error;
	else {
		if (minus == 1)
			chislo *= -1;
		chislo /= del;
		h = chislo;
	}

	if ((letters == 1 && n > 1) && (ch == ' ' || ch =='\n')) {
		letters = probel = minus = tochka = n = 0;
		chislo = -1;
		del = 1;

		do {
			scanf("%c", &ch);
			if(ch>=INT_MAX)
			{printf("Error");
		return 0;
		}
			if (ch == ' ' && n == 0) 
				letters = 0;
			else if (ch == '-' && n == 0) {
				++ minus;
				++n;
			}
			else if ((ch == ',' || ch == '.') && tochka == 0) {
				++tochka;
				++n;
			}
			else if (ch < '0' || ch > '9') {
				++letters;
				++n;
			} 
			else if ((ch == '0' && chislo == 0) && tochka == 0) {
				++ letters;
				chislo = -1;
				++n;
			}
			else {
				if (chislo < 0)
					chislo = 0;
				chislo = chislo * 10 + ch - '0';
				if (tochka > 0)
					del *= 10;
				++n;
			}

		} while (letters == 0);

		if (letters > 1 || chislo < 0) 
			++error;
		else if (letters == 1 && chislo == 0 && minus > 0)
			++ error;
		else {
			if (minus == 1)
				chislo *= -1;
			chislo /= del;
			a = chislo;
		}
	}

	if ((letters == 1 && n > 1) && (ch == ' ' || ch =='\n')) {
		letters = probel = minus = tochka = n = 0;
		chislo = -1;
		del = 1;

		do {
			scanf("%c", &ch);
			if(ch>=INT_MAX)
			{printf("Error");
		return 0;
		}
			if (ch == ' ' && n == 0) 
				letters = 0;
			else if (ch == '-' && n == 0) {
				++ minus;
				++n;
			}
			else if (ch == ' ' && n > 0) 
				++ probel;
			else if ((ch == ',' || ch == '.') && tochka == 0) {
				++tochka;
				++n;
			}
			else if (ch < '0' || ch > '9') {
				++letters;
				++n;
			} 
			else if ((ch == '0' && chislo == 0) && tochka == 0) {
				++ letters;
				chislo = -1;
				++n;
			}
			else {
				if (chislo < 0)
					chislo = 0;
				chislo = chislo * 10 + ch - '0';
				if (tochka > 0)
					del *= 10;
				if (probel > 0)
					++ letters;
				++n;
			}

		} while (letters == 0);

		if (letters > 1 || chislo < 0) 
			++error;
		else if (letters == 1 && chislo == 0 && minus > 0)
			++ error;
		else {
			if (minus == 1)
				chislo *= -1;
			chislo /= del;
			b = chislo;
		}
	}

	if (error > 0)
		printf("Error\n");
	else if (h <= 0 || a <= 0 || b <= 0)
			printf("Error\n");
	else if (a == b)
		printf("Error\n");
	else {
		if (a > b)
			c = sqrt(pow((a - b) / 2, 2) + pow(h, 2));
		else
			c = sqrt(pow((b - a) / 2, 2) + pow(h, 2));

		p = 2 * c + a + b;
		printf("Perimetr = %6.4f", p);

	}
	printf("\nesli xotite vuiti, vvedite `");
   exit=getch();
   if(exit=='`')
	   return 0;
	}
	}

Код в следующем сообщении, сюда не влез из-за обилия строк, реализующих защиту от ввода ненужных символов.

Если при попытке произвести расчет ср. арифметического и геометрического ввести буквы, появляется такая ошибка: "Run-Time Check Failure #3 - The variable 'a' is being used without being initialized.", хотя программа должна написать "Error" и предложить ввести значения еще раз (что она и делает при нахождении Р трапеции, правда и там есть баг, который я еще не разобрал).
Как это исправить?
Gnomowar вне форума   Ответить с цитированием
Старый 15.12.2012, 18:08   #2
Gnomowar
Новичок
 
Аватар для Gnomowar
 
Регистрация: 27.04.2012
Сообщений: 4
Репутация: 10

skype: gnomowar
По умолчанию

Продолжение кода.

Код:

int proga1()
	{
		int del, letters, probel, n, minus, tochka, error;
	float chislo,a, b,h, p, c,arifm,geom;
	char ch,exit;
	while(1)
	{
	letters = probel = minus = tochka = n = error = 0;
	chislo = -1;
	del = 1;

	printf("Vvedite 2 chisla \n");

			do {
		scanf("%c", &ch);
		if(ch>=INT_MAX)
		{printf("Error");

		return 0;
		}
			if (ch == ' ' && n == 0) 
			letters = 0;
		else if (ch == '-' && n == 0) {
			++ minus;
			++n;
		}
		else if ((ch == ',' || ch == '.') && tochka == 0) {
			++tochka;
			++n;
		}
		else if (ch < '0' || ch > '9') {
			++letters;
			++n;
		} 
		else if ((ch == '0' && chislo == 0) && tochka == 0) {
			++ letters;
			chislo = -1;
			++n;
		}
		else {
			if (chislo < 0)
				chislo = 0;
			chislo = chislo * 10 + ch - '0';
			if (tochka > 0)
				del *= 10;
			++n;
		}

	} while (letters == 0);

	if (letters > 1 || chislo < 0) 
		++error;
	else if (letters == 1 && chislo == 0 && minus > 0)
		++ error;
	else {
		if (minus == 1)
			chislo *= -1;
		chislo /= del;
		h = chislo;
	}

	if ((letters == 1 && n > 1) && (ch == ' ' || ch =='\n')) {
		letters = probel = minus = tochka = n = 0;
		chislo = -1;
		del = 1;

		do {
			scanf("%c", &ch);
			if(ch>=INT_MAX)
			{printf("Error");
		return 0;
		}
			if (ch == ' ' && n == 0) 
				letters = 0;
			else if (ch == '-' && n == 0) {
				++ minus;
				++n;
			}
			else if ((ch == ',' || ch == '.') && tochka == 0) {
				++tochka;
				++n;
			}
			else if (ch < '0' || ch > '9') {
				++letters;
				++n;
			} 
			else if ((ch == '0' && chislo == 0) && tochka == 0) {
				++ letters;
				chislo = -1;
				++n;
			}
			else {
				if (chislo < 0)
					chislo = 0;
				chislo = chislo * 10 + ch - '0';
				if (tochka > 0)
					del *= 10;
				++n;
			}

		} while (letters == 0);

		if (letters > 1 || chislo < 0) 
			++error;
		else if (letters == 1 && chislo == 0 && minus > 0)
			++ error;
		else {
			if (minus == 1)
				chislo *= -1;
			chislo /= del;
			a = chislo;
		}
	}

	

	if (error > 0)
		printf("Error\n");
    arifm=(a+h)/2;
	printf("Arifm = %f",arifm);
	if(a<0 || h<0)
		{printf("Error\n");
	    getch();
		return 0;}
	geom=a*h/2;
	printf("Geometr = %f",geom);
	printf("\nesli xotite vuiti, vvedite `");
   exit=getch();
   if(exit=='`')
	   return 0;
	}
	}			
	
	int main ()
	{
	int err=0;
	int q;
		do{	
		printf ("1 -proga1\n2 - proga2\n3 - vihod\n");
		q=getch();
		switch (q)
		{case '1':
			proga1();
			return 0;					
		case '2':
			proga2();
			return 0;
		case '3':
			return 0;
		}
	}while (err == 0);
	getch();
}

Gnomowar вне форума   Ответить с цитированием
Старый 15.12.2012, 18:15   #3
Gnomowar
Новичок
 
Аватар для Gnomowar
 
Регистрация: 27.04.2012
Сообщений: 4
Репутация: 10

skype: gnomowar
По умолчанию

Так же имеется такая проблема: при вводе букв, вторая часть программы корректно сообщает об ошибке и предлагает ввести значения еще раз, но при попытке ввести хоть что-то, несколько раз дублирует свое предложения, крича Error!, и спустя несколько таких возгласов, позволяет мне ввести символы. Черт знает, что не так, подскажите, буду благодарен.
Gnomowar вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно найти ошибку в коде helldog Помощь студентам 0 03.01.2012 07:10
нужно найти ошибку pandaaaaa Помощь студентам 0 27.12.2011 21:26
нужно найти ошибку!!!!! C++ Wector Visual C++ 1 09.12.2011 18:49
Нужно найти ошибку в программе potap777 Помощь студентам 2 09.01.2011 19:19
нужно найти ошибку Стёпыш Помощь студентам 5 08.12.2009 19:13


17:34.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru