Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопрос по выполнению кода
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Account
НЕ знал как озоглавить тему и куда ее воткнуть, но вот что меня заинтересовало, просто писал так сказать организацию меню вот первый вариант

#include <stdio.h>
#include <iostream.h>
#include <conio.h>

using namespace std;

int main()
{ bool menu=true;
while (menu)
{
cout<<"1: \n";
cout<<"2: \n";
cout<<"3: \n";
cout<<"4: \n";
cout<<"5: \n";
switch (getchar())
{
case '1':menu=false; break;

}

}
cout<<"Bay! Bay! \n";

return 0;
}

При этом почему то выводится после ввода не '1' два раза подряд список меню так сказать
а вот если написать вот так

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
int main()
{ bool menu=true;
char ch;
while (menu)
{
cout<<"1: \n";
cout<<"2: \n";
cout<<"3: \n";
cout<<"4: \n";
cout<<"5: \n";
cin>>ch;
switch (ch)
{
case '1':menu=false; break;

}

}
cout<<"Bay! Bay! \n";

return 0;
}
то нормально один раз, в чем разница исполнения не пойму, если логически проходить, то вроде не должно быть в первом варианте двойного вывода?

НУ и конечно я поищу, но межет подскажете очистку экрана?
volvo
Цитата
в чем разница исполнения не пойму, если логически проходить, то вроде не должно быть в первом варианте двойного вывода?
Ты так думаешь? smile.gif Ну, хорошо... Смотри: вывелось тебе меню, ты чего нажимаешь, чтобы обозначить свой выбор? Цифру и enter, правда? Вот цифра (отличная от 1) тебе дает первый проход, а enter - второй проход (это тоже символ, '\n', однако). Чтоб не было второго прохода - используй getch(), которая не ждет enter-а, а реагирует сразу после нажатия на кнопку, вместо getchar().

Цитата
подскажете очистку экрана?
25 раз
cout << endl;
?
Account
Цитата(volvo @ 5.07.2009 18:33) *



25 раз
cout << endl;
?


Такой метод уводит курсор, и вследующий раз уже меню выводится с низу)
Account
Решение найдено
подсоеденяем
Код
#include <stdlib.h>


и для очистки

Код
  system("cls");

Не знаю может было уже где,но вдруг кому понадобится)
Account
volvo, подскажи пожайлуста как мне передать в функцию двухмерный массив, естественно в С++ (CodeBlock).
Делаю интерполяцию по формуле Лагранжа, данные из файла передал в массив (кстати по этому еще тоже будет вопрос). Есть массив двух мерный mas [6][3], как только не пробовал передавть блин ругается и все,вот например есть функция, передавал просто количество точек для которых надо найти значение функции и массив с данными саму функцию например описываю
Код
double pol_lag(int &kol_x, double *mmas)


Как правильно его передавать из главной функции?
volvo
Так что тебе куда передавать надо? Запутал все что можно. Ты толком скажи: что есть, где описано, и куда надо передать.
Account
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <fstream.h>

using namespace std;

int pol_lag(int&, double *mas);

int main()
{ int kol_xy,i=0;
system("cls");

cout<<"Vvedite kol-vo znacheniy x && y: ";
cin>>kol_xy;
double mas [kol_xy] [3]; // <---Вот этот массив надо передать в pol_lag(int &kol_xyx, double *mas)

return 0;
}

int pol_lag(int &kol_xyx, double *mas)
{

return 0;
}


РУгается на использование в дальнейшем вот такой записи например mas [i][j] в функциии pol_lag
volvo
Во-первых, это не будет компилироваться, пока не залезешь в настройки проекта и не разрешишь принудительно (по Стандарту С++ это запрещено, размер статического массива должен быть константным, а не переменным. Для переменных размеров есть динамические массивы). Но если наплевать на совместимость с ISO, то:

int pol_lag(int&, double *mas[3]);
Account
А как с ним тогда потом работать, например на выражение в функции он ругается
Код
p=p*mmas [i][1]
volvo
А что такое mmas? Там вообще-то mas был...
Account
Ошибся, это старое обозначение но он и на mas ругается, даже пытался полностью определять mas [6][3], все равно не хочет, ругается((
Сделал просто вот так отправил в глобальные переменные
Код
int kol_xy;
double mas [6] [3];


не люблю пользоваться глобальными но так вышло пока проще...

P.S Самое интересное решение полинома сделал, теперь вот только выделить в функцию хотел более грамотно))
volvo
Что у тебя там ругается - не понимаю:
int  pol_lag(int &kol_xyx, double *mas[3])
{
double p = 1;
for(int i = 0; i < kol_xyx; i++) {
p *= mas[i][1]; // это аналог твоего выражения
}
return 0;
}

