LINUX.ORG.RU

Помогите с простенькой программой на C++


0

1

Здавствуйте, изучаю потихоньку C++ по книге Бьерна Страуструпа. В конце каждой главы есть небольшие задания, в частности есть задачка на угадывание целого числа от 1 до 100 за максимум 7 попыток. Набрасал следующий код:

#include <iostream>
#include <string>
#include <cmath>
#include <vector>

double round(double number)
{
        return int(number + .5);
}
int main()
{
        std::vector<double> a(9);
        std::vector<std::string> s(8);
        a[0] = 105; s[0] = "???";
        a[1] = 50;
        std::string c = "???";
        std::cout << "Задумайте любое целое число от '1' до '100' \n" << "Программа будет задавать вопросы, если соглашаетесь введите 'y', иначе 'n'. \n";
        for (int i=0; i < 7; ++i)
            {
/*                      for (int k = 0; k < i+1; ++k)
                          {
                                          if (a[k] == a[i+1])
                                                    {
                                                                 s[i+1]=s[k];
                                                                 c = s[i+1];
                                                                 goto metka2;
                                                    }

                           }
*/
                      std::cout << i+1<<") Задуманное число меньше " << a[i+1] <<"? Ваш ответ: " ;
                      metka1:
                      std::cin >> c;
                      s[i+1] = c;
//                    metka2:
                      double r = a[i] - a[i+1];
                      double m = pow(r,2);
                      double m1 = pow(m,0.5);

                      if (c == "y")  a[i+2] = a[i+1] - m1/2; //*
                      else if (c  == "n") a[i+2] = a[i+1] + m1/2; //*
//                    if (c == "y")  a[i+2] = round(a[i+1] - m1/2);
//                    else if (c  == "n") a[i+2] = round(a[i+1] + m1/2);

                      else goto metka1;
           }

        std::cout << "\nВы задумали число " << round(a[8]) <<"\n"; //*
//      std::cout << "\nВы задумали число " << a[8] <<"\n";
        return 0;
}

Программа работает, но не так как мне хотелось бы, а хочется, чтобы вместо рациональных чисел она выводила целые в вопросах, но фокус с округлением не удался :( (случай если закоментировать строки, которые я обозначил «*», и раскоментировать те, что закоментены в приведённом примере). Что мне нужно изменить, чтобы добиться желаемого результата? Спасибо.

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

Каким образом лисп поможет от незнания основ программирования?

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

Внезапно, редактор также может вставить tab (есть такой символ), который в разных редакторах по разному будет отображаться

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

Только 2.5 недели как в программировании

Так тебе на С++ изучать нужно, а программирование. Бери SICP и не насилуй себе мозг.

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

Символ-костыль для отображения табличных данных в телетайп.

Ваще-то, символ-«костыль» для эмуляции поведения печатных машинок.

Всегда ваш.

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

Телетайп — печатная машинка для компьютера.

Жаль тебя огорчать, но телетайп, вообще-то, печатная машинка, с разнесенной на расстояние клавиатурой и собственно печатающей частью. Как, собственно, явствует из самого названия.

А «печатная машинка для компьютера» называется принтер. ;)

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

Ты хоть на википепдю сходи для приличия, прежде, чем повторять бессмыслицу про " Печатная машинка для компьютера." Я-то, конечно, понимаю, что ты имеешь в виду использование телетайпа как терминального устройства, но сходить на википедию тебе надо, не то так и будешь думать, как дурачок, что устройство на картинке предназначено исключительно для работы с компьютером.

И да, жаль, опять же тебя огорчать, но:

1. vi был разработан для работы на терминалах с ЭЛТ дисплеем. Собственно, он потому и называется vi - _vi_sual. 2. Vim != vi

Кончай выдумывать того, чего не знаешь.

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

Немного экзотики:

$ cat ./guess.fs
\ -- 
1      value Nmin 
100 1+ value Nmax 
0      value N 
0      value step 
\ -- 
: .step    step 1+ to step ." шаг #" step . ; 
: middle   + 2 / ;
: .yes?    ." [y/n]?" key [char] y = ; 
: .N.      N  2 .r space ; 
: .guess?    ." Это число = " .N. .yes? ; 
: .smaller?  ."   задуманное число меньше " .N. .yes? cr ; 
: close?   Nmax Nmin - abs 2 <= ; 
: enough?  close? if true else .guess? endif ; 
: recur?   enough? invert ; 
\ -- 
: main 
  cr ." Загадайте число от " Nmin . ." до " Nmax 1- . cr 
  begin 
    .step 
    Nmax Nmin middle to N 
    recur? 
  while 
    .smaller? if 
                 N to Nmax 
              else 
                 N to Nmin 
              endif 
  repeat 
  cr ." Вы загадали число: " .N. cr ; 
\ -- 
main 
bye 
\ -- 

$ gforth ./guess.fs
:-)

Neksys ★★★
()

дело было вечером, делать было нечего..такой вот получился смешной вариант C :

#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <stdio.h>
int main() {
	unsigned long long min;
	unsigned long long max;
	int tick;
	char answer[64];
	while(1) {
		printf("Задумайте целое число в диапазоне от 0 до %llu\n",ULLONG_MAX);
		printf("(запишите на бумажке - я подожду секунд 5)\n");
		sleep(5);
		min=0;
		max=ULLONG_MAX;
		tick=0;
		while(min!=max) {
			unsigned long long avg;
			int yes;
			avg=min+((max-min)>>1);
			printf("[%llu..%llu]\n",min,max);
			printf("Это число %s чем %llu ?[y/n]\n",(tick^=-1)?"больше":"меньше",avg);
			if (scanf("%64s",answer)!=1 ||
				!(yes=(!(strcasecmp(answer,"yes")&&strcasecmp(answer,"y"))<<1) |
				!(strcasecmp(answer,"no")&&strcasecmp(answer,"n")) )) {
				printf("\tмне непонятен ваш ответ..повторите\n");
				printf("\tили нажмите Ctrl-C если надоело\n");
				continue;
			}
			if ((yes^tick)&2) max=avg-(tick==0); 
			else min=avg+(tick!=0);
		}
		printf("!! Вы задумали %llu\n",min);
	}
	return 0;
}

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

Вот сколько описаний и воплощений этого бессмертного алгоритма встречал, ни разу кроме целых чисел ничего не использовалось.

Угум, уже разобрался.

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

Таки в gcc 4.4 была трабла с std::abs для инта:

#include <iostream>
#include <cmath>

int main()
{
	std::cout << std::abs(-1) << std::endl;
}
$ g++-4.4 abs_test.cpp -o abs_test44
abs_test.cpp: In function ‘int main()’:
abs_test.cpp:6: error: call of overloaded ‘abs(int)’ is ambiguous
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.4.6/../../../../include/c++/4.4.6/cmath:94: note: candidates are: double std::abs(double)
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.4.6/../../../../include/c++/4.4.6/cmath:98: note:                 float std::abs(float)
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.4.6/../../../../include/c++/4.4.6/cmath:102: note:                 long double std::abs(long double)

Столкнулся с этим недавно, когда писал тестовое задание в одну контору. У них не собралось. Хотя у меня gcc 3.4 и gcc 4.6 собирали без единого ворнинга.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от son_of_a_gun

Молодец! Тока endl в

cout << i << "оно СТРОГО МЕНЬШЕ чем "<< (max+min)/2 <<" [y/любая другая фигня]?" << endl;
лишний.

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

лишний.

Может «багосовместимость» не преследовалась: таки у вас не было не отделено хотя бы пробелом, а тут целая строка).

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