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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2017, 14:46   #1
Сергей_ИСН
Новичок
Джуниор
 
Регистрация: 22.08.2017
Сообщений: 4
Вопрос Гении отзовитесь, нужна ваша помощь.

Люди помогите вторую неделю мучаюсь не могу найти причину не выполняется удаление элементов в одномерном массиве.
Условие задачи:
Составить программу для ОДНОМЕРНОГО МАССИВА в виде меню.

1. Заполнить массив:
1.1 заполнить вручную.
1.2 заполнить случайным образом.
2. Вывод массива.
3. Рассчитать сумму элементов массива.
4. Рассчитать среде арифметическое.
5. Найти максимальный элемент массива.
6. Найти минимальный элемент массива.
7. Сортировка:
7.1 по возрастанию.
7.2 по убыванию.
8. Удаление:
8.1 по номеру элемента.
8.2 по значению элемента.
9. Выход.

Следующая проблема:
- произвожу заполнения массива случайным образом (Выбираю в меню пункт 1 потом пункт 2). Массив формируется.
- выбираю пункт 8 (удаление). И пункт 2 в подменю (удаления по значению элемента).
И вот тут начинается мистика. Либо сразу пишет что такого элемента нет или со 2-3 попутке при выборе этого пункта.
ПОМОГИТЕ!!!!!!!
Сергей_ИСН вне форума Ответить с цитированием
Старый 22.08.2017, 14:51   #2
Сергей_ИСН
Новичок
Джуниор
 
Регистрация: 22.08.2017
Сообщений: 4
По умолчанию

//Код программы:

Код:
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <process.h>
#include <locale.h>
#define Pi 3.1415926
#include <windows.h>
#include <stdlib.h>					//генератор случайных чисел
#include <time.h>					// время
#include <cmath>


//Задание ()

