Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: ALeXstrange
Дата сообщения: 02.04.2010 17:47
Здравствуйте, я новичок в программировании. Написал следующую программу, которая просто умножает число t само на себя k раз. Среда: MSVS 2008 SP2. OC: MS Vista. Никак не вызывается исключение "деление на 0" (если, к примеру t=0, k=(-2)). Точнее вызывается, но не перехватывается, даже если catch(...), а уж если catch(DivideByZeroException), то пишет: "error C2061: синтаксическая ошибка: идентификатор "DivideByZeroException"". Помогите, опытные, пожалуйста. Где лежит этот класс DivideByZeroException, если не в System? Или дело еще в чем? Код:

Код:
---------------------------------header.h------------------------------------
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <string>
#include <exception>

using namespace std;

float power(int t, int k);

---------------------------------sam.cpp------------------------------------
#include "header.h"

void main()
{
    int k;
    int t=k=0;
    cout<<"Vvedite t: ";
    cin>>t;
    cout<<"Vvedite k: ";
    cin>>k;
    cout<<"t^k = "<<power(t,k);
    Sleep(100000);
}

float power(int t, int k)
{
    int tempk=abs(k);
    int tempt=t;
    while((tempk--)>1)
    {
        t=t*tempt;
    }
    
    if(k>1)    return t;
    else
    {
    try
    {
        t=1/t;
    }
    catch(DivideByZeroException)
    {
        cerr<<"Delenie na 0";
        Sleep(100000);
    }
        return (t);
    }
}
Автор: Denchik
Дата сообщения: 02.04.2010 21:15
ALeXstrange

Цитата:
DivideByZeroException
это исключение С#

Цитата:
умножает число t само на себя k раз
есть готовая функция pow
Автор: vjunk
Дата сообщения: 02.04.2010 21:21
ALeXstrange
Операция деления это не функция библиотеки C++, а инструкция процессора, поэтому, при делении на 0 вызывается не исключение C++, а исключение операционной системы.
Если хочешь обрабатывать эту ситуацию именно как исключение, изучай Structured Exception Handling (SEH).
Автор: ALeXstrange
Дата сообщения: 02.04.2010 21:32
Denchik
Спасибо за ответ, но. Сейчас я даже переделал функцию power():

Код: float power(int t, int k)
{
    int tempk=abs(k);
    int tempt=t;
    while((tempk--)>1)
    {
        t=t*tempt;
    }
    
    if(k>1)    return t;
    else
    {
        try
        {
            if (t==0)throw 1;
            t=1/t;
        }
        catch(int i)
        {
            if (i == 1)
            {
                cerr<<"Delenie na 0";
                Sleep(100000);
                return 0;
            }
        }
        return (t);
    }
}
Автор: Abs62
Дата сообщения: 02.04.2010 22:12
ALeXstrange

Цитата:
Я не могу понять, в какой части этой библиотеки лежит класс DivideByZeroException (здесь написано, что в С++ он именно так называется).

Ни в какой. В стандартную библиотеку этот класс не входит, это часть .Net framefork. И используется в C#, а не в C++.
Автор: ALeXstrange
Дата сообщения: 02.04.2010 22:30
Abs62
Спасибо Вам большое за ответ! Он, действительно, многое разъясняет.
По приведенной мной выше ссылке:
1) Для С#:

Код:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class DivideByZeroException : ArithmeticException
Автор: Denchik
Дата сообщения: 02.04.2010 22:38
я неверно написал, DivideByZeroException - это исключение, конечно же, не C#, а .NET Framework. Если под "диалектом Microsoft" имелось в виду "C++/CLI", тогда вам нужно создавать проект CLR, если же вы пишите на ISO/ANSI C++, то классы .NET Framework будут недоступны.
Автор: ALeXstrange
Дата сообщения: 02.04.2010 22:44
vjunk
Спасибо большое. Вы указали мне направление. Если почувствую, что потяну, то возьмусь за этот вопрос. Без SEH, .NET (спасибо Abs62) или ассемблерных вставок я никак не смогу добиться выявления этой ошибки во время ее возникновения? То есть когда мне компилятор выдает terminate c расшифровкой "деление на ноль", тогда это означает, что он взял эту информацию либо через API операционной системы, либо через .NET напрямую с процессора (если при разработке компилятора MSVS используется в том числе .NET (возможно, c ассемблерными вставками)), либо напрямую через ассемблер?

