Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

WiseLord писал(а):Там может быть любой мусор, в принципе
понял, буду принудительно обнулять
как проверить число на отрицательность это понятно, мне не понятно как теперь это отрицательное число проверить на разрядность ?
Tell Me The Truth
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

FreshMan писал(а):для определения разрядности числа использую ф-цию

Код: Выделить всё

void RazradnostChisla (int16_t x)
{
   uint8_t i;
   while (x>0)
   {
	   x/=10;
	   ++i;
   }
   raz_chisla=i;
}

как определить разрядность отрицательного числа ?
я бы, во-первых, функцию сделал именно функцией

Код: Выделить всё

uint8_t RazradnostChisla (int16_t x)
{
   uint8_t i = 0;
   while (x>0)
   {
	   x/=10;
	   ++i;
   }
   return i;
}
а во-вторых, по поводу разрядности - вспоминайте математику и понятие модуля числа... разрядность отрицательного числа будет определяться разрядностью модуля этого числа, а модуль - всегда положительный. разумеется, у отрицательного числа будет еще разряд под знак минуса.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

FreshMan писал(а):
WiseLord писал(а):как проверить число на отрицательность это понятно, мне не понятно как теперь это отрицательное число проверить на разрядность ?
Я же написал "код" - сделать число положительным и дальше как обычно.

Та ссылка, что давал ARV (или мои примеры кода) всё это описывает - и разложение на десятичные разряды, и вывод отрицательных чисел. Но Вы пытаетесь всё равно пройтись своим путём, натыкаясь на уже решённые вопросы.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

ARV писал(а):мои примеры кода
ваши примеры кода безусловно хороши, вот если бы они хоть мало-мальски были прокоментированны.....
ясное дело что вам там все понятно, на то вы и автор :)
но новичку понять чужой код очень сложно
видиш и понимаешь некие кусочки, а целые блоки осмыслить не в состоянии :dont_know:
но за помощь безусловно СПАСИБО
Tell Me The Truth
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

FreshMan писал(а):если бы они хоть мало-мальски были прокоментированны.....
ну вы, блин, даёте! © :shock:
в качестве комментариев целая статья написана - неужели недостаточно?

Код: Выделить всё

void convert(unsigned int NUM){
			 int i, m;
			 for(i=MAX_SIZE-1; i>=0; i--){
			  // цикл заполнения выходного массива СПРАВА НАЛЕВО
			  m = NUM % DIG_BASE; // находим остаток от деления числа на основание
			  out[i] = SYMBOLS[m]; // этот остаток есть ВЫВОДИМАЯ ЦИФРА
			  NUM /= DIG_BASE;  // уменьшаем число в DIG_BASE раз
			 }
			}

Код: Выделить всё

// функция, которая заполняет выходной массив СИМВОЛЬНЫМ представлением числа
			// при этом не выводит НЕЗНАЧАЩИЕ ЛЕВЫЕ нули, т.е. число 1 выводится как '     1'
			void trim_convert(unsigned int NUM){
			 int i, m;
			 for(i=MAX_SIZE-1; i>=0; i--){
			  // цикл заполнения выходного массива СПРАВА НАЛЕВО
			  m = NUM % DIG_BASE; // находим остаток от деления числа на основание
			  if((NUM==0)&&(i!=(MAX_SIZE-1)))
			  // если наше число - ноль и вывод НЕ в правую позицию
			   out[i] = SPACE_CHAR; // то выводим "пустое" место - подавляем незначащие нули
			  else
			   out[i] = SYMBOLS[m]; // иначе выводим символ нужной ЦИФРЫ
			  NUM /= DIG_BASE;  // уменьшаем число в DIG_BASE раз
			 }
			}

Код: Выделить всё