main()
{
	setlocale(LC_ALL,"RUS");
	srand(time(NULL));
		
	int i,n,nn,k,j,nom,Zm,nom1;
	double a[30],sor[30],Sum;
	
	nom=Zm=0;
	do{
		printf("\n 		--МЕНЮ--  \n");
		printf("1. Заполнить массив.\n");
		printf("2. Вывод массива.\n");
		printf("3. Рассчитать сумму эдиментов массива.\n");
		printf("4. Рассчитеть среднее арифметическое массива.\n");
		printf("5. Найти максимальный элемент массива.\n");
		printf("6. Найти минимальный элемент массива.\n");
		printf("7. Сортировать массив.\n");
		printf("8. Удаление элементов массива.\n");
		printf("9. Выход.\n\n");
		scanf("%d",&nom);
		
		switch(nom)
		{
		case 1:																	//Заполнение массива.
		{
		
		system("cls");
			nom1=0;
		
			do{
			printf("\n 		--МЕНЮ--  \n");
			printf("1. Заполнить массив вруную.\n");
			printf("2. Заполнить массив случайным образом.\n");
			printf("3. Выход.\n\n");
			scanf("%d",&nom1);
			
				switch(nom1)
				{
				case 1:
				 {
				 printf ("\n Заполнения массива - вручную.\n");
				 printf("\n Введите размерность одномерного массива n:\n");
					do{
					printf("\n Введите количество n: от 1 до 30\n");
					scanf("%d",&n);
					}while(n<=1||n>30);
					for(i=0;i<n;i++)
					{
						printf("\nВведите %d элемент массива:  ",i+1);
						scanf("%lf",&a[i]);
					}
					Zm=1;														// пораметр отвечающий что массив заполнен.
				 nom1=0;
				 getch();
				 system("cls");
				 break;
				 }
				case 2:
				 {
				 printf ("\n Заполнения массива - случайным образом.\n");
				 do{
					printf("\n Введите количество n: от 1 до 30\n");
					scanf("%d",&n);
					}while(n<=1||n>30);
					for(i=0;i<n;i++)
					{
					a[i]=(rand()%(10)+(double)(rand()%11)/10)-(rand()%(10)+(double)(rand()%11)/10);
					}
					Zm=1;		
				 nom1=0;
				 getch();
				 system("cls");
				 break;
				 }
				case 3:																	//Выход из подменю (Ввод массива).
				 {
				 printf ("\n Закончили ввод массива.\n ВЫХОД.");
				 getch();	
				 system("cls");
				 break;
				 }
				default:																//Неправильно ввили число меню.
				 {
				 printf ("\n Выберити одно из действий в меню.");
				 nom1=0;
				 getch();
				 system("cls");
				 break;
				 }
				}	
			}while(nom1!=3);
		
		nom=0;
		getch();
		system("cls");	
		break;
		}
		case 2:																		// Вывод массива на экран
		if(Zm==0) printf("\n Массив пока не введен.\n Введите сначало массив.\n");
		else
		{
		printf("\n Исходная массив:\n");			
		for(i=0;i<n;i++) printf("[%.3lf] ",a[i]);
		}	
		nom=0;
		getch();
		system("cls");	
		break;
		
		case 3:																	//Расчет суммы эл. массива.
		if(Zm==0) printf("\n Массив пока не введен.\n Введите сначало массив.\n");
		else
		{
		Sum=0;
		for(i=0;i<n;i++) Sum+=a[i];
		printf ("\n Расчетная сумма элементов массива составила Sum= %.1lf\n ",Sum);
		}
		nom=0;		
		getch();	
		system("cls");
		break;
		
		case 4:																	//Расчет средней арифметической.
		if(Zm==0) printf("\n Массив пока не введен.\n Введите сначало массив.\n");
		else
		{
		Sum=0;
		for(i=0;i<n;i++) Sum+=a[i];
		printf ("\n Среднее арифметическое массива составила Sа= %.1lf\n ",Sum/n);
		}
		nom=0;		
		getch();	
		system("cls");
		break;
		
		case 5:																	//Находим максимальный эллимент массива
		if(Zm==0) printf("\n Массив пока не введен.\n Введите сначало массив.\n");
		else
		{
		Sum=a[0];
		for(i=1;i<n;i++)
			{
				if(a[i]>Sum) Sum=a[i];
			}
		printf ("\n Максимальный элемент массива MAX= %.1lf\n ",Sum);
		}
		nom=0;		
		getch();	
		system("cls");
		break;
		
		case 6:																	//Находим минимальный эллимент массива
		if(Zm==0) printf("\n Массив пока не введен.\n Введите сначало массив.\n");
		else
		{
		Sum=a[0];
		for(i=1;i<n;i++)
			{
				if(a[i]<Sum) Sum=a[i];
			}
		printf ("\n Минимальный элемент массива MIN= %.1lf\n ",Sum);
		}
		nom=0;		
		getch();	
		system("cls");
		break;
		
		case 7:																	 	//Сортировка
		if(Zm==0) printf("\n Массив пока не введен.\n Введите сначало массив.\n");
		else
		{
		
		system("cls");
			nom1=0;
			do{
			printf("\n 		--МЕНЮ--  \n");
			printf("1. Сортировка массива по возростанию.\n");
			printf("2. Сортировка массива по убыванию.\n");
			printf("3. Выход.\n\n");
			scanf("%d",&nom1);
			
				switch(nom1)
				{
				case 1:
				 {
				 printf ("\n Сортировка массива по возростанию.\n");				// По возрастаниию
				 	printf("\n Исходная массив:\n");			
					for(i=0;i<n;i++) printf("[%.1lf] ",a[i]);
				 	printf("\n Отсортированный массив:\n");
				    
				for(i=0;i<n;i++)
					{
					for(j=(n-1);j>=(i+1);j--)
						{
						if(a[j]<a[j-1])
						{
						Sum=a[j];
						a[j]=a[j-1];
						a[j-1]=Sum;			
						}
						}
					}
					for(i=0;i<n;i++) printf("[%.1lf] ",a[i]);
				 nom1=0;
				 getch();
				 system("cls");
				 break;
				 }
				case 2:
				 {
			 		printf ("\n Сортировка массива по убыванию.\n");				// По убыванию
				 	printf("\n Исходная массив:\n");			
					for(i=0;i<n;i++) printf("[%.1lf] ",a[i]);
				 	printf("\n Отсортированный массив:\n");
				    	for(i=0;i<n;i++)
					{
					for(j=(n-1);j>=(i+1);j--)
						{
						if(a[j]>a[j-1])
						{
						Sum=a[j];
						a[j]=a[j-1];
						a[j-1]=Sum;			
						}
						}
					}
					for(i=0;i<n;i++) printf("[%.1lf] ",a[i]);
				 nom1=0;
				 getch();
				 system("cls");
			    break;
				 }
				case 3:																	//Выход из подменю (Ввод массива).
				 {
				 printf ("\n Закончили сортировку массива.\n ВЫХОД.");
				 getch();	
				 system("cls");
				 break;
				 }
				default:																//Неправильно ввили число меню.
				 {
				 printf ("\n Выберити одно из действий в меню.");
				 nom1=0;
				 getch();
				 system("cls");
				 break;
				 }
				}	
			}while(nom1!=3);
			
		}
		nom=0;		
		getch();	
		system("cls");
		break;
Сергей_ИСН вне форума Ответить с цитированием
Старый 22.08.2017, 14:51   #3
Сергей_ИСН
Новичок
Джуниор
 
Регистрация: 22.08.2017
Сообщений: 4
По умолчанию

Код:
case 8:																		// Удаление
		if(Zm==0) printf("\n Массив пока не введен.\n Введите сначало массив.\n");
		else
		{
		
		system("cls");
			nom1=0;
			do{
			printf("\n 		--МЕНЮ--  \n");
			printf("1. Удалить:(по номеру элемента).\n");
			printf("2. Удалить:(по значению элемента).\n");
			printf("3. Выход.\n\n");
			fflush(stdin);
			scanf("%d",&nom1);
			
				switch(nom1)
				{
				case 1:
				 {
				 	printf ("\n Удаление элемента массива.\n");				// Удалить:(по номеру элемента)
				 	printf("\n Исходная массив:\n");			
					for(i=0;i<n;i++) printf("[%.1lf] ",a[i]);
					
				 	printf("\n Введите номер элемента массива который вы хотите удалить - ");
				 	scanf("%d",&j);
				 	while(j<1||j>n)
				 	{
				 	printf("\n Неверный ввод.");
				 	printf("\n Введите номер элемента массива который вы хотите удалить: ");
				 	scanf("%d",&j);
					}
					if(j==n) n--;
					else
					{
					for(i=j-1;i<n;i++)
					 {
					 a[i]=a[i+1];
					 }
					n--; 	
					}
					printf("\n Измененный массив массив:\n");
					for(i=0;i<n;i++) printf("[%.1lf] ",a[i]);
				if(n==0)														// Проверяем на наличие массива после удаление.
				 {
				 	Zm=0;
				 	printf("\n Весь массив удален!!!");
				 }
				 nom1=0;
				 getch();
				 system("cls");
				 break;
				 }
					 					
				case 2:
				 {
				 	double Element;											// Элемент которы надо удалить.
				 	
				 	printf ("\n Удаление элемента массива.\n");				// Удалить:(по значению элемента)
				 	printf("\n Исходная массив:\n");			
					for(i=0;i<n;i++) printf("[%.1lf] ",a[i]);
					
				 	printf("\n\n Введите значение элемента массива который вы хотите удалить: ");
				 	scanf("%lf",&Element);
				 										
					k=0;
					nn=n;
					for(i=0;i<n;i++)
					 {
					 if(a[i]==Element)
					 	{
					 		for(j=i;j<n-1;j++)
					 		{
					 		a[j]=a[j+1];
					 		}
							k++;
							n--;
							i--; 
					 	
					 	}
					 }
					
					if(k==0) printf("\n\n Неверный ввод.\n Такого элемента в массиве нет.");
					else
					{
					printf("\n Измененный массив:\n");
					for(i=0;i<nn-k;i++) printf("[%.1lf] ",a[i]);	
					}
					///////////////////////////////////////////////////				
				  if(n-k==0)																	// Проверяем на наличие массива после удаление.
				  {
				 	Zm=0;
				 	printf("\n Весь массив удален!!!");
				  }
				 nom1=0;
				 Element=NULL;															// Зануляю навсякий случай
				 getch();
				 system("cls");
				 break;
				 }
				 
				case 3:																	//Выход из подменю (Ввод массива).
				 {
				 printf ("\n Закончили работу с удалением.\n ВЫХОД.");
				 getch();	
				 system("cls");
				 break;
				 }
				 
				default:																//Неправильно ввили число меню.
				 {
				 printf ("\n Выберити одно из действий в меню.");
				 nom1=0;
				 getch();
				 system("cls");
				 break;
				 }
				}	
			}while(nom1!=3);
		}
		nom=0;		
		getch();	
		system("cls");
		break;
		
		
		case 9:																	//Выход из программы.
		printf ("\n Работа программы завершина.\n ВЫХОД.");
		getch();	
		system("cls");
		getch();	
		break;	
		
		default:																//Неправильно ввили число меню.
		printf ("\n Выберити одно из действий в меню.");
		nom=0;
		getch();
		system("cls");
		break;		
		}
							
		

	}while(nom!=9);																

	getch();
}
Сергей_ИСН вне форума Ответить с цитированием
Старый 22.08.2017, 18:33   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Причина очень простая: точность представления чисел с плавающей точкой.
Вы ведь выводите только три знака после запятой, а на деле их там гораздо больше (при автоматической генерации)

К тому же во всех доках крайне не рекомендуют сравнивать числа с плавающей точкой равенством. Только проверка, что разность по абсолютной величине меньше некоторого eps.

А если вводить массив вручную, то эти значения удаляются нормально
Black Fregat вне форума Ответить с цитированием
Старый 23.08.2017, 12:54   #5
Сергей_ИСН
Новичок
Джуниор
 
Регистрация: 22.08.2017
Сообщений: 4
По умолчанию

Black Fregat благодарю за помощь.
Сергей_ИСН вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна ваша помощь:) Gigomod Операционные системы общие вопросы 3 14.02.2014 16:11
Нужна ваша помощь.) Linus Паскаль, Turbo Pascal, PascalABC.NET 4 11.05.2009 10:00
Нужна ваша помощь Шаманочка Паскаль, Turbo Pascal, PascalABC.NET 2 29.04.2009 20:58
нужна ваша помощь! forsy Паскаль, Turbo Pascal, PascalABC.NET 2 19.05.2008 14:38