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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2013, 16:12   #1
Ланулечка
 
Регистрация: 09.04.2013
Сообщений: 8
Печаль Необходимо построчно понять что написано в этом коде.

Мне необходимо построчно разобрать программу, написанную в Visual studio express 2008. Если можно писать попроще- в программировании я полный ноль, но лабу сдать очень надо.вот сам код:
С++:
Код:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
using namespace std;

void d (char * s)
{
char * p = s;
{ 
if (*p == '-') 
{
++p;
g = 1;
continue;
}
if (*p == '0') ++p;
else break;
}

char *i = p + strlen(p) - 1;
while (*i == '0') ;
++i;
*i = '\0';

if (g == 0)
memmove(s, p, strlen(p) + 1);
else
{

*p = '-';
memmove(s, p, strlen(p) + 1); 
} 
}

int main()
{
setlocale(0,"rus");
metka:
float C,y=0;
char stroka_I[9] = {""};
int result_I =0, i, z=0;
char x[256];
char *c=0;
char *p=x;
while (i=0, i<20, i++)
{
	if ( stroka_I[i]== ',')
	{
		z=z++;
	}
	if ( stroka_I[i]== '.')
	{
		printf_s("Ввод производится с запятой!\n");
		goto metka;
	}

}
if(z>=2)
{
	printf_s("Ошибка. Много запятых.\n");
	goto metka;
}
while(true)
{
printf("Введите значение числа x\n");
scanf("%s", x);
	
d(x);
while(*p=='0')p++;
while(*p==' ')p++;
if (strlen(x)>9)
{
printf("\nБольше 9 символов, попробуйте заново\n\n");
continue;
}
sscanf(p, "%9s", &x);
if(getchar()==' ')
{
fflush (stdin);
}
fflush (stdin);
C=strtod(x,&c);
{
printf("\nC=%.9f \n",C);
if(!isdigit(c[0]) && c[0]!=0)
{
printf("\nОшибка в следующем:%s\n", c);
printf("\nПопробуй еще раз\n\n");
continue;
}
else 
{
	y=(5*C-(C*C/2))/(C-(C*C/3));
	printf_s("y=%f\n",y);}
}
break;

}
system("pause");
	return 0;
}

и еще:знаю что strtod переделывает данные из string в double. А как мне их переделать из string во float???? (в строке C=strtod(x,&c)
спасибо большое, оставшимся неравнодушными к моей проблеме и оказавшим помощь))....



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 09.04.2013 в 21:41.
Ланулечка вне форума Ответить с цитированием
Старый 09.04.2013, 16:30   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Если у введённого числа на конце 0, программа сваливается в бесконечный цикл. Вы об этом знаете?
Abstraction вне форума Ответить с цитированием
Старый 09.04.2013, 16:37   #3
Ланулечка
 
Регистрация: 09.04.2013
Сообщений: 8
По умолчанию

не не знала. если говорить в двух словах об этом коде, то мне необходимо написать защиту "от дурака" так чтобы 1)при введении числа 00000000000000000000000007 и много много пробелов число и опять много много пробелов считывалось только число, а если много пробелов число, пробелы и опять число, то ошибка.2) если введено более 9 символов (это для float), то ошибка переполнения. 3) если введены буквы тоже ошибка 4)если 2 или более запятых введено тоже ошибка 5) если введено не с запятой число,а с точкой-ошибка

и еще чтобы x!=0 вот это все условия. я не могу сообразить как это все вместе написать

Последний раз редактировалось Stilet; 10.04.2013 в 08:17.
Ланулечка вне форума Ответить с цитированием
Старый 09.04.2013, 16:56   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Стоп-стоп-стоп, если Вы написали эту программу сами, то зачем Вам её "разбирать"?
Программный код на форуме оформляется тегом CODE; для "преобразования" строки в число можно использовать sscanf().
Abstraction вне форума Ответить с цитированием
Старый 09.04.2013, 17:04   #5
Ланулечка
 
Регистрация: 09.04.2013
Сообщений: 8
По умолчанию

проблема в том, что мой личный код под все условия проверки не подходит. старшекурсники поделились своим с прошлого года, но объяснить не могут. а мне на защите придется его объяснять-именно поэтому прошу Вашей помощи, т. к. мучаюсь с этой программой уже 2 месяца
Ланулечка вне форума Ответить с цитированием
Старый 09.04.2013, 19:03   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Ланулечка Посмотреть сообщение
мучаюсь с этой программой уже 2 месяца
А можно ознакомиться с результатами этого 2-месячного труда?
s-andriano вне форума Ответить с цитированием
Старый 10.04.2013, 03:32   #7
Ланулечка
 
Регистрация: 09.04.2013
Сообщений: 8
По умолчанию

За все время вариантов было много. Вот последний из всех:
Код:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <conio.h>
#include <iomanip>
using namespace std;
int main()
{
	setlocale(LC_ALL,"Rus");
metka:
float x=0, y=0;
char stroka_I[9] = {""};
int result_I =0, i, z=0;
printf_s ("Введите x:\n");
result_I =scanf_s(" %[^\n]", stroka_I, 9);
for(i=0; i<10; i++)
{
	if ( stroka_I[i]== ',')
	{
		z=z++;
	}
	if ( stroka_I[i]== '.')
	{1
		printf_s("Ввод производится с запятой!\n");
		goto metka;
	}

}
if(z>=2)
{
	printf_s("Ошибка. Много запятых.\n");
	goto metka;
}
if (result_I !=0)
{
	result_I = sscanf(stroka_I, "%f", &x);
	if ( stroka_I[0]== '-')
	{
		if ( stroka_I[1]== ',')
		{
		printf_s("Некорректный ввод..\n");
		goto metka;
		}
	}
	else
	{
		if ( stroka_I[0]== ',')
		{
		printf_s("Ошибка, с запятой не начинают.\n");
		goto metka;
		}
	}
	if (x==0)
	{
		printf_s ("Ошибка. Введите еще раз\n");
		goto metka;
	}
	y=(5*x-(x*x/2))/(x-(x*x/3));
	printf_s("y=%f\n",y);
}
else
{
	printf_s("Ошибка переполнения. Попробуйте еще раз.\n");
	cin.clear();
	cin.sync();
	goto metka;
}
	system("pause");
	return 0;
}
но здесь отсутствует проверка на нули и пробелы (чтобы пропускать)