void s_trim_convert(int NUM){
			 int i, m, sign = 0;
			 if(NUM <0){
			 // если число отрицательное
			  sign = 1; // установим признак наличия знака
			  NUM *= -1; // а само число возьмем по модулю
			 }
			 // выводим уже положительное число
			 i=MAX_SIZE-1;
			 do{
			  // цикл заполнения выходного массива СПРАВА НАЛЕВО
			  m = NUM % DIG_BASE; // находим остаток от деления числа на основание
			  if((NUM==0)&&(i!=(MAX_SIZE-1)))
			   break; // закончим цикл вывода числа
			  else
			   out[i] = SYMBOLS[m]; // иначе выводим символ нужной ЦИФРЫ
			  NUM /= DIG_BASE;  // уменьшаем число в DIG_BASE раз
			 } while (--i >= 0);
			 // число выведено, проверяем свободное место и выводим при необходимости знак
			 if (i < 0) return; // места не хватает - выход
			 if (sign) out[i--] = NEG_CHAR; // выводим знак, если нужно
			 for(; i>=0;i--) out[i] = SPACE_CHAR; // очищаем незначащие позиции 
			}
мне кажется, что в данных кусочках кода прокомментирована буквально каждая строка - куда ж еще больше-то?! плюс текст статьи имейте ввиду...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Нужно больше золота комментариев :).

Честно говоря, лично я комментарии в коде не очень люблю. Иногда они сильно отвлекают. Хороший код должен быть понятен сам по себе - для чего ОБЯЗАТЕЛЬНО отступы должны быть и переменные осмысленно называться.

Иногда смотришь в код новичков, где отступы пляшут, как попало, и понимаешь, что с таким подходом новичок надолго им и останется.
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение OKF »

Поддерживаю! Иногда просто мешают - дублирующие и зачастую пустые. И не только у новичков. Просто, культура такая.((
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Вопросы по С/С++ (СИ)

Сообщение baghear »

Добрый день, подскажите пожалуйста как в функции обратиться к нужному элементу двумерного массива.

Код: Выделить всё

void foo(const uint8_t **arr)
{
   uint8_t a;
   a = **arr[3][5];// так не работает

}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Компилятор по одному указателю не сможет узнать ничего о размерах массива, по этому просто по указателю - никак.
Либо создавайте собственный тип, содержащий размеры массива, и передавайте в функцию указатель на этот тип.
Либо, опять же, свой собственный тип и в самой функции уже явное приведение к нему принимающего указателя.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Вопросы по С/С++ (СИ)

Сообщение baghear »

Спасибо!!!!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

WiseLord писал(а): Иногда смотришь в код новичков, где отступы пляшут, как попало, и понимаешь, что с таким подходом новичок надолго им и останется.
ну почему же надолго, может человек находится на стадии обучения
ведь все мы когда-то учились ходить и делали поначалу это нелепо
меня вот интересует следующее
есть ли некий алгоритм усовершенствования в написании кода, в данном случаи на Си ?
я вот на данный момент иду по пути "прямо в лоб"
тоесть: разбиваю задачу на самые мелкие куски и реализую их при помощи конструкций if....else
потом когда напишу начинаю анализировать и упрощать, в силу своего навыка
для себя подметил, что сухое знание языка Си еще не гарантирует того, что ты напишеш качественный/элегантный код, посскольку знания не подкреплены практикой
так существует "золотой алгоритм" усовершенствования или нет ? :dont_know:
Tell Me The Truth
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

FreshMan писал(а):так существует "золотой алгоритм" усовершенствования или нет ?
существует два основных подхода к программированию: нисходящий и восходящий.
нисходящий - это "от общего к частному".
восходящий - это от "тонкостей к обобщению".

судя по всему вы действуете по второму подходу: сразу думаете о портах и битах, потом заставляете их меняться в соответствии с задачей, потом... и т.д. подход имеет право на существование, но с моей точки зрения он более подходит для опытного программиста, который интуитивно чувствует, что получит в конце работы и потому может себе позволить начинать с самого низа. возможно, у него уже есть наработки, которые он в нужный момент просто возьмет готовыми...

начинающим я бы посоветовал действовать по первому принципу - разрабатывать проекты от общего к частностям. ведь и в реальной жизни мы сначала видим слона, а потом замечаем складки на его коже...

принцип нисходящего программирования я продемонстрировал в своей статеечке - предлагаю ознакомиться. мне кажется, это и будет тот самый "золотой алгоритм", который позволит вам причесать свои мысли...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

ARV писал(а):
FreshMan писал(а):как ее надо усовершенствовать чтобы она разлаживала 3-х и более разрядные числа ?
http://arv.radioliga.com/content/view/106/49/
оказывается все уже придумано и написано до нас :))
автору респект :beer:
теперь вопросы
вот ваша ф-ция

