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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2011, 17:56   #1
kre4e7
 
Регистрация: 18.11.2011
Сообщений: 5
По умолчанию Двумерный динамический массив типа char

Помогите пожалуйста с двумерным динамическим массивом типа char
как можно осуществить чтобы в массиве были значения от 50 до 100 ??
генерация и преобразование происходит как надо
у меня получается так что только первый символ сгенерированного значения сидит в каждой ячейке массива

// оператор for
// размерность 5х9, тип данных элементов массива char
// диапазон случайных чисел 50 - 100
// найти сумму первой строки
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <conio.h>
#include <iomanip>
#include <sstream>
//---------------------------------------------------------------------------
using namespace std;

int Random(int min, int max)
{
return min + rand() % (max - min);
}

int main(int argc, char* argv[])
{
srand(time(NULL));
setlocale(LC_ALL,"Russian");
char* itoa(int v, char *str, int baz);

int m; // Колличество строк
int n; // Колличество столбцов
int S = 0, F, p; // Сумма

char* ch = new char [160];

cout << "Введите размерность матрицы (строки): ";
cin >> m;
cout << "Введите размерность матрицы (столбцы): ";
cin >> n;

char** array_a;

// Создаем массив указателей
array_a = new char*[m];

// А теперь создаем массивы значений, для каждой строки
for (int i = 0; i < m; i++)
{
array_a[i] = new char[n];
}

cout <<endl<< "Начальная матрица:" << endl;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
itoa(Random(50,100),ch,10); // преобразование в переменную ch происходит и нормально выводится
array_a[i][j] = *ch; // почему выводятся только первые цифры??

cout << setw(7) << array_a[i][j] << " ";
}
cout << endl;
}

cout << endl << "Элементы первой строки:" << endl;
for (int i = 0; i <= 0; i++ )
{
for (int j = 0; j < n; j++)
{
cout << array_a[i][j] << " ";
S = S + array_a[i][j];
}
}
cout << endl<< endl<< "Сумма элементов первой строки: " << S;

// Удаляем массивы значений
for (int i = 0; i < m; i++)
{
delete[] array_a[i];
}
// Удаляем массив указателей
delete[] array_a;

cin.ignore(cin.rdbuf()->in_avail());
cin.get();
return 0;
}
kre4e7 вне форума Ответить с цитированием
Старый 18.11.2011, 18:18   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Ну правильно.
Массив-то у тебя какого типа?
char
Вот и пишется в ячейку по одному символу.
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 18.11.2011, 18:18   #3
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Код:
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
itoa(Random(50,100),ch,10); // преобразование в переменную ch происходит и нормально выводится
array_a[i][j] = *ch; // почему выводятся только первые цифры??

cout << setw(7) << array_a[i][j] << " ";
}
cout << endl;
}
Вот этот код совершенно не понятен. Вы устраиваете двойной цикл по индексам элементов массива и в то же время в функции itoa(Random(50,100),ch,10); вы указываете имя самого массива и значение 10. То есть эта функция заполняет первые 10 элементов массива значением символьного представления случайного числа. И так вы делаете m * n раз, то есть одно и то же.

Что вы хотите добиться?
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 18.11.2011, 18:26   #4
kre4e7
 
Регистрация: 18.11.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Код:
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
itoa(Random(50,100),ch,10); // преобразование в переменную ch происходит и нормально выводится
array_a[i][j] = *ch; // почему выводятся только первые цифры??

cout << setw(7) << array_a[i][j] << " ";
}
cout << endl;
}
Вот этот код совершенно не понятен. Вы устраиваете двойной цикл по индексам элементов массива и в то же время в функции itoa(Random(50,100),ch,10); вы указываете имя самого массива и значение 10. То есть эта функция заполняет первые 10 элементов массива значением символьного представления случайного числа. И так вы делаете m * n раз, то есть одно и то же.

Что вы хотите добиться?
хочу в этом цикле заполнить случайными числами массив
а atoi делаю чтобы каждому элементу array_a[i][j] присвоить сконвертированное случайное целочисленное значение.
itoa (целочисленное значение, символьное значение, 10 - это система счисления десятиричная)

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
Ну правильно.
Массив-то у тебя какого типа?
char
Вот и пишется в ячейку по одному символу.
т.е. нельзя в типе char представить один элемент массива как двухзначное число ??

