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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2012, 21:45   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию После ввода второго целочисленного массива на экран выводятся непонятные большие числа

Пишу программу для сложения простых дробей. У меня два массива по три элемента каждые (целочисленные). Массив первый считыается и выводится на экран правильно, а после ввода второго массива на экране отображаются переполненные числа, в чём причина? Когда я закоменчиваю считывание первого массива и вывод его на экран. То второй считывается и выводится на экран нормально.

Код:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 3

void russish(char array[]);
void neprav_drob(char zn,int chislo[]);


int main()
{
int a[N],b[N],c[N];
char znak[N],stroka[50];



strcpy(stroka,"Программа для сложения простых двух дробей");
russish(stroka);
printf("\t\t\t%s\n\n\n",stroka);

strcpy(stroka,"Введите дроби в формате: 'знак(целая часть)числитель/знаменатель', дроби разделить клавишей 'ENTER', пример:");
russish(stroka);
printf("%s\n-(5)2/6\n+(0)1/3\n",stroka);


printf("A = ");
scanf("%c(%i)%i/%i",&znak[0],&a[0],&a[1],&a[2]);   

printf("%i/%i\n",a[1],a[2]);

printf("B = ");
scanf("%c(%i)%i/%i",&znak[1],&b[0],&b[1],&b[2]);

printf("%i/%i\n",b[1],b[2]); 

    
neprav_drob(znak[0],a);
neprav_drob(znak[1],b);    
    
  
  
  
  
system("pause");    
return 0;
}


void russish(char array[])////РУССКИЕ БУКВЫ!!!
{
int granica;
 
granica=strlen(array);       
for(int i=0;i<granica;i++)
{
        
switch(array[i])
{case-71:array[i]=78;break;
case-72:array[i]=165;break;
case-88:array[i]=133;break;}        
        
              
if (array[i]>=-64 && array[i]<=-17) array[i]+=192;
if (array[i]>=-16 && array[i]<=-1) array[i]+=240;   
       
        
}  
     
}



void neprav_drob(char zn,int chislo[])
{

chislo[1]+=chislo[0]*chislo[2];
if (zn=='-') chislo[1]=-chislo[1];
     
}
ivan.tiran вне форума Ответить с цитированием
Старый 12.11.2012, 21:55   #2
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию На экране:

Программа для сложения простых двух дробей


Введите дроби в формате: 'знак(целая часть)числитель/знаменатель', дроби раздели
ть клавишей 'ENTER', пример:
-(5)2/6
+(0)1/3
A = +(2)1/3
1/3
B = -(0)1/5
-1461670112/987801004
Для продолжения нажмите любую клавишу . . .
ivan.tiran вне форума Ответить с цитированием
Старый 12.11.2012, 23:57   #3
laminar
 
Регистрация: 11.11.2012
Сообщений: 7
По умолчанию

по каким то причинам
Код:
scanf("%c(%i)%i/%i",&znak[1],&b[0],&b[1],&b[2]);
не считывает введенную строку, как следствие этим элементам массива значения не присваиваются и вываливает "мусор"
laminar вне форума Ответить с цитированием
Старый 13.11.2012, 08:02   #4
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Но почему тогда первый массив считывается? Сканфы одинаковые.
ivan.tiran вне форума Ответить с цитированием
Старый 13.11.2012, 09:48   #5
laminar
 
Регистрация: 11.11.2012
Сообщений: 7
По умолчанию

Может я и не прав, но как идея - прочитав первым scanf строку получаете символ конца строки, который блокирует дальнейшее чтение входного потока и как следствие второй scanf уже ничего не читает.
Попробуйте перед вторым scanf сделать сброс потока

Код:
fflash(stdin);

printf("B = ");
scanf("%c(%i)%i/%i",&znak[1],&b[0],&b[1],&b[2]);
либо clearerr

Последний раз редактировалось laminar; 13.11.2012 в 09:58.
laminar вне форума Ответить с цитированием
Старый 13.11.2012, 09:51   #6
laminar
 
Регистрация: 11.11.2012
Сообщений: 7
По умолчанию

По ряду причин выше не совсем рабочее решение, но ход мысли правильный - очистка входного потока, ну и вот так работает

Код:
scanf( "%*c" );
printf("B = ");
scanf("%c(%i)%i/%i",&znak[1],&b[0],&b[1],&b[2]);
Если эти конструкции будут в цикле, то надо будет добавить еще один сброс, после второго scanf

Последний раз редактировалось laminar; 13.11.2012 в 17:28.
laminar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу понять почему не правильно выводятся числа массива Nikitos_ Паскаль, Turbo Pascal, PascalABC.NET 7 31.05.2012 11:52
По массивам, SOS! из целочисленного массива удалить из массива элементы, встречающиеся менее 3-х раз prelest' Паскаль, Turbo Pascal, PascalABC.NET 1 23.05.2011 22:37
При делении чисел выводятся непонятные числа! khorolpavel Общие вопросы C/C++ 2 29.11.2010 16:17
В массиве найти кол-во нечетных чисел расположенных после второго большего числа Desvi Помощь студентам 0 29.04.2010 17:12