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

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

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


Ответ
 
Опции темы
Старый 05.01.2010, 14:39   #1
Ongi
 
Регистрация: 05.01.2010
Сообщений: 4
По умолчанию ошибка error C2043: illegal break

Всем доброго дня.
При компиляции программы, в подпрограмме появляется ошибка error C2043: illegal break. Подпрограмма должна найти среднее арифметическое положительных элементов с четными номерами
Вот код подпрограммы:
Код:
double first (int*mass,int x) //положительные элементы с четным номерами 
{
	int i,l=0,sum=0;
	double sa;
	printf("введите первый массив\n");
	for(i=0;i<x;i++)
	{
		printf("mass[%d]=",i);
		scanf("%d",&mass[i]);
	}
	for(i=0;i<x;i++)
		if(mass[i]>0 && i%2==0)
		{
			sum=sum+mass[i];
			l++;
		}
	if (sum==0)
	{
		printf ("подходящих элементов нет\n");
		break;
	}
	sa=sum/l;
	printf("среднее арифметическое \n");
	printf ("sa=%lf\n",sa);
	return sa;
}
Ongi вне форума Ответить с цитированием
Старый 05.01.2010, 15:12   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

а что break делает в теле if`а ??? он ставится только в циклах (и то, далеко не всегда он там нужен) и в switch`ах.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 05.01.2010 в 15:16.
ROD вне форума Ответить с цитированием
Старый 05.01.2010, 15:22   #3
Ongi
 
Регистрация: 05.01.2010
Сообщений: 4
По умолчанию

Если включить if, где находится break, в цикл, то программа вылетает с ошибкой (приложение будет закрыто)...
Можно ли как-то по-другому остановить работу подпрограммы? Сразу после нее должна включиться другая подпрограмма.
Ongi вне форума Ответить с цитированием
Старый 05.01.2010, 15:58   #4
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

если тебе надо остановить работу подпрограммы, то надо писать return; (если она ничего не возвращает (типа void)) или return 0; (или любое другое значение или переменная) в том месте, где подпрограмма должна закончить свою работу.

К тому же у вас во втором цикле for очевидная ошибка - если тело цикла не поммещено в фигурные скобки, то телом считается следующая за циклом строка


Рекомендую это
Код:
for(i=0;i<x;i++)
		if(mass[i]>0 && i%2==0)
		{
			sum=sum+mass[i];
			l++;
		}
заменить на это

Код:
for(i=0;i<x;i++)
{
		if(mass[i]>0 && i%2==0)
		{
			sum=sum+mass[i];
			l++;
		}
}
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 05.01.2010 в 16:00.
ROD вне форума Ответить с цитированием
Старый 05.01.2010, 16:16   #5
Ongi
 
Регистрация: 05.01.2010
Сообщений: 4
По умолчанию

ROD, спасибо вам большое за помощь.
По поводу return: загвоздка была в том, что в одном случае (если не попадала на второй if) подпрограмма должна была возвращать sa, а в другом - нет.

Решение оказалось простым )) надо было изменить условие второго if на противоположное.
Код:
double first (int*mass,int x) 
{
	int i,l=0;
	double sa;
	int sum=0;
	printf("Введите первый массив\n");
	for(i=0;i<x;i++)
	{
		printf("mass[%d]=",i);
		scanf("%d",&mass[i]);
	}
	for(i=0;i<x;i++)
	{
		if((mass[i]>0) && (i%2==0))
		{
			sum=sum+mass[i];
			l++;
		}
	}
	if (sum!=0) //было if (sum==0)
	{
	sa=sum/l;
	printf("среднее арифметическое\n");
	printf ("sa=%lf\n",sa);
	}
	else printf ("положительных элементов нет\n");
	return sa;
}
Теперь все работает как надо
Ongi вне форума Ответить с цитированием
Старый 04.01.2012, 20:28   #6
krugolet
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 11
По умолчанию

Здравствуйте!
Дабы не плодить лишних тем, задам свой вопрос здесь, ведь тема та же.

Вычисляю сумму ряда.
код:
Код:
#include<stdio.h>
#include<math.h>