Код: Выделить всё

		// функция, которая заполняет выходной массив СИМВОЛЬНЫМ представлением числа
			// при этом не выводит НЕЗНАЧАЩИЕ ЛЕВЫЕ нули, т.е. число 1 выводится как '     1'
			void trim_convert(unsigned int NUM){
			 int i, m;
			 for(i=MAX_SIZE-1; i>=0; i--){
			  // цикл заполнения выходного массива СПРАВА НАЛЕВО
			  m = NUM % DIG_BASE; // находим остаток от деления числа на основание
			  if((NUM==0)&&(i!=(MAX_SIZE-1)))
			  // если наше число - ноль и вывод НЕ в правую позицию
			   out[i] = SPACE_CHAR; // то выводим "пустое" место - подавляем незначащие нули
			  else
			   out[i] = SYMBOLS[m]; // иначе выводим символ нужной ЦИФРЫ
			  NUM /= DIG_BASE;  // уменьшаем число в DIG_BASE раз
			 }
			}
как она работает понятно
не понятно, как при помощи оной ф-ции выводить часы, минуты и секунды ?
как вы понимаете все эти переменные должны быть на своих знакоместах
Tell Me The Truth
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Это функция только для разложения числа на разряды. А выводом уже должна заниматься другая, взяв готовый результат. Ну мешайте в одну кучу разные вещи.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

FreshMan писал(а):как при помощи оной ф-ции выводить часы, минуты и секунды ?
как вы понимаете все эти переменные должны быть на своих знакоместах
:)))
спрашивали - отвечаем

чем отличается моя функция от той, что нужна вам? только тем, что моя выводит всегда в определенное место, а ваша - в заданное.
то есть для вашего варианта нужно модифицировать функцию так, чтобы она еще получала параметр, указывающий на номер разряда индикатора, в котором должен появиться результат...

Для вывода часов-минут-секунд можно функцию упростить: ведь всегда известно, что выводить надо 2 символа, всегда и без вариантов. поэтому цикл будет не от "конца массива" и до его начала, а от "заданной позиции" и всего с двумя повторами. т.е. как-то так:

Код: Выделить всё

//for(i=MAX_SIZE-1; i>=0; i--){
           // цикл заполнения выходного массива СПРАВА НАЛЕВО, начиная с заданной позиции на 2 разряда
for(i=pos; i>pos-2;i--)
надеюсь, остальное вы додумаете самостоятельно... и не забывайте, что позиция задается не для начала числа на индикаторе, а для его конца (хотя сделать и по-нормальному не сложно).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Можно и проще. Если часы - это переменная hour, минуты - min, то trim_convert((uint16_t)hour * 100 + min); сразу даст нужный результат. Разве что точку-разделитель добавить останется.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

WiseLord писал(а):Можно и проще.
логично :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

Как можна склеить 3 переменных в одну чтобы получилось ЧасыМинутыСекунды ?
Tell Me The Truth
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Вопрос не понятен, поподробнее опишите задачу.
Что за переменные (тип), в какую переменную нужно их "склеить", ... ?
Пример приведите.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

Спасибо,уже понял
Сделал как советовал постами выше WiseLord
Он показал для двух переменных
Для трех аналогчно
Tell Me The Truth
Ответить

Вернуться в «Разные вопросы по МК»