Последний раз редактировалось kre4e7; 18.11.2011 в 18:29.
kre4e7 вне форума Ответить с цитированием
Старый 18.11.2011, 18:38   #5
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Но вы же указываете в этой функции адрес массива в качестве буфера!

Вы не поняли с первого раза, что я вам написал?! Вы m *n раз делаете одно и тоже, то есть постоянно переписываете начало своего массива! Ваши циклы бессмысленны!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 18.11.2011, 18:46   #6
kre4e7
 
Регистрация: 18.11.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Но вы же указываете в этой функции адрес массива в качестве буфера!

Вы не поняли с первого раза, что я вам написал?! Вы m *n раз делаете одно и тоже, то есть постоянно переписываете начало своего массива! Ваши циклы бессмысленны!
ну тогда какое решение предлагаете ?
как заполнить массив типа char случайными числами от 50 до 100?
kre4e7 вне форума Ответить с цитированием
Старый 18.11.2011, 19:01   #7
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Извините, я не внимательно рассмотрел ваш код. Итак, с начала.

f
Код:
or (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
itoa(Random(50,100),ch,10); // преобразование в переменную ch происходит и нормально выводится
array_a[i][j] = *ch; // почему выводятся только первые цифры??

cout << setw(7) << array_a[i][j] << " ";
}
cout << endl;
}
Первое, вы спрашиваете, почему присваивается лишь первая цифра. Это потому, что когда число вы перевели в символьный вид в буфере ch, то оно стало занимать два байта, то есть две ячейки типа char. Поэтому когда вы выполняете операцию

Код:
array_a[i][j] = *ch;
то естественно только первый байт заносится в элемент массива.

Чтобы правильно сделать, то возникает вопрос, как вы собираетесь хранить числовые значения в своих элементах массива. Я поясню. Например, вы хотите, чтобы, допустим, символ '8' хранился в вашем элементе массива. Символ '8' имеет целочисленное значение в ASCII равное 46.
Поэтому, предположим, что ваш генератор случайных чисел сгенерировал некоторое число в интервале от 50 до 100. Тогда вы можете сразу же это значение присвоить элементу вашего массива.

Например,


Код:
array_a[i][j] = Random(50,100),
Тогда в вашем элементе массива будет храниться символ, числовой код которого был случайным образом сгенерирован. Попробуйте таким образом. Может быть это именно то, что вам нужно. Так как в любом случае в объекте типа char вы не можете хранить более одного представления символа.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 18.11.2011, 19:22   #8
kre4e7
 
Регистрация: 18.11.2011
Сообщений: 5
По умолчанию

Дааа если использовать аски символы то можно использовать коды 48 - 57 (цифры от 0 до 9). А вот двухзначные видимо нельзя((
Вы были правы что 1 символ только можно
kre4e7 вне форума Ответить с цитированием
Старый 18.11.2011, 19:37   #9
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от kre4e7 Посмотреть сообщение
Дааа если использовать аски символы то можно использовать коды 48 - 57 (цифры от 0 до 9). А вот двухзначные видимо нельзя((
Вы были правы что 1 символ только можно
Типы char, signed char и unsigned char занимают один байт и могут хранить представление одного символа.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 18.11.2011, 19:43   #10
kre4e7
 
Регистрация: 18.11.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Типы char, signed char и unsigned char занимают один байт и могут хранить представление одного символа.
Ага спасибо =)
kre4e7 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив типа char (c++) Blad47 Помощь студентам 5 10.10.2010 12:17
[Delphi] Массив типа char Рамик Помощь студентам 1 20.09.2010 18:20
массив типа char в виде списка saidmir Общие вопросы C/C++ 9 20.08.2010 21:38
Массив типа char * das Ma:dchen Общие вопросы C/C++ 9 13.06.2010 17:21
Динамический сивольный массив типа char z3rg Общие вопросы C/C++ 12 05.04.2009 21:00