LINUX.ORG.RU

Начал изучение С, есть вопросы.


0

2

Начал изучать Си. Книга «Харви Дейтел. Пол Дейтел. Как программировать на С». Там на 128 странице есть задание. «Разработайте программу на Си для ввода пройденного расстояния в километрах и объема каждой заправки в литрах. Программа должна вычислять и отображать на экране количество пройденных километров на литр для каждой заправки авто. После обработки всей входной информации программа должна вычислить и вывести общее количество пройденных километров на литр по всем заправкам.»
.. Введите расход бензина (-1, если ввод закончен): 12.8
..Введите пройденный путь: 287
Для этой заправки получено километр/литр 22.42
.. Введите расход бензина (-1, если ввод закончен): 10.3
..Введите пройденный путь: 200
Для этой заправки получено километр/литр 22.42
.. Введите расход бензина (-1, если ввод закончен): 5
..Введите пройденный путь: 120
Для этой заправки получено километр/литр 22.42
.. Введите расход бензина (-1, если ввод закончен): -1
Среднее число километров/литр 21.60
Я не прошу что бы за меня решали задачу.
Вот мой код, буду благодарен за дельные советы, прошу конструктивной критики.

#include <stdio.h>

int main()

{
float srednee, rashod, s, kmlitr, summa;
int a;
a = 0;
rashod = 0;
while (rashod != -1)
  {
	printf("Введите расход бензина (-1 если ввод закончен):");
	scanf("%f", &rashod);
	printf("Введите пройденный путь:");
	scanf("%f", &s);
	kmlitr = s / rashod;
	printf("kmlitr %.2f\n", kmlitr);
		if (rashod > 0)
			summa += kmlitr;
		if (rashod > 0) a++;
	srednee = summa / a;
  }

printf("Средний расход бензина %.2f", srednee);
return 0;
}
Может задачу и можно решить по-другому, но я только в начале прочтения книги. Что конкретно у меня не получается:
1. Если ввести -1, то все равно выводится вопрос о пройденном пути, и только потом заканчивает считаться среднее.
2. Знаю что задача не сложна сама по себе, но в книге до этой задачи не давались примеры хоть сколько похожие.
3. Что может посоветуете от себя (книги, сайты, может есть у кого целые задания - желательно с решением - НО заглядывать не буду пока не решу саму задачу). Это здорово помогло бы мне продвинуться.
З.Ы: Учусь программировать в Линуксе (Agiliya 8), я в 10 классе.

Ответ на: комментарий от geekless

Как по мне, так while(1) читается гораздо лучше, чем ктулху-смайлик for(;;).

Так они же не эквивалентны. while(1) будет исполнятся вечно, а for(;;) до тех пор пока Ктулху не проснётся.

Kosyak ★★★★
()

Скажи, как успехи? Получилось ли доделать эту задачу? Если да, давай следующую неполучающуюся.

yura_ts ★★
()

float srednee, rashod, s, kmlitr, summa

Закрой книгу, открой словарь великого и могучего английского языка и, пока не отучишь себя от транслита, сюда не возвращайся. «Рашод» у него, видите ли!

red_eyed_peguin
()
Ответ на: комментарий от yura_ts
#include <stdio.h>

int main()

{
float mean, consumption, s, kmlitr, sum;
int a;
a = 0;
consumption = .0;
mean = 1;
printf("Введите расход бензина (-1 если ввод закончен):");
scanf("%f", &consumption);

if (consumption >= .1) while (consumption != -1) /* идет проверка на число меньше 0.1 (устраивает пока так, если проверка проходит то идем дальше*/
  {
	printf("Введите пройденный путь:");
	scanf("%f", &s);
	kmlitr = s / consumption;
	printf("kmlitr %.2f\n", kmlitr);
	sum += kmlitr;
	++a;
	printf("Введите расход бензина (-1 если ввод закончен):");
	scanf("%f", &consumption);
  }
else printf("Вы ввели некоректные данные");  
mean = sum / a;
printf("Средний расход бензина %.2f", mean);
return 0;
	}

Готов читать вашу конструктивную критику, получилось у меня вот так. Я постарался использовать только те знания которым обладаю. Кернигана и Риччи себе распечатал (мне так удобнее читать), с той книгой что сейчас изучаю, конечно есть разница в изложении материала. И кстати примеров бы побольше (хочеться учиться именно на примерах - и задачах), а то сам материал прочитать это одно, потом где его применять совсем другое.

novichek01
() автор топика
Ответ на: комментарий от novichek01
#include <stdio.h>

int main()