компилируется прекрасно. Приводи код функции, что-то не то ты делаешь.
Account
Код
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <fstream.h>

using namespace std;

int pol_lag(int&, double *mas [3]);


int main()
{   int  kol_xy,i=0;
    system("cls");

    cout<<"Vvedite kol-vo znacheniy x && y: ";
    cin>>kol_xy;
double mas [kol_xy] [3];
  ifstream infile("data.txt");

    while (i<kol_xy)
    {
        infile>>mas [i][0]>>mas [i][1]>>mas [i][2];
         printf("X = %lg; Y = %lg; x = %lg\n", mas [i][0],mas [i][1],mas [i][2] );
   i++;

    }
    cout<<"------------------------------------\n";

     pol_lag(kol_xy, *mas [3]);
getchar();
    cout<<"Good Luck!\n";
    cout<<"Bay! Bay! \n";

   return 0;
}

int pol_lag(int kol_xyx, double *mas [3])
{
for( int xn=0;xn<kol_xyx;xn++)
    { double s=0;
    for(int i=0;i<kol_xyx;i++)
    { double p=1;
        for(int j=0;j<kol_xyx;j++)
        {
             (i!=j) ?  p*= ((mas[xn][2] - mas[j][0])/(mas[i][0]-mas[j][0])) : p*=mas [i][1];
            }
            s+=p;

        }
        cout<<"Resul for x"<<xn+1<<":  "<<mas[xn][2]<<"  | y:"<<s<<"\n";
    }
    return 0;
}



volvo
А так?
#include <iostream>
#include <fstream>
#include <stdlib.h>

using namespace std;

int pol_lag(int&, double mas[][3]);

int main()
{
int kol_xy,i=0;
system("cls");

cout<<"Vvedite kol-vo znacheniy x && y: ";
cin>>kol_xy;
double mas [kol_xy] [3];
ifstream infile("data.txt");

while (i<kol_xy) {
infile>>mas [i][0]>>mas [i][1]>>mas [i][2];
printf("X = %lg; Y = %lg; x = %lg\n", mas [i][0],mas [i][1],mas [i][2] );
i++;
}
cout<<"------------------------------------\n";

pol_lag(kol_xy, mas);
getchar();
cout<<"Good Luck!\n";
cout<<"Bay! Bay! \n";
return 0;
}

int pol_lag(int &kol_xyx, double mas[][3])
{
for( int xn=0;xn<kol_xyx;xn++) {
double s=0;
for(int i=0;i<kol_xyx;i++) {
double p=1;
for(int j=0;j<kol_xyx;j++) {
p *= (i != j) ? ((mas[xn][2] - mas[j][0])/(mas[i][0]-mas[j][0])) : (mas [i][1]);
}
s+=p;
}
cout<<"Resul for x"<<xn+1<<": "<<mas[xn][2]<<" | y:"<<s<<"\n";
}
return 0;
}
Заметь, я не пользуюсь iostream.h и fstream.h, это устаревшие заголовочные файлы. Если ты работаешь с namespace std, то подключай те файлы, в которых этот неймспейс есть, а это как раз файлы без расширения.

Ну, и оператор ? : тоже я по-другому использовал, так лучше будет.
Account
volvo, ну как всегда СПАСИБО, держи +.
А вот такой метод по стандарту ISO ?

НУ и еще хотел спросить по поводувот считывания файла, хотел в файле еще сверху дописать обозначения над столбиками X Y x, соответсвенно, но вот таким метотодом считывания из файла не как не получилось пропустить строку, так как он после ее считывания просто напросто запинается так сказать, выводит ее и все я сначала пытался сделать считываени

Код
char s[255];
infile.getline(s,255);

но не вышло)))

и еще почемуто опять getchar() не работает, что то попадает под поток не пойму?
volvo
Цитата
выводит ее и все я сначала пытался сделать считываени
char s[255];
infile.getline(s,255);

но не вышло)))
blink.gif
Нажмите для просмотра прикрепленного файла
Что я делаю не так? getchar работает, кстати... Что у тебя творится - непонятно.