Denchik
Спасибо большое. Жаль, что стандартная библиотека С++ не предоставляет такой возможности как выявление возникновения данной исключительной ситуации в процессе ее появления. Значит, нужно "формировать" исключения заранее самостоятельно с помощью throw. Надеюсь, что это не касается работы с файловыми потоками и соответствующими им исключениями, ведь с файлами как правило не все однозначно (в том смысле, что велика вероятность возникновения исключительной ситуации).
Автор: Denchik
Дата сообщения: 02.04.2010 22:52

Цитата:
ез SEH, .NET (спасибо Abs62) или ассемблерных вставок я никак не смогу добиться выявления этой ошибки во время ее возникновения?

вы уже ее выявляете:

Код: if (t==0)
Автор: ALeXstrange
Дата сообщения: 02.04.2010 23:18
Denchik
Да, выявляю, но заранее, пытаясь предсказать возможный ход событий. Т.е. заранее лишаю процессор возможности выдать мне исключение. Мне кажется, что инструкции, относящиеся к обработке исключительной ситуации, на языке высокого уровня, как правило более затратны (в плане памяти и/или времени выполнения), чем соответствующие им инструкции на языке низкоуровневом (), с помощью которого, как я вначале думал, мне и должна была предоставить библиотека доступ к процессору или к операционной системе, "отрезав" меня от конкретной реализации. Это означает, что для ускорения придется самостоятельно программировать на ассемблере. Сейчас это вряд ли получится у меня так же хорошо, как у программистов, написавших библиотеку .NET. Картина становится более четкой. Спасибо большое за ответ.
Автор: Denchik
Дата сообщения: 02.04.2010 23:34
Я бы вам посоветовал прочитать Страуструпа "Язык программирования C++". Там описана и работа с потоками, и обработка исключений, но лучше начать с самого начала для систематизации своих знаний по С++.
Автор: ALeXstrange
Дата сообщения: 03.04.2010 00:21
Denchik
Спасибо за ответ. Уже читаю. Как раз по ней сегодня пытался разобраться с catch, throw и try, но там описан только стандарт.
Автор: Qraizer
Дата сообщения: 03.04.2010 14:35
ALeXstrange, вот на SEH, если поможет:
Код: float power(int t, int k)
{
int tempk = std::abs(k);
int tempt = t;

while(tempk-- > 1)
{
t = t * tempt;
}

if(k > 1) return t;
else
{
__try
{
t = 1 / t;
}
__except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
std::cerr << "Delenie na 0";
}
return t;
}
}
Автор: ALeXstrange
Дата сообщения: 04.04.2010 17:19
Qraizer
СПАСИБО ПРЕОГРОМНЕЙШЕЕ за то, что Вы уделили столько внимания моей проблеме. Все в Вашем сообщение для меня очень ценно. Вдумчиво читаю и запоминаю. Также и за код спасибо! Я постараюсь его в ближайшее время опробовать.
Автор: FeelThePain
Дата сообщения: 06.04.2010 14:06
Задание: Определить номер строки массива, в каторой все элементы разные(и вывести эти номера на экран)

помагите исправить код:

