Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Программа, которая вычисляет площадь и периметр круга, прямоугольника, треугольник Си (http://forum.oszone.net/showthread.php?t=249467)

partisanus 19-12-2012 00:50 2048472

Программа, которая вычисляет площадь и периметр круга, прямоугольника, треугольник Си
 
Помучался, но сделал, снова. Надеюсь и это пригодится.
Я совсем не давно изучаю программирование(хожу на курсы), советы принимаю с удовольствием :), кроме советов типа: "Бросай дурное!" и т.п. ;)

В процессе создания данной программы, возник вопрос, на который, поискав в интернете ответ, ничего работающего не нашел.
Есть ли какие-то команды, с помощью которых, можно было бы возвращаться назад по действиям программы. Т.е. Например мне нужно оформить 5 задач, одна из которых, нижеприведенная, таким образом чтобы сначала выбиралась задача, а потом какие-то ее подпункты, можно ли одной командой сделать, чтобы после выполнения какого-то действия программа возвращалась к выбору задачи, бес зацикливаний и т.п., если можно, то как? Буду крайне признателен!



PHP код:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>

void main()
{
int x,y,z,u,a,b;
float c,d;
printf("1 - kryg");                                                    //начальная менюшка
printf("\n2 - prjamoygol'nik");
printf("\n3 - treugol'nik");
printf("\n0 - dlja vihoda ");
printf("\n\n***** viberite nygnii pynkt *****\n");
scanf("%d",&x);
while (
x!=0)                                                        //зацикливаем меню пока не введем 0 для выхода из программы
    
{switch(x)
            {case 
1:                                                //оператор выбора Если нажали 1 (выбрали круг)
            
printf("vvedite radiys kryga v m \t");                    //запрос ввода необходимых данных
            
scanf("%d",&y);                                            //вводим радиус круга    
            
while(y<=0)                                                //защита от ввода нуля (вводим до тех пор, пока не введем значение, больше нуля)
                
scanf("%d",&y);
            
a=2*3.14*y;                                                //считаем периметр(длинну окружности)
            
b=3.14*y*y;                                                //считаем площадь круга            
            
printf("perimetr kryga raven:%d m\n",a);                //выводим периметр
            
printf("ploschad' kryga ravna:%d m\n",b);                //выводим площадь            
            
break;                                                    //выход к начальному меню
            
                

            
case 2:                                                    //оператор выбора Если нажали 2(выбрали прямоугольник)
            
printf("vvedite dlini storon prjamoygol'nika v m \n");        
            
scanf("\n%d",&y);                                        //запрос ввода необходимых данных (длинна 1-ой стороны)
            
while(y<=0)                                                //защита от ввода нуля
                
scanf("%d",&y);
            
scanf("\n%d",&z);                                        //запрос ввода необходимых данных (длинна 2-ой стороны)
            
while(z<=0)                                                //защита от ввода нуля
                
scanf("%d",&z);
            
a=(y+z)*2;                                                //расчет периметра
            
b=y*z;                                                    //расчет площади        
            
printf("perimetr prjamoygol'nika raven:%d m\n",a);        
            
printf("ploschad' prjamoygol'nika ravna:%d m\n",b);        
            break;
            
    
            case 
3:                                                                                //оператор выбора Если нажали 2(выбрали прямоугольник)
            
printf("vvedite dlini storon treygol'nika v m \n");
            
scanf("%d",&y);                                                                        //запрос ввода необходимых данных (длинна 1-ой стороны)
            
while(y<=0)                                                                            //защита от ввода нуля
                
scanf("%d",&y);
            
scanf("%d",&z);                                                                        //запрос ввода необходимых данных (длинна 2-ой стороны)
            
while(z<=0)                                                                            //защита от ввода нуля
                
scanf("%d",&z);
            if(
y>z)                                                                                //если 1 сторона длиннее второй
                
{printf("vvedite dlinny tret'ej storony v predelah ot %d m do %d m\n",zy+z);    //выводим подсказку какой длинны должна быть третяя сторона(согласно правилу, что длинна одной стороны не может быть длиннее или равна сумме длинн двух других)
                
scanf("%d",&u);                                                                    //вводим длинну 3-ей стороны
                
while((u<z)&&(u>y+z))                                                            //зацикливаем ввод, пока не будет введена правильная длинна(согласно нашим условиям)
                    
scanf("%d",&u);}
            else if(
z>y)                                                                                //то же что и выше, только если 2-ая сторона длиннее
                
{printf("vvedite dlinny tret'ej storony v predelah ot %d m do %d m\n",yy+z);
                
scanf("%d",&u);
                while((
u<y)&&(u>y+z))
                    
scanf("%d",&u);}
            
a=y+z+u;                                                //считаем периметр
            
d=a/2*(a/2-y)*(a/2-z)*(a/2-u);                            //Считаем площадь треугольника по формуле Герона, скорее всего можно в 1 действие, не проверял, но мне так больше нравится =)
            
c=sqrt(d);                                                //2-ое действие по нахождение площади(извлекаем корень из выражения выше)    
            
printf("perimetr treygol'nika raven:%d m\n",a);            //выводим периметр
            
printf("ploschad' treygol'nika ravna:%.2f m\n",c);            //выводим площадь
            
break;

            default: 
            
printf("Oshibka! \n");
            }
printf("\nnajmite na lybyy knopky dlja vozvrata k meny");            // Дале идет концовка Цикла While, лагодаря ему программа работает пока не выбрать выход(0)
getch();                                                            //ожидает пока нажатия на любую кнопку перед продолжением действий    
 
system("cls");                                                        //команда очистки экрана
     
printf("1 - kryg");
printf("\n2 - prjamoygol'nik");
printf("\n3 - treugol'nik");
printf("\n0 - dlja vihoda ");
printf("\n\n***** viberite nygnii pynkt *****\n");
scanf("%d",&x);
        
    }



lxa85 19-12-2012 02:44 2048511

partisanus,
Цитата:

Цитата partisanus
можно ли одной командой сделать, чтобы после выполнения какого-то действия программа возвращалась к выбору задачи, бес зацикливаний и т.п. »

Нельзя. Это архитектурная проблема. Когда начнете изучать ассемблер, т.е. прямые команды процессору, тогда вы поймете, что он(процессор) до крайней степени линеен и глуп. И если ему не поставить условный переход, то сам он не догадается, к какой инструкции ему следует вернуться и продолжить выполнение программы.

partisanus 20-12-2012 03:07 2049389

Цитата:

Цитата lxa85
Нельзя. Это архитектурная проблема. Когда начнете изучать ассемблер, т.е. прямые команды процессору, тогда вы поймете, что он(процессор) до крайней степени линеен и глуп. И если ему не поставить условный переход, то сам он не догадается, к какой инструкции ему следует вернуться и продолжить выполнение программы. »

Понял. Спасибо!


Время: 01:48.

Время: 01:48.
© OSzone.net 2001-