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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2010, 23:56   #1
Aerial
Пользователь
 
Аватар для Aerial
 
Регистрация: 12.04.2010
Сообщений: 17
По умолчанию Вопрос по символьным массивам. Как улучшить код.

Задание вот:
Код:
Создать массив из 20 символьных значений.  Сформировать из его значений три других массива: 
	состоящих из цифр, из букв и из символов, не являющихся ни буквами, ни цифрами.
Вот что сделал я:
Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <locale.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL,"Russian");
	/*Создать массив из 20 символьных значений.  Сформировать из его значений три других массива: 
	состоящих из цифр, из букв и из символов, не являющихся ни буквами, ни цифрами.*/
	const int N=20;int k=0,z=0,m=0;int i=0;
	char abvgd[N];
	char cifri_[N],bykvi_[N],none_[N];
	cout<<"Введите строку, значений символьного массива(20 элементов)"<<endl;
	cin.getline(abvgd,N);
	for(int i=0;i<N;i++)
	{
		if((abvgd[i]>='0')&&(abvgd[i]<='9'))
		{cifri_[k]=abvgd[i];k++;}
		else if(((abvgd[i]>='A')&&(abvgd[i]<='Z'))||((abvgd[i]>='a')&&(abvgd[i]<='z')))
		{bykvi_[z]=abvgd[i];z++;}
		else {none_[m]=abvgd[i];m++;}		 
	}
	char* cifri=new char[k+1];
	char* bykvi=new char[z+1];
	char* none=new char[m+1];
	for(i=0;i<k;i++)
	{
		cifri[i]=cifri_[i];
	}cifri[k]=NULL;
	for(i=0;i<z;i++)
	{
		bykvi[i]=bykvi_[i];
	}bykvi[z]=NULL;
	for(i=0;i<m;i++)
	{
		none[i]=none_[i];
	}none[m]=NULL;
	
	cout<<"Мы получили 3 массива, массив из цифер: "<<endl<<cifri<<endl<<"Массив из букв и символов: "<<endl<<bykvi<<endl;
	cout<<"Массив из остальных знаков: "<<none;
	delete[]cifri;delete[]bykvi;delete[]none;
	_getch();
	return 0;
}
Меня интересует как можно усовершенствовать код в целом. И\или как более эффективно\лучше\точнее задать сортировку элементов массива:
Код:
for(int i=0;i<N;i++)
	{
		if((abvgd[i]>='0')&&(abvgd[i]<='9'))
		{cifri_[k]=abvgd[i];k++;}
		else if(((abvgd[i]>='A')&&(abvgd[i]<='Z'))||((abvgd[i]>='a')&&(abvgd[i]<='z')))
		{bykvi_[z]=abvgd[i];z++;}
		else {none_[m]=abvgd[i];m++;}		 
	}
p.s. если что Visual Studio 2008

Последний раз редактировалось Aerial; 13.04.2010 в 00:05.
Aerial вне форума Ответить с цитированием
Старый 13.04.2010, 00:15   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ну главное работает ?=)), код ужасен, а так вроде ничего
алгоритм такой:
A[20]
1)посчитать кол-во цифр,букв и символов в массиве A
2)создать 3 массива
3)записать туда в них что надо

у тебя как раз так и сделано

замечания: лишние скобки в ифах

вот это лишнее:
Код:
for(i=0;i<k;i++)
	{
		cifri[i]=cifri_[i];
	}cifri[k]=NULL;
	for(i=0;i<z;i++)
	{
		bykvi[i]=bykvi_[i];
	}bykvi[z]=NULL;
	for(i=0;i<m;i++)
	{
		none[i]=none_[i];
	}none[m]=NULL;
у тебя массивы
Код:
 char cifri_[N],bykvi_[N],none_[N];
после окончания работы сами удалятся
да и вообще эти массивы не нужны вовсе

а очистку динамических массивов ты делаешь с помощью delete

еще не понятно зачем ты создаешь массивы размером на 1 больше, чем надо:
Код:
char* cifri=new char[k+1];
вот как бы написал я:
Код:
//массив уже заполненный N=20
int m=0, n=0, k=0; // кол-во букв цифр и символов
for(int i=0; i<N; i++) {
     if ( A[i] >= '0' && A[i] <= '9' ) m++;
     else if( (A[i] >= 'A' && A[i] <= 'Z' ) || (A[i] >= 'z' && A[i] <= 'z' ) n++;
     else k++;
}
char *digits = new char[m];
char *letters = new char[n];
char *symbols = new char[k];
m=0; n=0; k=0;
for(int i=0; i<N; i++) {
     if ( A[i] >= '0' && A[i] <= '9' )
            digits[m++] = A[i];
     else if( (A[i] >= 'A' && A[i] <= 'Z' ) || (A[i] >= 'z' && A[i] <= 'z' )
            letters[n++] = A[i];
     else
           symbols[k++] = A[i];
}
// вывод масивов или еще че-нить
...
delete[] digits;  delete[] letters; delete[] symbols;
не проверял, писал тут

Последний раз редактировалось NiCola999; 13.04.2010 в 00:40.
NiCola999 вне форума Ответить с цитированием
Старый 13.04.2010, 00:31   #3
Aerial
Пользователь
 
Аватар для Aerial
 
Регистрация: 12.04.2010
Сообщений: 17
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
ну главное работает ?=)), код ужасен, а так вроде ничего
Главное что код ужасен;( То, что работает хорошо, но хотелось бы лучше написать код.
До алгоритма в принципе догадаться способен, а исполнение подводит.
Цитата:
вот это лишнее:
Код:
for(i=0;i<k;i++)
	{
		cifri[i]=cifri_[i];
	}cifri[k]=NULL;
	for(i=0;i<z;i++)
	{
		bykvi[i]=bykvi_[i];
	}bykvi[z]=NULL;
	for(i=0;i<m;i++)
	{
		none[i]=none_[i];
	}none[m]=NULL;
Этот кусок сделал, чтобы не было "лишних" пустых-чтоли, элементов.


Цитата:
еще не понятно зачем ты создаешь массивы размером на 1 больше, чем надо:
Код:
char* cifri=new char[k+1];
Это от незнания наверно А вообще для нулевого элемента:
Код:
cifri[k]=NULL;
bykvi[z]=NULL;
none[m]=NULL;
Очень интересует как можно улучшить:
Код:
for(int i=0;i<N;i++)
	{
		if((abvgd[i]>='0')&&(abvgd[i]<='9'))
		{cifri_[k]=abvgd[i];k++;}
		else if(((abvgd[i]>='A')&&(abvgd[i]<='Z'))||((abvgd[i]>='a')&&(abvgd[i]<='z')))
		{bykvi_[z]=abvgd[i];z++;}
		else {none_[m]=abvgd[i];m++;}
	}

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
вот как бы написал я:
Код:
//массив уже заполненный N=20
int m=0, n=0, k=0; // кол-во букв цифр и символов
for(int i=0; i<N; i++) {
     if ( A[i] >= '0' && A[i] <= '9' ) m++;
     else if( (A[i] >= 'A' && A[i] <= 'Z' ) || (A[i] >= 'z' && A[i] <= 'z' ) n++;
     else k++;
}
char *digits = new char[m];
char *letters = new char[n];
char *symbols = new char[k];
m=0; n=0; k=0;
for(int i=0; i<N; i++) {
     if ( A[i] >= '0' && A[i] <= '9' )
            digits[m++] = A[i];
     else if( (A[i] >= 'A' && A[i] <= 'Z' ) || (A[i] >= 'z' && A[i] <= 'z' )
            letters[n++] = A[i];
     else
           symbols[k++] = A[i];
}
// вывод масивов или еще че-нить
...
delete[] digits;  delete[] letters; delete[] symbols;
не проверял, писал тут
Спасибо, приму к сведению. Интересует вопрос: стоит\нужно добавлять нулевой элемент в конец массива?
И, если не трудно приведите пример(алгоритм\команды) как можно предотвратить перезапись последующих элементов символьного массива в коде, если ввожу элементы посимвольно?
Код:
.......
char A[N];
.....
for(int i=0;i<N;i++)
{cin<<A[i];}
....
Что-то вроде того.


Цитата:
Сообщение от NiCola999 Посмотреть сообщение
для какого нулевого элемента? у тебя k - кол-во цифр которое надо записать в массив, индексы в нем будут от 0 до k-1
можно както проверку букв упростить , но чет бошка щас не варит
Что-то из серии "Далее вы узнаете, что в C++ символьные строки хранятся в массиве типа char, который заканчивается символом NULL (или ASCII 0)."
Была мысль с использованием ASCII(возможно ли?стоит ли?), но как, не представляю.

Последний раз редактировалось Aerial; 13.04.2010 в 00:56.
Aerial вне форума Ответить с цитированием
Старый 13.04.2010, 00:48   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

пардон... уже не соображаю. Забыл что у вас char, тогда там правильно k+1 итд. Нулевой символ добавлять не нужно, компилятор сам должен это сделать поидее...

можно както проверку букв упростить , но чет бошка щас не варит

Последний раз редактировалось NiCola999; 13.04.2010 в 01:03.
NiCola999 вне форума Ответить с цитированием
Старый 13.04.2010, 10:54   #5
Aerial
Пользователь
 
Аватар для Aerial
 
Регистрация: 12.04.2010
Сообщений: 17
По умолчанию

NiCola999, спасибо.
Хотелось бы узнать ответы на след. вопросы, есди не сильно затруднит.

Очень интересует как можно улучшить:
Код:
for(int i=0;i<N;i++)
	{
		if((abvgd[i]>='0')&&(abvgd[i]<='9'))
		{cifri_[k]=abvgd[i];k++;}
		else if(((abvgd[i]>='A')&&(abvgd[i]<='Z'))||((abvgd[i]>='a')&&(abvgd[i]<='z')))
		{bykvi_[z]=abvgd[i];z++;}
		else {none_[m]=abvgd[i];m++;}
	}

И, если не трудно приведите пример(алгоритм\команды) как можно предотвратить перезапись последующих элементов символьного массива в коде, если ввожу элементы посимвольно?
Код:
.......
char A[N];
.....
for(int i=0;i<N;i++)
{cin<<A[i];}
....
Что-то вроде того.

Была мысль упростить\улучшить проверку букв\символов\цифер с использованием ASCII(возможно ли?стоит ли?), но как, не представляю.
Aerial вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача по массивам // Delphi //код прилагается Makotya Помощь студентам 2 20.05.2009 22:04
Вопросы по Паскалю обьясните КОД Tik-Tik Паскаль, Turbo Pascal, PascalABC.NET 17 12.02.2009 10:18
Помогите усовершенствовать код xPAL Общие вопросы Delphi 6 20.09.2008 00:05
помогите плиз написать код на следующие вопросы delf7 Фриланс 1 03.01.2008 10:53