int main()
{
	const int maxIter = 50;
	double x, eps;
	int done = 1, n;
	double ch =1, y = ch;
	printf("Input argument and precision:");
	scanf("%lf %lf", &x, &eps);
	printf("arg=%lf  eps=%lf", x, eps);

	for(n = 0; fabs(ch)>eps; n++);
	{
		ch *= x*x/((2*n+1)*(2*n+2));
		y += ch;
		if(n>maxIter) 
		{
			printf("\nRyad rashoditsya!!!\n");
			done = 0; 
			break;
		}	
	}
	if(done)
	{
		printf("The function value y = %lf for x = %lf\n", y, x);
		printf("have been calculated after %d iterations\n", n);
	}
	return 0;
}
компилятор ругается ошибкой error C2043: illegal break

break используется для аварийного выхода из цикла при превышении определенного количества итераций.
krugolet вне форума Ответить с цитированием
Старый 04.01.2012, 20:48   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
К тому же у вас во втором цикле for очевидная ошибка - если тело цикла не поммещено в фигурные скобки, то телом считается следующая за циклом строка
Вы ошибаетесь. Ниже представленные варианты кода делают абсолютно одинаковые действия:

Код:
for(i=0;i<x;i++) if(mass[i]>0 && i%2==0) { sum=sum+mass[i]; l++; }
Код:
for(i=0;i<x;i++)
{
		if(mass[i]>0 && i%2==0) { sum=sum+mass[i]; l++; }
}
Телом цикла может быть либо блок, либо действие. Причем, блок - это кучка действий, которые компилятор будет воспринимать, как одно большое действие. Поэтому можно сказать, что туловищем цикла всегда является действие (блочное, или обычное).

В первом случае компилятор посчитает телом цикла только одно действие:

Код:
for(i=0;i<x;i++)  if(mass[i]>0 && i%2==0) { sum=sum+mass[i]; l++; } //условие, со всем своим блоком -это одно простое не_блочное действие
Во втором случае, действием является блок. То есть блок воспринимается, как одно большое действие.

Конечно, выделять туловище цикла фигурными скобками - предпочтительнее, ибо лучше читается, проще понять, и меньше вероятность допустить ошибку. Лично я всегда заключаю туловище цикла в фигурные скобки (даже если оно в одно простое действие).

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

Последний раз редактировалось _Bers; 04.01.2012 в 21:07.
_Bers вне форума Ответить с цитированием
Старый 04.01.2012, 20:55   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от krugolet Посмотреть сообщение
Здравствуйте!
Дабы не плодить лишних тем, задам свой вопрос здесь, ведь тема та же.

Вычисляю сумму ряда.
код:
Код:
#include<stdio.h>
#include<math.h>

int main()
{
	const int maxIter = 50;
	double x, eps;
	int done = 1, n;
	double ch =1, y = ch;
	printf("Input argument and precision:");
	scanf("%lf %lf", &x, &eps);
	printf("arg=%lf  eps=%lf", x, eps);

	for(n = 0; fabs(ch)>eps; n++); //<---- очень внимательно смотрим сюда
	{
		ch *= x*x/((2*n+1)*(2*n+2));
		y += ch;
		if(n>maxIter) 
		{
			printf("\nRyad rashoditsya!!!\n");
			done = 0; 
			break;
		}	
	}
	if(done)
	{
		printf("The function value y = %lf for x = %lf\n", y, x);
		printf("have been calculated after %d iterations\n", n);
	}
	return 0;
}
компилятор ругается ошибкой error C2043: illegal break

break используется для аварийного выхода из цикла при превышении определенного количества итераций.

1. См комментарий в коде.
2. Перечитываем сообщение написанное мною чуть выше.
3. Задаём себе вопрос: что означает символ ';' для компилятора? Зачем этот символ стоит после объявления цикла, и что подумает компилятор, когда увидит этот символ?

Последний раз редактировалось _Bers; 04.01.2012 в 20:58.
_Bers вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка I/O error 104 ptz2010 Общие вопросы Delphi 8 31.03.2009 20:45
Ошибка I/O error 6 Волк Общие вопросы Delphi 8 09.02.2009 15:12
ERROR:Illegal indexing mode IgorKr Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 14.12.2008 00:54
Ошибка(C++): error C2041: illegal digit '9' for base '8' TheWanderer Общие вопросы C/C++ 4 02.10.2008 21:11
ошибка I/O error 32 kolduev Помощь студентам 7 29.02.2008 21:22