{
   float mean, consumption, s, kmlitr, sum;
   int a;
   a = 0;
   consumption = .0;
   mean = 1;/*Зачем?*/
   printf("Введите расход бензина (-1 если ввод закончен):");
   scanf("%f", &consumption);
   /* переменная sum не инициализирована. */
   if (consumption >= .1) while (consumption != -1) /* идет проверка на число меньше 0.1    (устраивает пока так, если проверка проходит то идем дальше*/
      /* Логическая ошибка: проверка  if (consumption >= .1) выполнится только один раз перед циклом. */
      /*А надо делать её каждый раз в цикле.*/  
      /*Даже если юзер ввёл -1, проверка может не пройти: float  представлен лишь приблизительно.*/     
     /*Нужна проверка while(consumption > 0)*/
     {
	printf("Введите пройденный путь:");
	scanf("%f", &s);
        /*Нужна проверка  s > 0.0*/
	kmlitr = s / consumption; /*Если пользователь ввёл 0, то программа грохнется*/
	printf("kmlitr %.2f\n", kmlitr);
	sum += kmlitr;
	++a;
	printf("Введите расход бензина (-1 если ввод закончен):");
	scanf("%f", &consumption);
        /*Нужна проверка  consumption > 0.0 или (fabs(consumption + 1) < 0.1*/
    }
    else
      printf("Вы ввели некоректные данные");/*В этой ветке надо добавить return 1;*/
   /*Надо проверить a на 0*/
   mean = sum / a; /*mean не нужна. Достаточно printf("Средний расход бензина %.2f", sum / a);*/
   printf("Средний расход бензина %.2f", mean);
   return 0;
}
anonymous
()
Ответ на: комментарий от anonymous
#include <stdio.h>

int main()

{
float consumption, s, kmlitr, sum;
int a;
a = 0;
consumption = .0;
printf("Введите расход бензина (-1 если ввод закончен):");
scanf("%f", &consumption);

if (consumption >= .1) while (consumption != -1)
  {while (consumption > 0) //вот тут не могу понять как правильно ввести проверку, пришлось зациклить. если ввести меньше 0 то программа просто не выполняется
		{
			printf("Введите пройденный путь:");
			scanf("%f", &s);

			kmlitr = s / consumption;

			printf("kmlitr %.2f\n", kmlitr);
			sum += kmlitr;
			++a;

			printf("Введите расход бензина (-1 если ввод закончен):");
			scanf("%f", &consumption);
		}
}
else printf("Вы ввели некоректные данные");
printf("Средний расход бензина %.2f", sum / a); //спасибо за подсказку нам и не надо теперь среднее как переменная.
return 0;
	}

Буду благодарен за помощь в данном вопросе.
novichek01
() автор топика
Ответ на: комментарий от novichek01

Тяжело при таких жёстких условиях корректно написАть.

Итак, Из циклов знаем только while , операторов разрыва не знаем, из операторов ввода знаем только scanf , из fp — только float.

Тогда так:

#include <stdio.h>

int main()
{
float consumption, s, kmlitr, sum = 0.0;
int a = 0, haveMoreData = 1;

  while (haveMoreData)
  {
     int ok;
     consumption = 0.0;
     printf("\nВведите расход бензина (-1 если ввод закончен): ");
     ok = scanf("%f", &consumption);
     if( (ok != 1) || (consumption < 0.0) )
     {
        if( (consumption < -1.0001) || (consumption > -0.9999) )
        {
           printf("Вы ввели некорректный расход бензина\n");
           if(ok != 1)
           {
              char ch = '\0';
              while(ch != '\n')
                 scanf("%c",&ch);
           }
        }
        else
           haveMoreData = 0; 
     }
     else
     {
        int makeEnter = 1;
        while(makeEnter)
        {
           printf("\nВведите пройденный путь: ");
	   ok = scanf("%f", &s);
           if(ok != 1)
           {
              char ch = '\0';
              while(ch != '\n')
                 scanf("%c",&ch);
           }
           else if( s > 0.0 )
              makeEnter = 0;
           if(makeEnter)
              printf("Вы ввели некорректный пройденный путь\n");
        }              
	kmlitr = s / consumption;
        printf("\nkmlitr %.2f\n", kmlitr);
        sum += kmlitr;
        ++a;
     }
  }
  if(a)
     printf("Средний расход бензина %.2f\n",sum / a);
  return 0;
}
anonymous
()
Ответ на: комментарий от novichek01
else printf("Вы ввели некоректные данные");
printf("Средний расход бензина %.2f", sum / a); //спасибо за подсказку нам и не надо теперь среднее как переменная.

И при вводе некорректных данных ты увидишь

«Вы ввели некоректные данные Средний расход бензина xxx»

Если вообще увидишь, т.к. будет деление на 0 (a == 0).

alex_custov ★★★★★
()
Ответ на: комментарий от anonymous

вдогонку: надо исключить consumption == 0:

if( (ok != 1) || (consumption <= 0.0) )

anonymous
()
Ответ на: комментарий от anonymous

Большое спасибо, продолжу свое самообучение дальше (параллельно буду разбирать ваш пример, что бы лучше его понять)

novichek01
() автор топика
Ответ на: комментарий от slackwarrior

Мне в свое время не мало помогали) Для меня вообще помогать людям нормально. Отдаю долг помощи мне.

TheKnight ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.