void raditaji(int *mas)
{
int i,j,k;
clrscr();
randomize();

printf("\n\Divdimensiju masivs\n");

for(i=0;i<N;i++)
{
    for (j=0;j<M;j++)
{
    printf("%4d",*(mas+i*N+j)=random(100));
}
    printf("\n");
}

printf("\n\nRezultats\n");
    for(i=0;i<N;i++)
{

    for(j=0;j<M;j++)
{
    for(k=j+1;k<M;k++)
{
    if(*(mas+i*M+j)==*(mas+i*k+j))

    break;
}
if(k<M)
    break;
}

    if(j==M)
{
printf ("Stroka %d bez povtoreniy\n", i+1);
for (j=0;j<M;j++)
printf("%d",*(mas+i*M+j));
printf ("\n");
}

}
getch();
}
Автор: deman_ru
Дата сообщения: 07.04.2010 19:14
Помогите пожалуйста! Есть массив заполненый числами: MASS [2,0,5,0,7,0], нужно пройтись по всем элементам, есть очередной элемент массива равен «0», нужно вызвать заранее созданную форму с Edit’ом и кнопкой, ввести цифру в Edit, нажать кнопку, после чего нужно проверить что введенное значение не является «0», если не является записать введенное значения на место того с которым мы сейчас работаем, иначе вызвать окно еще рас. Ну и так пока не прошли по всем элементам. Сделать это надо все, в функции.
Основная конструкция должна быть примерно такая:

Код:
int funk (void)
{
for (int j=0; j<=6; j++)
{
if (MASS[j]==0)
{тут надо написать то что мне нужно}
}
return 0;
}
Автор: mrherbrooks
Дата сообщения: 08.04.2010 09:23
deman_ru в чем пишешь?
в Дебилдере, например, есть InputBox.

Добавлено:
FeelThePain
С++ || C?
Автор: deman_ru
Дата сообщения: 08.04.2010 10:02
mrherbrooks
да в C++Builder, не совсем понятно как вот именно, если if выполняется, приостановить цикл, вызвать форму, там ввести в едит значение, нажать на кнопку, чтобы уже дальше в цикле оно проверело не нулевое ли значение, и если нет, записало бы на место...и поехало дальше! вот!
Автор: Pacho
Дата сообщения: 23.04.2010 22:13
Установил MS Visual C++ 2008 Express. А в ней нету библиотеки MFC. Выложите, пожалуйста, на обменник.
Автор: regkz
Дата сообщения: 29.04.2010 07:39
deman_ru
ShowModal ещё никто не отменял
Автор: YuriyRR
Дата сообщения: 05.05.2010 14:28
Как в vs2010 установить порядок компиляции зависимых проектов?
Автор: Draconic_boots
Дата сообщения: 11.05.2010 11:57
Народ помогите плиз разобраться с программами:
1) Пусть дан текстовый файл. Для каждой строки распечатать слово наименьшей длины. Если их несколько то распечатать все. (Какую функцию нада юзать чтоб определить вообще где конец каждого слова? =/)
2) Описать структуру, содержащую слейдующие поля:
- фамилия, имя;
- знак Зодиака;
- дата рождения;
Дык вот записи должны быть упорядочены по знакам зодиака, а так как знак зодиака - переменная типа char то я хз как их можно упорядочить. Подскажите как можно лучше это сделать.
3)Даны квадратные матрицы. Найти С=ехр(-А^2) через ряд Тейлора.
Напишите пожалуйста как это сделать, а то я вообще ничё непонимаю
Автор: KChernov
Дата сообщения: 11.05.2010 12:46
Draconic_boots
Если вам непонятна суть заданий - в первую очередь стоит уточнить непонятное у преподавателя. Только он знает точно, что же он от вас хочет.
Автор: vlary
Дата сообщения: 12.05.2010 01:03

Цитата:
Напишите пожалуйста как это сделать, а то я вообще ничё непонимаю
Может, пока не поздно, профессию сменить?

Цитата:
Какую функцию нада юзать чтоб определить вообще где конец каждого слова?

Такой функции в стандартном С++ нет. Придется делать свою функцию для разбития строки на слова. Вот здесь.десяток способов на выбор.
Автор: ZorgeHT
Дата сообщения: 21.05.2010 18:27
Дано:
1. Пример из "двух Дейтелов" по указателям на массивы - тасование колоды карт.
2. Компилятор MS VS C++ 2008
На выходе:
error C2664: 'deal' : cannot convert parameter 2 from 'char *[13]' to 'const char *[]'

Вопрос: что с этим делать и куда копать?

Очень сильно подозреваю, что налицо несовместимость стандартов компиляторов - та книга, что у меня написана по ANSI C++ 1990-года.
А MS C++ 2008 несколько новее...


