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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2011, 11:52   #1
Sh4dd0w
 
Регистрация: 02.11.2011
Сообщений: 3
Вопрос C++ Win32 | Посимвольный ввод вывод с декодированием

Собственно суть задачи простая: вводится сначала некоторое число N, которое определяет количество строк, которые нужно считать. Потом выводятся те же строки, но со сдвигом в алфавите +13. Вводится только строчная латиница и пробелы, пробелы ни на что не заменять. И чисто логичнески и механически я знаю как решить это задачу, на C# уже давно бы сделал. Но дело вот в чём - задача была на олимпиаде где писали на C++ Win32. Там я давно не упражнялся, естественно возникли сложности. Потоковый ввод прекращался при пробеле, так что в окончательном варианте придется использовать посимвольно. Всё запрограммировал
Код:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	char alph[26] = {'n','o','p','q','r','s','t','u','v','w','x','y','z','a','b','c','d','e','f','g','h','i','j','k','l','m'};
	int n = getchar() - (int)'0';
	getchar();
	char* ch = new char[n,200];
	for(int i=0; i<n; i++){
		for(int j=0; j<200; j++)
			if((ch[i,j]=getchar()) == '\n') 
				break;
	}
	for(int i=0; i<n; i++){
		for(int j=0; j<200; j++){
			if((ch[i,j]>='a')&&(ch[i,j]<='z'))
				cout << alph[(int)ch[i,j]-(int)'a'];
			else if((ch[i,j]==' ')||(ch[i,j]=='\n'))
				cout << ch[i,j];
		}
		cout<<endl;
	}
	system("PAUSE");
	return 0;
}
Проблема собственно в чем - в том, что при вводе первой строки, обе строки (при условии что n=2)становятся равны ей же. При вводе второй строки, обе строки принимают так же её значение. Поэтому выводится n раз "расшифрованная" последняя строчка. Пробовал по разному проверить где же ошибка, но ничего кроме этого выяснить не удалось...
Весь ввод нужно осуществить после всего вывода. Построчно, боюсь, не годится. Объясните, пожалуйста, из-за чего так происходит, либо покажите рабочий вариант...
P.S. На массив косо не смотрите, это первые шаги к тому, чтобы сделать программу независимой от кодировок.
Sh4dd0w вне форума Ответить с цитированием
Старый 02.11.2011, 13:06   #2
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от Sh4dd0w Посмотреть сообщение
Потоковый ввод прекращался при пробеле, так что в окончательном варианте придется использовать посимвольно.
Для этого есть getline !
Цитата:
Сообщение от Sh4dd0w Посмотреть сообщение
И чисто логичнески и механически я знаю как решить это задачу, на C# уже давно бы сделал.
Код в студию !

Посимвольный ввод и вывод нужен тут как собаке пятая нога, вот на C++ c использованием вашего массива:
Код:
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <iterator>
using std::string;
using std::cout;
using std::cin;

char alph[26] = {'n','o','p','q','r','s','t','u','v','w','x','y','z','a','b','c','d','e','f','g','h','i','j','k','l','m'};
char coding( char c) { return ( c >= 'a' && c <= 'z' ) ? alph[c-'a'] : c;}

 int main()
{
   string str;
   std::list< string> lstr;
   int n;
   cin >> n;
   cin.ignore();
   while ( n--)
   {
      std::getline( cin, str);
      lstr.push_back( str);
   }
   for ( std::list< string>::iterator it = lstr.begin(); it != lstr.end(); ++it)
      std::transform ( it->begin(), it->end(), it->begin(), coding);
   std::copy( lstr.begin(), lstr.end(), std::ostream_iterator< string>( cout, "\n"));
   system("pause");
   return 0;
}
An1ka вне форума Ответить с цитированием
Старый 02.11.2011, 22:12   #3
Sh4dd0w
 
Регистрация: 02.11.2011
Сообщений: 3
По умолчанию

Сомневаюсь что это тот вариант, который я смог бы вспомнить и применить на олимпиаде... И я всё же хотел бы узнать в чем ошибка моего варианта
Sh4dd0w вне форума Ответить с цитированием
Старый 07.11.2011, 22:22   #4
Sh4dd0w
 
Регистрация: 02.11.2011
Сообщений: 3
По умолчанию

Вобщем мне подсказали, надо писать было массив[a][b] а не массив[a,b], иначе одномерный массив выходит, т.е. - одна строка
Sh4dd0w вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
посимвольный ввод из файла в динамический массив nikitozzz Visual C++ 2 28.10.2011 08:39
C# - Посимвольный вывод слова в случайном порядке Lastsummer Помощь студентам 4 02.02.2011 12:40
Файловый ввод-вывод через API Win32 в ассемблере Alex_VK Помощь студентам 0 27.12.2010 11:24
Вывод кириллицы в командую строку в win32 приложениях levandowskiy Общие вопросы C/C++ 2 06.12.2010 14:56
Посимвольный ввод строки Junk1E Общие вопросы C/C++ 8 14.12.2009 01:49