Ввод целых однобайтных чисел - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здраствуйте. Сегодня увидел некое странное поведение компилятора. Хочу собсно спросить, то ли я напартачил, то ли это компилятор не в своем уме. Отмечу, что пользуюсь средой DevC++ 4.9.9.2. то есть компилятор у меня gcc, если я не ошибаюсь. И так приступим к сути проблемы. Есть код:
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    char x = -1, y = -1, z = -1;
    printf("enter x:"); scanf("%d", &x);
    printf("enter y:"); scanf("%d", &y);
    printf("enter z:"); scanf("%d", &z);
    printf("x = %d; y = %d; z = %d;\n",x,y,z);
 
    system("pause");
    return 0;
}
Ну, допустим ввожу я числа: 20, 30, 40 по очереди, как запрашивает программа. то есть х: 20, y: 30, z: 40. И, что Вы думаете выведется на екран? x = 20; y = 30; z = 40;? Угу я тоже так думал, а еще думал почему же это у меня программа неправильно рабоает? а x = 0; y = 0; z = 40; не хотите? Да да имено таким будет вывод! Неожиданно правда? Я тоже такого не ожидал. Но факт есть факт. И скрин ему подверждение:
http://s2.ipicture.ru/uploads/20120921/ANRghILL.png
Но давайте глянем, что будет если поменять очередь ввода чисел, например сначала введем y, а потом уже x и z:
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    char x = -1, y = -1, z = -1;
    printf("enter y:"); scanf("%d", &y);
    printf("enter x:"); scanf("%d", &x);
    printf("enter z:"); scanf("%d", &z);
    printf("x = %d; y = %d; z = %d;\n",x,y,z);
 
    system("pause");
    return 0;
}
И так, вводим числа, например: 2, 4, 8. что изменилось? Ну да, порядок ввода и значения переменных измнились. Тут собсно против танка не попрешь - спорить не буду. Ну, а вывод на экран? "Ну, а что вывод на экран!?" - скажет Вам компилятор. А вывод как был неправильным, так и остался:
http://s2.ipicture.ru/uploads/20120921/a3qm4RJR.png
Идем дальше. "А давайте ка поставим ввод z в начало" - возможно скажите Вы, - "а потом уж x да y". А что? Давайте! И так, меняем порядок ввода:
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    char x = -1, y = -1, z = -1;
    printf("enter z:"); scanf("%d", &z);
    printf("enter x:"); scanf("%d", &x);
    printf("enter y:"); scanf("%d", &y);
    printf("x = %d; y = %d; z = %d;\n",x,y,z);
 
    system("pause");
    return 0;
}
Значит, сменили порядок ввода, компилируем, запускаем программу, вводим: 1, 2, 3. Если Вы подумали, что программа на сей раз выдаст правильный результат, то Вы правильно подумали! Да, дествительно правльно, но... лишь на две третих, ибо вывод будет таковым:
http://s2.ipicture.ru/uploads/20120921/X2VTezGR.png
В заключение скажу (дабы не плодить еще примеры кода и вывода), что такая вот беда будет, если переменные вводятся в том же порядке в котором их имена идут по алфавиту. Это касается переменных типа char, которые вводятся и выводятся как целые числа + имена котрых состоят из одной буквы. А вобще я пробовал чтото типо xdfas вместо x и программа работала так же некоректно. Не знаю с чем все это связано. Но мне кажется так не должно быть. И к стати, проблема эта возникает не на этапе использования(то есть ввода даном случае), а на этапе ввода чисел, потому и программа выполняется не правильно. Если кто вкурсе почему именно так, или, что я делал не правильно, то пишите. Отмечу еще, что в том же файле у меня еще гдето 150 строчек кода было, но они не использовались в выше приведенной программе и как следствие на ход выполнения программы влиять не должны. Хух. Фсе. Спасибо за внимание.

Решение задачи: «Ввод целых однобайтных чисел»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    char x = -1, y = -1, z = -1;
    printf("enter x:"); scanf("%d", &x);
    printf("x = %d;\n",x); 
    printf("enter y:"); scanf("%d", &y);
   printf("x = %d; y = %d; \n",x,y);
    printf("enter z:"); scanf("%d", &z);
    printf("x = %d; y = %d; z = %d;\n",x,y,z);
 
    system("pause");
    return 0;
}

Объяснение кода листинга программы

В этом коде считываются три целых однобайтных числа с помощью функции scanf. Затем они выводятся на экран с помощью функции printf. Каждое считанное число выводится в формате %d, который является форматом для вывода целых чисел. Несмотря на то, что числа считываются как char, в данном случае они интерпретируются как int, поскольку в языке C не происходит автоматического приведения типов. Затем программа ожидает нажатия клавиши для выхода из консоли.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.333 из 5
Похожие ответы