Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 04.10.2016, 17:08   #1
zaira001002
Форумчанин
 
Аватар для zaira001002
 
Регистрация: 13.09.2012
Сообщений: 122
По умолчанию Массив , обработка ввода (Си)

На входе у меня вещественное число. Выводит неверный результат Size_of_Man = 14, которое должно читать мне длину массива Man . А Size_of_Num печатает верно, вроде я одинаково использовала обе переменные и массивы. Что не так с Man[]; Size_of_Man?
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 0
#define UN_RIGHT_SINTAKSIS 1
#define ZERO 3
// сдвигает массив на shift элементов влево
int Shift(char Num[], const int Num_L, const int shift)
{
    int i;
    if (shift == 0)
        return OK;

    for(i = 0; i < Num_L-shift; i++)
    {
        Num[i] = Num[i+shift];
    }
    return OK;
}

// проверяет действительное число на правильность ввода
int Take_Number2 (char Num_2[], char *Man_Sign, char *Por_Sign,int *Num_L, int *Man_L, char Man[], char Por[], int *Por_L)
{
   // int Por_L = 0;
    int i = 0;
    int Presence_sign = 0;
      // знак мантиссы числа
    if ((Num_2[0] == '+') || (((int)Num_2[0] >47) && ((int)Num_2[0] < 58)))
        *Man_Sign = '+';
    else
    {
        if (Num_2[0] == '-')
            *Man_Sign = '-';
        else
            return UN_RIGHT_SINTAKSIS;
    }
    if ((Num_2[0] == '+') || (Num_2[0] == '-'))
    {
        i++;
        Presence_sign = 1;
    }
    // Размер массива без знака
    size_t Size_of_Num= strlen(Num_2) - Presence_sign;
    printf("\nSize_of_Num =%d\n", Size_of_Num);
      // подсчёт мантиссы числа
    int Col_point = 0;
  //  int Por_Man = 0;
    int Pos_point = 0;
    *Man_L = 0;
    // создаем массив мантиссы без знака и запятой
    for (;(((((int)Num_2[i] >47) && ((int)Num_2[i] < 58)) || (Num_2[i] == '.')) && (*Man_L < 30)); i++)
    {
        if (Num_2[i] == '.')
        {
         Col_point ++;
         Pos_point = i;
         printf("\nCol_point = %d\n", Col_point);
         if (Col_point > 1)
             return UN_RIGHT_SINTAKSIS;
        }
        else
        {
            if (Col_point == 1)
            {
                Man[*Man_L] = Num_2[i];
                printf("\nMan[%d] = %c\n", *Man_L, Man[*Man_L]);
                (*Man_L)++;
            }
        }
    }
    printf("Man_L = %d", *Man_L);
    printf("i= %d", i);
    // Размер мантиссы без знака
    size_t Size_of_Man= strlen(Man) ;
    printf("\nSize_of_Man= %d", strlen(Man));
    // если числа то...
    if (*Man_L == Size_of_Man)
    {
    // если число начинается на нули
    for (i = 0; Man[i] == '0'; i++);
    {
        if (Col_point == 1)
        {
        if (((Size_of_Man> 2) && ( i == Size_of_Man)) || (i -Presence_sign == Size_of_Man))
            return ZERO;
        }
        if (((Size_of_Man> 2) && ( i == Size_of_Man)) || (i -Presence_sign == Size_of_Man))
             return ZERO;
    }
    if (i -Presence_sign == Size_of_Man)
    {
        Shift(Man,*Man_L,i-Presence_sign-1);
        (*Man_L) -= (i-Presence_sign-1);
    }
    else
    {
        Shift(Man,*Man_L,i);
        (*Man_L) -= i;
    }
    for(i = *Man_L; i > -1; i--)
    {
        Man[i] = Man[i-1];
        if (i == 0)
        {
            Man[i] = *Man_Sign;
        }
    }
    }
    else
        return UN_RIGHT_SINTAKSIS;

    if (Num_2[i] == 'E')
          i++;
        // знак порядка
    if ((Num_2[i] == '+') || ((Num_2[i] >47) && (Num_2[i] < 58)))
         *Por_Sign = '+';
    else
    {
         if (Num_2[i] == '-')
             *Por_Sign = '-';
         else
             return UN_RIGHT_SINTAKSIS;
    }
    if ((Num_2[i] == '+') || (Num_2[i] == '-'))
    {
         i++;
         Presence_sign = 1;
    }
    // подсчет порядка числа
    if (Num_2[i] > 47 && Num_2[i] < 58)
        return UN_RIGHT_SINTAKSIS;
    i =(int)*Man + *Man_L - Pos_point +1;
   *Por = (char) i;
   printf("\n NUM_2 \n%s\n", Num_2);
   printf("\n Man \n%s\n", Man);
   printf("\n Por \n%s\n", Por);
   //printf("\n NUM_2 \n%s\n", Num_2);
   return OK;
}

int main (void)
{
    char Num_2[41];	          // числа 1, 2
    char Man[31];                          // мантисcа числа
    char   Num_Sign, Man_Sign, Por_Sign;            // знак мантисcы и числа
    char Por [5];             // порядок чисел 1, 2
    int  Num_L,   Man_L, Por_L;                    // длина числа и мантиссы
    char Result[32] = {0}; // мантисcа, порядок результата
    int n, l;
    setlocale(0, "russian");

            printf("Input the second number:\n                              <-30\n");
            scanf("%s", Num_2);
            l = Take_Number2 (Num_2, &Man_Sign, &Por_Sign,&Num_L, &Man_L, Man, Por,&Por_L);
            if (l == UN_RIGHT_SINTAKSIS)
            {
                printf("\nError 1: Incorrect input.\n");
                printf("%s", Num_2);
                system("pause");
                return 0;
            }
            else
                if (l == ZERO)
                {
                    printf("Input the second number:\n                              <-30\n");
                    printf("%s", Num_2);
                    printf("On 0 can't divide!");
                    system("pause");
                    return 0;
                }
                else
                {
                    printf("Input the second number:\n                              <-30\n");
                    printf("%s", Num_2);
                    printf("The result of dividing is:%s", Result);
                    system("pause");
                }
}
zaira001002 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка ввода. Стрелочки. OnKeyUp/Down denrubun Общие вопросы C/C++ 1 21.09.2013 09:36
Обработка ввода в EDIT по notification Trust_357 Win Api 13 27.12.2011 22:42
C++: обработка ввода данных kAND Помощь студентам 8 30.04.2009 17:33
Обработка исключений ввода в TMaskedEdit joker Общие вопросы Delphi 8 11.06.2008 14:02


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840