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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2013, 13:31   #1
eleonora_zv
Пользователь
 
Регистрация: 14.12.2012
Сообщений: 13
По умолчанию Строки с++

Задание: первести арабские числа в римские.
Исходный работающий код
Код:
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<iostream>

using namespace std;

void main()
{
	int arabian;
	int p=13;
	cout<<"Enter the arabian number: ";
	cin>>arabian;
	int arab_mas[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000};
	char *roman_mas[13]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
	char roman[]={0};
	while ((p--)!='\0')
		while (arabian>=arab_mas[p])
	{
		arabian=arabian-arab_mas[p];
		strcat(roman,roman_mas[p]);
	}
	cout<<"The equel roman number: "<<roman;
	getch();
}
Но нужно переписать из main в отдельную функцию, не работает:
Код:
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<iostream>

using namespace std;
char stroka (char roman);

void main()
{
	int arabian;
	int p=13;
	cout<<"Enter the arabian number: ";
	cin>>arabian;
	char roman[]={0};
	stroka(roman);	
	getch();
}

char stroka (char roman)
{
	int arabian;
	int p=13;
	int arab_mas[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000};
	char *roman_mas[13]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
	roman=0;
	while ((p--)!='\0')
		while (arabian>=arab_mas[p])
	{
		arabian=arabian-arab_mas[p];
		strcat(roman,roman_mas[p]);
	}
	cout<<"The equel roman number: "<<roman;
}
Помогите!
eleonora_zv вне форума Ответить с цитированием
Старый 11.06.2013, 13:37   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Не хочется Вас расстраивать, но исходный код (без функций) работает чудом и может "сломаться" в любой момент.
Цитата:
Сообщение от www.cplusplus.com
char * strcat ( char * destination, const char * source );
Concatenate strings
Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.

destination and source shall not overlap.

Parameters:
destination
Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.
source
C string to be appended. This should not overlap destination.
Если коротко и по-русски, то destination должен быть большего размера, чтобы уместить исходную и дописанную строки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.06.2013, 14:34   #3
eleonora_zv
Пользователь
 
Регистрация: 14.12.2012
Сообщений: 13
По умолчанию

Что мне исправить?
eleonora_zv вне форума Ответить с цитированием
Старый 11.06.2013, 14:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
char roman[255]={0};
И передавать в функцию как указатель на строку, а не просто как символ.
Если ты не в курсе как работать со строками в Си то стоит почитать об этом.
Если ты в принципе не в курсе что с этим делать, то закажи у фрилансеров программу за денюжку.

P.S. Я бы вообще эту программу переписал полностью. Даже с таким решением она врядли сработает как положено.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.06.2013, 14:52   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Может выбросить работу со строками?
Код:
#include <iostream>
#include <сstdio>

using namespace std;

const int p = 13;
const int arab_mas[p]={1,4,5,9,10,40,50,90,100,400,500,900,1000};
const char *roman_mas[p]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};

void
toroman(int arabian)
{
    cout << "The equel roman number: ";
    for (int i = p - 1; i >= 0; --i) {
        while (arabian >= arab_mas[i]) {
            arabian -= arab_mas[i];
            cout << roman_mas[i];
        }
    }
}

int
main()
{
    int arabian;
    cout << "Enter the arabian number: ";
    cin >> arabian;
    toroman(arabian);
    getch();
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.06.2013, 19:09   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

BDA интересный код, очень полезно следить за вашей перепиской.
Только поясните пожалуйста почему подключаются и iostream и cstdio. Разве iostream не достаточно для работы кода... ?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 11.06.2013, 19:50   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Bugrimov, честно говоря, подключал библиотеки "от балды". Для getch, по идее, нужна conio.h. Кстати, если уж менять код, то еще бы "развернул" массивы, так как ++ может быть быстрее -- (вроде ).
Код:
#include <iostream>
#include <conio.h>

using namespace std;

const int p = 13;
const int arab_mas[p]={1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
const char *roman_mas[p]={"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

void
toroman(int arabian)
{
    cout << "The equel roman number: ";
    for (int i = 0; i < p; ++i) {
        while (arabian >= arab_mas[i]) {
            arabian -= arab_mas[i];
            cout << roman_mas[i];
        }
    }
}

int
main()
{
    int arabian;
    cout << "Enter the arabian number: ";
    cin >> arabian;
    toroman(arabian);
    getch();
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.06.2013, 21:18   #8
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Честно говоря не знал, что инкремент (++) быстрее декремента (--)..
Лично я предпочитаю system("pause"); ну и конечно дописать #include <cstdlib>
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на строки. Даны две строки. Определить можно ли из символов первой строки получить вторую строку.( написать подпрограммой и ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 5 09.02.2013 14:07
Программа на языке "Ассемблер" - ввод строки, анализ длины строки, добавление точки в конец строки Алексей_2012 Помощь студентам 1 05.04.2012 11:26
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10