Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите разобраться. Язык С

Анна Рец Ученик (120), закрыт 5 лет назад
Часть программы для ввода массива с клавиатуры. Работает правильно только при вводе целых чисел, при вводе десятичной дроби выдает следующее (скрин 2).
Вот код, на всякий случай (На первом скрине удали функцию InNumF, чтобы уместить в один скрин. А так, InNumF-функция проверки на правильность ввода)

#include
#include
#include
#include
#include
float InNumF()
{
int i,f1=0;
char s[10];
while(1)
{
gets(s);
for (i=0;i=48&&s[i]<=57) continue;
if (s[i]==','&&!f1) {f1=1; continue;}
if (s[i]=='.'&&!f1) {s[i]=',';f1=1; continue;}
if (s[i]=='-'&&i==0) continue;
break;
}
if (i==strlen(s)) break;
printf("\nВведено недопустимое значение, повторите ввод: ");
f1=0;
}
return strtof(s,NULL);
}
int main()
{
int k,i,j,n;
float f,s;
setlocale(LC_ALL, "Russian");
printf("Введите порядок матрицы коэффициентов: ");
n=InNumF();
float a[n][n];
float b[n];
float x[n];
printf("Введите матрицу коэффициентов");
printf("\n");
for ( i=0; i < n; i ++ )
for ( j = 0; j < n; j ++ )
{
printf ("a[%d][%d]=", i, j);
scanf ("%d", & a[i][j]);
}
printf("Введите маccив свободных членов");
printf("\n");
for ( i=0; i < n; i ++ )
{
printf ("b[%d]=", i+1);
scanf ("%d", & b[i]);
}
return 0;
}
Дополнен 5 лет назад
Забыла исправить ошибку, которую уже нашла. При вводе с клавиатуры не %d, а %f. Однако, исправление этой ошибки проблему не исправляет
Исправленный код:

Часть программы для ввода массива с клавиатуры. Работает правильно только при вводе целых чисел, при вводе десятичной дроби выдает следующее (скрин 2).
Вот код, на всякий случай (На первом скрине удали функцию InNumF, чтобы уместить в один скрин. А так, InNumF-функция проверки на правильность ввода)

#include
#include
#include
#include
#include
float InNumF()
{
int i,f1=0;
char s[10];
while(1)
{
gets(s);
for (i=0;i=48&&s[i]<=57) continue;
if (s[i]==','&&!f1) {f1=1; continue;}
if (s[i]=='.'&&!f1) {s[i]=',';f1=1; continue;}
if (s[i]=='-'&&i==0) continue;
break;
}
if (i==strlen(s)) break;
printf("\nВведено недопустимое значение, повторите ввод: ");
f1=0;
}
return strtof(s,NULL);
}
int main()
{
int k,i,j,n;
float f,s;
setlocale(LC_ALL, "Russian");
printf("Введите порядок матрицы коэффициентов: ");
n=InNumF();
float a[n][n];
float b[n];
float x[n];
printf("Введите матрицу коэффициентов");
printf("\n");
for ( i=0; i < n; i ++ )
for ( j = 0; j < n; j ++ )
{
printf ("a[%d][%d]=", i, j);
scanf ("%f", & a[i][j]);
}
printf("Введите маccив свободных членов");
printf("\n");
for ( i=0; i < n; i ++ )
{
printf ("b[%d]=", i+1);
scanf ("%f", & b[i]);
}
return 0;
}
Лучший ответ
Айран Просветленный (26387) 5 лет назад
может дело в этом?
for (i=0;i=48&&s[i]<=57) continue;
не совсем понимаю зачем присваивать i число 48 на каждом цикле
Анна РецУченик (120) 5 лет назад
Нет, этой функцией пользуюсь не в одной программе и все всегда работало
Там скорее всего движок "Ответов" что-то съел. Такой, как в тексте, заголовок цикла недопустим по правилам языка.
Анна РецУченик (120) 5 лет назад
Вот скрин функции
Айран Просветленный (26387) "Работает правильно только при вводе целых чисел, при вводе десятичной дроби " у вас десятичная дробь через запятую или точку? такое ощущение что у вас 1.1 воспринимается как 1,1. возможно дело в setlocale russian
Остальные ответы
Похожие вопросы