Цитата
А вот такой метод по стандарту ISO ?
По стандарту ISO получил размер массива - выделяй памяти под него динамически. Задание НЕконстантой размера массива - это расширение GCC, причем очень нехорошее, потом программу трудно заставить работать под другим компилятором, я этим не пользуюсь, поэтому обычно у меня стоит ключ -ansi, с которым твоя программа не компилируется.
Account
Блин вот счас работает, а тогда нет, да если честно у меня тут и винда уже настолько извиняюсь за выражения "сасрана", переустанавливать систему надо и чистить, бардак полный))))
Все нормально считывается и выводится)
Но вот getchar() не пашет, потом exe-ник запускаю, просто выполняется и пролетает, не ждет нажатия(
volvo
Цитата
exe-ник запускаю, просто выполняется и пролетает, не ждет нажатия(
А, да... Это есть. Потому что после ввода количества данных в буфере остается '\n', я уже говорил об этом. И его надо оттуда убрать. Вот так, например:
    cout<<"Vvedite kol-vo znacheniy x && y: ";
(cin>>kol_xy).get(); // прочитать число и сразу прочесть '\n'
Account
volvo,честно меня поражают твои знания)))
Теперь возьмусь за полином Ньютона)

P.S. А если не секрет кем работаешь?
volvo
Цитата
А если не секрет кем работаешь?
А ты как думаешь? smile.gif
Account
ДА это понятно уж кем, больше интересует направленность и в какой стране)
Account
volvo, вот хотел сделать так что бы перед тем вначале вводился номер способо нахождения 1 или 2 и уже отсюда плясать по считыванию данный толи из например data.txt или data1.txt
пытылся делать вот так

int m; //<---какраз номер метода
(cin>>m).get();

if (m==1) then ifstream infile("data.txt"); else ifstream infile("data1.txt");


Но тогда он в дальнейшем начинает ругаться на строчки считывания, ту же
 infile.getline(s,255);

Я так понимаю потому что компилятор не может определить из какого файла читать, пытался даже делачть переменную типа string, хранившую от выбора имя того или иного файла но тогда начинается проблема с записью ifstream infile(s) , описания данной функции с ее параметрами не нашел, поэтому просто решил вот поэксперементировать, что посоветуешь?

И еще как пользоваться справкой, хемпом в CodeBlock ?
volvo
Цитата
просто решил вот поэксперементировать, что посоветуешь?
Это не функция, а класс + конструктор. Вот тут описание его методов: http://www.cplusplus.com/reference/iostream/ifstream/

Совершенно не обязательно сразу и описывать infile и открывать его. Можно разделить эти 2 операции:
    int m;
(cin>>m).get();

ifstream infile;
if(m == 1) {
infile.open("data.txt");
}
else {
infile.open("data1.txt");
}

smile.gif Экспериментируй дальше...
Account
А заместо хелпа и справки в CodeBlock, ссылка приведенная выше;)smile.gif
Спасибо!

Для себя то можно поэксперементировавть, а серьезно уже заниматься поздно)))
Account
Блин не догоняю вчем дело, есть вот такая матрица чисел, содержатся они в файле slu.txt
нужно каждый элемет строки разделить на элемент данной строки, который находится на главной диагонали
(у меня данный диагональный элемент еще и умножается на -1), далее диагональные элементы обнуляются.
Вроде должно работать но почемуто делет деление толькоэлементов до главной диагонали

#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
#include <fstream>

using namespace std;

int main()
{ double mas [3][6];char s[255];
system("cls");

ifstream infile("slu.txt");
infile.getline(s,255);
for (int i=0;i<3;i++)
{
infile>>mas [i][0]>>mas [i][1]>>mas [i][2]>>mas [i][3];
cout<<mas [i][0]<<" "<<mas [i][1]<<" "<<mas [i][2]<<" "<<mas [i][3]<<"\n";
mas[i][4]=mas [i][3];
}

cout<<"------------------------------------\n";
for(int i=0;i<3;i++) { for(int j=0;j<4;j++) mas[i][j]/= (-1*mas[i][i]);

mas[i][i]=0;
cout<<mas [i][0]<<" "<<mas [i][1]<<" "<<mas [i][2]<<" "<<mas [i][3]<<"\n";

};




getchar();
cout<<"Good Luck!\n";
cout<<"Bay! Bay! \n";

return 0;
}


Прилага скрин, матрица до и после.




Добавлено через 6 мин.
Все ДОГНАЛ))))
volvo
Цитата
но почемуто делет деление толькоэлементов до главной диагонали
Оно делит и после, но согласись, делить на 1 - смысла особого нет... Ты ж не проверяешь, и если i = j тоже делишь на mas[ i ][ i ]... А этого делать не надо.
Account
volvo, а объекты класса vector это что то типа массивов я так понимаю, и вот посмотрел http://www.cplusplus.com/ , я так понимаю они не совсем относятся к С++, а больше к С#?
-Volvo-
Цитата
я так понимаю они не совсем относятся к С++, а больше к С#?
С чего бы это? Открой Стандарт С++ и посмотри, куда относятся vector-ы и все остальные контейнеры... Это вообще-то STL (Standard Template Library), C++ ная библиотека.
Account
Понятно, спасибо, постараюсь больше глупых вопросов не задавать)))
sheka
Почему
int m;
(cin>>m).get();
не воспринимает нажатия на Enter, в то же время при нажатии на любую букву - работает?
если int меняю на char - то же самое.

