0 / 0 / 0
Регистрация: 26.10.2017
Сообщений: 9
1

Объясните пару частей из Кода на СИ

23.11.2017, 04:19. Показов 430. Ответов 1

Это код перевода из любой системы счисления в другую , пределы от 2 до 36. Красный выделено то, что не понятно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include<stdio.h>
#include<ctype.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
 
void ErrorNotation(int i) { /*проверка ошибок ввода*/
    if (i<2 || i>36) {
        puts("Error: numeric system must be between [2...36]");
        exit(1);
    }
}
 
void ErrorNumber(char* a, int base) {  /*проверка ошибок ввода*/
    if (base <= 10) {
        for (; *a; ++a) {
            if (*a<48 || *a >= 48 + base) {
                printf("Error: all inputted number symbols must be between [0...%d]", base - 1);
                exit(1);
            }
        }
    }
}
 
void kk(int base, int baskon) {
    int i = 0, m = 0;
    char a[20] = { '\0' }, b[20], *p = a;
    ErrorNotation(base);
    ErrorNotation(baskon);
    getchar(); //Считывает символ
    printf("Input number in %d notation: ", base); /*заданное число*/
    gets_s(a); //считывает символы из стандартного потока ввода до символа новой строки n или до тех пор, пока не будет достигнут конец файла EOF, после чего сохраняет считанные символы в строку типа char.
    ErrorNumber(a, base);
/* ***** */
    while (*(p + 1)) ++p;
 
    for (; p >= a; --p, ++i) {
        if (*p>'9') {
            *p = toupper(*p); /*toupper переводит строчные буквы в прописные*/
            *p -= 7;
 
        }
/* ***** */
        /*Перевод в 10-чную с.с.*/
        m += (*p - 48)*pow(static_cast< double >(base), i); //static_cast< double > преобразование int в bubble , дабы не было усечения результата
    }
    printf("\n");
    if ((base != 10) && (baskon != 10)) printf("Number in 10 notation: %d\n", m);
    i = 0;
    while (m) { /*Перевод из 10-чной с.с. в другую*/
        b[i] = m%baskon;
        m /= baskon;
        ++i;
    }
    printf("\n");
    printf("Number in %d notation: ", baskon);
/* ***** */
    while (--i >= 0) {
        b[i]>9 ? printf("%c", b[i] + 55) : printf("%d", b[i]);
/* ***** */
    };
 
}
 
 
void main() {
    int  base, baskon;
    printf("Input base: "); /*исходная система счисления*/
    scanf_s("%d", &base);
    printf("Input final base: "); /*результирующая система счисления*/
    scanf_s("%d", &baskon);
    kk(base, baskon);
    _getch();
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2017, 04:19
Ответы с готовыми решениями:

задачка из javarush, объясните пару строчек кода
Задача стояла так: Введи с клавиатуры 10 слов в список строк, метод doubleValues должен удваивать...

Объясните доступным языком пару строк кода
что обозначает подобный код: #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; ...

Объясните пару строчек кода из метода расчета площади многоугольника разбитого на треугольники
Объясните тупому два метода,если что это расчет площади многоугольника разбитого на треугольники....

Как разделить сайт на пару частей?
хотел бы узнать как разделить сайт на пару частей,делал через фрейм,получилось так что на каждом...

1
1661 / 993 / 651
Регистрация: 25.04.2016
Сообщений: 2,805
23.11.2017, 12:29 2
Честно? Даже разбираться не хочется. Одно слово: г*в**код. Вот такие вот структуры: for (; p >= a; --p, ++i) говорят о том, что писал ас, программист от бога.

C
1
while (*(p + 1)) ++p;
p - это указатель, котрый ссылается на начало массива char a[20]; Таким образом, p = a[0]; p+1 = a[1]; p+2 = a[2]; и так далее.
Т.е. while (*(p + 1)) перебирает все ячейки массива a[20], пока ему не встретится нулевое значение.
Ну а ++p дополнительно увеличивает p на 1, т.е. получается примерно следующее:

C
1
2
3
4
5
i = 0;
while (a[i+1] != 0)
{
    i = i+1;
}
Если значение элемента массива a за номером i+1 не равно 0, увеличить i на 1.

C
1
for (; p >= a; --p, ++i) {
Пока p не выходит за пределы массива a[], на каждом шаге цикла уменьшать p на 1 и увеличивать i на 1.

Префиксный декремент --, т.е. когда он стоит перед переменной, означает, что надо уменьшить значение переменной на 1 и потом использовать получившееся значение в выражении. Например:

C
1
2
3
4
5
int i = 5;
int b = 2;
//b = b * --i;
i = i -1;
b = b * i;
запись вида += означает, что надо взять значение переменной, изменить его и записать обратно в переменную, + означает, что к значению переменной надо прибавить другое значение и записать полученный результат в ту же переменную:
C
1
2
3
4
int a = 2;
int b = 3;
//a += b
a = a + b;
Таким образом предыдущий пример можно записать как:
C
1
b *= --i;
и так далее. Лучше найдите автора этого творения и оторвите ему ... руку, например, чтобы больше никогда всякую пакость не писал.

...Никакого желания эту помойку разгребать.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2017, 12:29
Помогаю со студенческими работами здесь

Есть ли в БД ошибка, объясните пару моментов.
CREATE DATABASE SESSION; USE `SESSION`; CREATE TABLE `group` ( `id` int(4) unsigned NOT...

Методы и приведение типов, объясните пару моментов
Здравствуйте, помогите разобраться с кодом. class ChkNum { // Возвратить значение...

Зравствуйте! Объясните мне пожалуйста пару моментов
Вот код работающей программы, объясните пожалуйста, почему в этой строчке for j in...

Объясните пару моментов о поиске в hash-таблице
Подразумевается реализация с использованием динамического массива односвязных списков. Вот как я...

Не работает сокрытие частей кода
Собственно сабж описан в заголовке. Подскажите как вернуть. Сброс параметров не помог.

Привязка частей кода программы к конкретным адресам во флэш.
Привет всем. Хочу чтоб разные блоки кодов программы ложились на конкретные, мне нужные, адреса во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru