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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2011, 17:51   #1
Green Gin
Пользователь
 
Аватар для Green Gin
 
Регистрация: 05.11.2011
Сообщений: 21
Восклицание Найдите ошибку Please

Задача: Даны строки S1 и S2. Сформировать строку S таким образом, чтобы в нее с начала вошли все четные символы строки S1, а потом все нечетные символы строки S2, работая со строками как с массивами(не используя string.h)

Написанный мною код:
Код:
#include <stdio.h>
#include <locale.h>

const int size = 100;
char S1[size], S2[size], S[size];

void calculation(void)
{
	int j=0;
	for(int i=0; i<=size; i++)
	{
		if(S1[i]!='/0' && i%2!=0) {S[j]=S1[i]; j++;}
	}
	for(int i=0; i<=size; i++)
	{
		if(S2[i]!='/0' && i%2==0) {S[j]=S2[i]; j++;}
	}
}

void main(void)
{
	setlocale(LC_ALL, "rus");
	puts("Введите строку S1:");
	gets_s(S1);
	puts("Введите строку S2:");
	gets_s(S2);
	calculation();
	printf("Строка S: %s\n", S);
}
Собственно где ошибка, помогите пожалуйста.
-=-=-=-=-|?|-=-=-=-=-
Green Gin вне форума Ответить с цитированием
Старый 05.11.2011, 18:09   #2
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

Собсно, косяк в том, что ты в циклах используешь переменную size, вместо реального размера реальной строки. Так у тебя получается, что конечный массив S набивается мусорными значениями S1 и S2.
Собственно, исправить можешь так:
Либо дописать функцию, которая будет возвращать размер строки:
Код:
int getSize(char* string)
{
	for(int i = 0;;i++)
		if(string[i] == '\0')
			return i;
};

void calculation(void)
{
	int j=0;
	for(int i=0; i<=getSize(S1); i++)
	{
		if(S1[i]!='/0' && i%2!=0) {S[j]=S1[i]; j++;}
	}
	for(int i=0; i<=getSize(S2); i++)
	{
		if(S2[i]!='/0' && i%2==0) {S[j]=S2[i]; j++;}
	}
};
Либо сделать элегантно:
Код:
void calculation(void)
{
	int j=0;
	for(int i=0; S1[i]; i++)
	{
		if(S1[i]!='/0' && i%2!=0) {S[j]=S1[i]; j++;}
	}
	for(int i=0; S2[i]; i++)
	{
		if(S2[i]!='/0' && i%2==0) {S[j]=S2[i]; j++;}
	}
};

Последний раз редактировалось Stilet; 08.11.2011 в 09:04.
SteAlzzer вне форума Ответить с цитированием
Старый 05.11.2011, 18:18   #3
Green Gin
Пользователь
 
Аватар для Green Gin
 
Регистрация: 05.11.2011
Сообщений: 21
По умолчанию

Спасибо огромное супер только про второй способ не понятно, не могли бы Вы подробнее про это пояснить?
-=-=-=-=-|?|-=-=-=-=-
Green Gin вне форума Ответить с цитированием
Старый 05.11.2011, 18:51   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Либо сделать нормально:
Код:
void calculation()
{
    int pos = 0;
    for(int i = 0; s1[i]; i++)
        if(i%2 == 0)
            s[pos++] = s1[i];
    for(int i = 0; s2[i]; i++)
        if(i%2)
            s[pos++] = s2[i];
    s[pos] = '\0';
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 05.11.2011, 19:06   #5
Green Gin
Пользователь
 
Аватар для Green Gin
 
Регистрация: 05.11.2011
Сообщений: 21
По умолчанию

спасибо использовал смешанный вариант...
-=-=-=-=-|?|-=-=-=-=-
Green Gin вне форума Ответить с цитированием
Старый 05.11.2011, 20:03   #6
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Green Gin Посмотреть сообщение
Спасибо огромное супер только про второй способ не понятно, не могли бы Вы подробнее про это пояснить?
цикл будет выполняться, пока значение s[i] не будет равно нулю. А как вы знаете, конец строки обозначается нулем.
SteAlzzer вне форума Ответить с цитированием
Старый 05.11.2011, 23:46   #7
Green Gin
Пользователь
 
Аватар для Green Gin
 
Регистрация: 05.11.2011
Сообщений: 21
По умолчанию

Интересно, а как решить эту задачу с помощью string.h? То есть не рассматривая S1 и S2 как массивы. Знаю что нужно воспользоваться strcat(), но как передать символ S1[i] (например), вторым аргументом функции?

Ну помогите кто-нибудь (см. пост выше)... Хотя бы, направьте в нужном направлении
-=-=-=-=-|?|-=-=-=-=-

Последний раз редактировалось Stilet; 08.11.2011 в 09:08.
Green Gin вне форума Ответить с цитированием
Старый 07.11.2011, 11:05   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Да никак. То есть, можно читать строки в переменные типа std::string, а в функции вместо проверки на нуль-терминатор опираться на функцию std::string::size(). Теоретически, можно припазать ещё и стандартные алгоритмы, но это в любом случае не <string>.
Abstraction вне форума Ответить с цитированием
Старый 07.11.2011, 19:57   #9
Green Gin
Пользователь
 
Аватар для Green Gin
 
Регистрация: 05.11.2011
Сообщений: 21
По умолчанию

странно... Препод сказал написать эту же программу, но рассматривая S1, S2 и S как строки, пользуясь функциями string.h ... можно конечно strlen() использовать для определения размера строки в цикле но как произвести конкатенацию символа в строку???
-=-=-=-=-|?|-=-=-=-=-
Green Gin вне форума Ответить с цитированием
Старый 07.11.2011, 20:17   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Зачем "конкатенацию"? Заказать строку длиной в среднее арифметическое длин входных и менять элементы через [] не вариант?
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найдите ошибку Yanik Помощь студентам 4 12.06.2011 11:45
Найдите ошибку #Sharp# Паскаль, Turbo Pascal, PascalABC.NET 7 23.12.2010 14:35
Найдите ошибку Гиро-Гинор Помощь студентам 2 12.11.2010 23:16
Найдите ошибку *natali* Помощь студентам 3 08.11.2009 17:30