как можна сделать ожидание нажатия на Enter без ввода других символов?
volvo
Что значит "не воспринимает"? Что по-твоему должно происходить?
sheka
char m;
(cin>>m).get();
enter - это, ведь, char? а его за char не принимает.
хочу сделать подобное ReadLn;
volvo
Блин... Когда ж вы задавать вопросы научитесь? Какое подобное? Чему подобное? ReadLn РАЗНЫЙ БЫВАЕТ!!! Какой именно тебя интересует? Тот, который ждет ТОЛЬКО нажатия на Enter? Или тот, который читает значение и потом ждет нажатия на Enter? Как ты хочешь чтобы себя вела программа? Что ты вводишь (с точностью до клавиши), и что НЕПРАВИЛЬНОГО происходит по-твоему?

Это я что, догадаться обо всем вышеперечисленном должен? Извини я не телепат. Нужна помощь - как минимум поставь вопрос корректно.
sheka
если я правильно понял, тот, который читает значение и потом ждет нажатия на Enter - это вышеприведенный пример.
мне нужен тот, который ждет ТОЛЬКО нажатия на Enter.
 begin
writeln(' vot takoi ');
readln;
end.


так как Enter в ASCII имеет номер #13, почему (cin>>с)/*вот здесь не происходит присваивания с:=#13*/.get();
Account

volvo, а по работе в IDE QT разбираешься?
volvo
QT-шный интерфейс делали как-то, но не на С++ совсем. А почему здесь? Если есть вопросы по QT - надо в отдельную тему.
Account
Окей, ветку создам позже, а вот вопрос есть по поводу CodeBlock, создаю файл, пишу допустим прогу, ахочу выполнть пошагово, а отладчик отключен(
volvo
1) project -> build options убедись, что генерируется отладочная информация (produce debugging symbols отмечено)
2) settings -> compiler and debugger -> debugger settings -> убедись, что дебаггер НЕ отключен.
3) поставь breakpoint в начало программы и нажми F8 ...
Account
Понял когда создаешь просто файл ресурсов он почемуто не включается, а когда проект, то активет, только не пойму, ставлю breakpoint перед объявление главной функции
Код
int main()
, пролетает ее, и пошагово почемуто не активно(

Ну и для sheka

#include <iostream>
#include <conio.h>

int main()
{
getch();
return 0;
}


а если создашь переменную типа char и присвоешь ей значение возвращаемое функцией getch(), то получишь свой код Enter (0Dh) )
volvo
Цитата
ставлю breakpoint перед объявление главной функции
И чего ты хочешь от дебаггера? Выполнение программы начинается с main(), в любом случае должен получить что-то вроде:
Нажмите для просмотра прикрепленного файла
(т.е., дебаггер начнет работу с самого начала main). Содержимое вкладки Debugger - в студию.

Если не получается - попробуй создать чистый проект, в нем - самую простую тестовую. программу, и запусти ее... Если и в новом проекте не выходит - то попробуй обновить на последнюю "ночную сборку" у меня nightly build от 21 июня 2009.
Account
ВОт создал новый проект, breakpoint пролетает, пошагово выполнить нельзя почему то
volvo
Путь к файлу содержит кириллицу? Меняй срочно, создавай проект не там, где тебе предлагается по умолчанию, а где-нибудь по другому пути. Обрати внимание на мой скриншот, и на свой: у тебя breakpoint создается, но в Pending-е, не находит его GDB, вот и выполняется вся программа без брекпойнта.
Account
ОК, все пошло, видимо не любит в путях названия на русском, а может и впридачу пробелы)))
Account
Итак, вот такая загвоздка, не пойму почему считает не правильно есть вот такая функция, возвращаемое ей значени я сделал для эксперимента, у меня почемуто возвращается только частное, из-за чего, при вставке вычисления именно функции считается неправильно, в чем может быть проблема? БУду сегодня еще пробовать на другой системе конечно, но очень уж интерессно что это за баг такой.
среда IDE codeblocks


double func(double &x)
{
return (9/2);
}
volvo
Это не Паскаль, где деление возвращает ВСЕГДА вещественный результат. В Сях результат определяется исходя из операндов. Целое делить на целое будет целое. Чтоб получить 4.5 надо:
double func(double &x)
{
return (9./2); // Девятка - уже вещественная
}

или
double func(double &x)
{
return ((double)9/2);
}

или static_cast-ом. Ну, или двойку любым из этих способов преобразовать в вещественное число.
Account
volvo, как обычно респект)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.