Код:
#include "stdafx.h"
#include <windows.h>
#include <iostream>    
#include <iomanip>
#include <conio.h>
#include <time.h>

using namespace std;

void shuffle(int [][13]);
void deal(const int [][13], const char *[], const char *[]);

int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleOutputCP(1251); // это для русификации консоли
    char *suit[4] = {"Червей","Бубен","Треф","Пик"};
    char *face[13] = {"Туз","Двойка","Тройка","Четверка","Пятерка","Шестерка","Семерка",
                    "Восьмерка","Девятка","Десятка","Валет","Дама","Король"};
    int deck[4][13] = {0};

    srand(time(NULL));
    shuffle(deck);
    deal(deck, face, suit); // вот на эту строку указывает ошибка

    cout << endl << "OK" << endl;
    _getche();
    return 0;
}

void shuffle(int wDeck[][13])
{
    int row, col;
    for (int card = 1; card <= 52; card++) {
        do {
            row = rand() % 4;
            col = rand() % 13;
        } while ( wDeck[row][col] != 0);
        wDeck[row][col] = card;
    }
}

void deal(const int wDeck[][13], const char *wFace[], const char *wSuit[])
{
    for (int card = 1; card <= 52; card++)
        for (int row = 0; row < 4; row++)
            for (int col = 0; row < 13; col++)
                if (wDeck[row][col] == card)
                    cout << setw(9) << setiosflags(ios::right)
                    << wFace[col] << ' ' << setw(5) << setiosflags(ios::left)
                    << wSuit[row] << (card % 2 == 0 ? '\n' : '\t');
}
Автор: karakurt2
Дата сообщения: 22.05.2010 07:13
ZorgeHT

Код:
...
const[no] char *suit[4] = {"Червей","Бубен","Треф","Пик"}; [/no]
const[no] char *face[13] = {"Туз","Двойка","Тройка","Четверка","Пятерка","Шестерка","Семерка",
"Восьмерка","Девятка","Десятка","Валет","Дама","Король"}; [/no]
...
Автор: ZorgeHT
Дата сообщения: 22.05.2010 11:01
karakurt2, вызывает ошибку времени исполнения "Access Violation an 0x0000000"...

Чуть погодя.
Ааа. Все понял. Я лопух:

Код:
void deal(const int wDeck[][13], const char *wFace[], const char *wSuit[])
{
    for (int card = 1; card <= 52; card++)
        for (int row = 0; row < 4; row++)
            for (int col = 0; col < 13; col++)
                if (wDeck[row][col] == card)
                    cout << setw(9) << setiosflags(ios::right)
                    << wFace[col] << ' ' << setw(5) << setiosflags(ios::left)
                    << wSuit[row] << (card % 2 == 0 ? '\n' : '\t');
}
Автор: pj7cecv
Дата сообщения: 22.05.2010 12:53
Помогите начинающему программисту.
Создала я диалоговое приложение в Visuale с++ 2006 значит нужно обработать код кнопки выход
Вот спрашиваю вы действительно хотите выйти, если пользователь нажимает да-то выйти если нет то остаться в этом же окне, вот мой код:

void CIPMDDlg::OnButton2()
{
    CString str;
    AfxMessageBox(str);
            if(MessageBox("Вы действительно хотите выйти?","Информационная подсистема мониторинга деятельности\" ООО Синапс-Софт\"",4)==6)
            {    
                CDialog::OnCancel();
        }
        else
        {
            // что тут написать, чтобы остаться в диалоговом окне...???
        }
}
Автор: karakurt2
Дата сообщения: 22.05.2010 13:56
pj7cecv
ничего не надо делать, вообще уберите ключевое слово else и следующий за ним декларативный блок.
Автор: pj7cecv
Дата сообщения: 22.05.2010 14:08
Спасибо я уже разобралдась там моджно оставить можно нет))) А вот какую функцию нужно использовать из стандартной библиотеки MFC что=бы перейти к следующему диалоговому окну а это закрыть?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.