Последний раз редактировалось Stilet; 10.04.2013 в 08:17.
Ланулечка вне форума Ответить с цитированием
Старый 10.04.2013, 07:49   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Я что-то не улавливаю связи между тем, что написано в первом посте (построчно разобрать программу) и приведенным кодом.
Где результат разбора?
Где комментарии?
Где условия задачи (т.е. что именно должна делать программа)?
s-andriano вне форума Ответить с цитированием
Старый 10.04.2013, 10:43   #9
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Ланулечка

старшекурсники поделились своим с прошлого года, но объяснить не могут.

Rififi вне форума Ответить с цитированием
Старый 10.04.2013, 11:59   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Я что-то не улавливаю связи между тем, что написано в первом посте (построчно разобрать программу) и приведенным кодом.
Потому что (как в типичной проблеме XY) первый пост содержал не тот вопрос, который нужно решить ТС'у. Исходная задача, как я её понимаю:
Цитата:
Считать из стандартного потока ввода вещественное число, представленное в формате \s*[+-]?\d+(,\d+)?\s* (дополнительное требование: число символов, за вычетом пробельных и ведущих нулей, не превышает 9).
Требуется выдать диагностическое сообщение, если введённое число не соответствует этому формату; в противном случае следует вычислить значение выражения 1.5*(Х-10)/(Х-3), если Х не равно 0 или 3, иначе выдать сообщение об ошибке.
Рекомендуется решение следующим образом: завести массив в 10 (!) символов, после чего считывать поштучно символы из стандартного потока ввода до символа переноса строки (или конца ввода) и переносить их в массив если и только если они являются значащими и согласуются с заданным форматом. Рекомендуется вынести этот код в отдельную функцию, которая принимает в качестве аргумента указатель на начало массива и возвращает признак успеха заполнения:
Код:
bool InputNumber(char* result){
  int cur=0;
  const int LIMIT = 9;
  bool leadingZero=true;
  char c;
  if(scanf("%c", &c) != 1 || c=='\n') return false; //scanf возвращает количество прочитанных элементов. Если оно 0 - достигнут конец потока

  while(isspace(c))  //Пробельные символы в начале
      if(scanf("%c", &c) != 1 || c=='\n') return false;
  
  if(c=='+' || c=='-'){ //Проверка +/-
    result[cur] = c; ++cur;
    if(scanf("%c", &c) != 1 || c=='\n') return false;
  }

  //Дальше должна быть по крайней мере одна цифра
  if(!isdigit(c)) return false;

  //Читаем цифры
  while(isdigit(c)){
    //пропускаем ведущие нули:
    if(c=='0' && leadingZero){
      if(scanf("%c", &c) != 1 || c=='\n') { //Если внезапно на этом закончили
        //Пишем 0, закрываем строку. 0 - тоже число
        result[cur] = '0'; ++cur;
        result[cur] = '\0';
        return true;
      } else {
        continue;
      }
    }
    //А если цифра - не ведущий ноль, то:
    leadingZero = false;
    //Не забываем о лимите цифр!
    if(cur == LIMIT) return false;
    result[cur] = c; ++cur;
    if(scanf("%c", &c) != 1 || c=='\n') { //Если на этом закончили
      result[cur] = '\0';
      return true;
    }
  }//Вышли отсюда? Значит, наткнулись на не-цифру
  //Если были одни нули, то запишем ноль
  if(leadingZero){
    result[cur] = '0'; ++cur;
  }

  //Следующая проверка - не запятая ли текущий символ
    //Если да, копируем её (проверив длину!), затем
    //снова занимаемся копированием цифр - но на сей раз уже без мороки
    //с ведущими нулями (не забываем проверять длину!)

  //Дальше, цифры кончились и, как в начале, мы ожидаем только пробельные символы
  //Если наткнулись на непробельный символ - это ошибка.
}

//Использование:
char number[10];
if(!InputNumber(number)){
  printf("Пользователь! Нехороший ты человек! Ну посмотри, что ты ввёл, а?\n");
  return 0;
}
//Всё, в number нормальное число
float x;
sscanf(number, "%f", &x);
//Дальше требуемые вычисления с x. Постарайтесь не поделить на ноль.
Если есть желание подробно указывать причины ошибки - заведите enum со значением "всё хорошо" и значениями возможных ошибок, наподобие:
Код:
enum ParseResult{
  PARSE_SUCCESS,
  TOO_MANY_CHARACTERS,
  UNEXPECTED_CHARACTER,
  DOT_INSTEAD_OF_COMMA //Подумайте, как распознать этот случай
};
И пусть InputNumber возвращает ParseResult вместо bool.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Секретный язык, нужно понять, что написано. pufystyj Свободное общение 9 05.03.2012 20:45
что происходит в этом коде Dimasik73 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 19.02.2012 23:54
что означает последняя часть в этом коде? Rondo Помощь студентам 1 30.01.2011 21:50
что означают ... в этом коде? Rondo Помощь студентам 1 28.01.2011 11:45
что такое answ в этом коде! Rondo Помощь студентам 1 17.01.2011 11:26