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

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

Автор: Gamburg
Дата сообщения: 25.08.2008 16:47
Воспользовавшись указателями, поменяйте местами элементы массива с четными и нечетными индексами (т.е. те элементы массива, которые стоят на четных местах, поменяйте с элементами, которые стоят на нечетных местах).
Автор: Lyrik
Дата сообщения: 25.08.2008 17:32
Gamburg
ну тогда видимо нужно менять местами 0 и 1 индексы, 2 и 3 и т.д. вот примерный код:

Код: const size_t n = 5;
int a[n] = { 1 , 2, 3, 4, 5 };
int *p1, *p2;
int tmp;
size_t i = 0;
while ( i < n ) {
p1 = a + i++;
if ( i < n ) {
p2 = a + i++;
} else {
break;
}
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
Автор: Gamburg
Дата сообщения: 25.08.2008 17:51
спасибо
Автор: 4aini4eG
Дата сообщения: 26.08.2008 14:50
Здравствуйте, Уважаемые Эксперты!
У меня возник вопрос в следеющем задании: Дан граф. Определить является ли он связным
Ошибок в списке и очереди вроде как не обнаружил
почему то всегда распечатывает "It is not connected graph", может мне в BFS что нибудь поменять, подскажите пожалуйста

#pragma once
#include <iostream>
using namespace std;

struct Link
{
    int data;
    Link *pNext;
};

struct List
{
    Link *pHead;
};

void InitList(List *pList)
{
    pList->pHead = 0;
}

bool IsEmpty(List *pList)
{
    return (pList->pHead == 0);
}

Link *GoBack(List *pList)
{
    if (IsEmpty(pList))
        return 0;
    Link *pLink = pList->pHead;
    while (pLink->pNext != 0)
        pLink = pLink->pNext;
    return pLink;
}

void PushBack(List* pList, int data)
{
    Link* pLink = new Link();
    pLink->data = data;
    pLink->pNext = 0;

    if (!IsEmpty(pList))
    {
        Link* pLastLink = GoBack(pList);
        pLastLink->pNext = pLink;
    }
    else
        pList->pHead = pLink;
}

int GetFrontData(List *pList)
{
    Link *pLink = pList->pHead;
    return pLink->data;
}

void DeleteFront(List* pList)
{
    if (IsEmpty(pList))
        return;

    Link* pAfterHead = pList->pHead->pNext;
    delete pList->pHead;
    pList->pHead = pAfterHead;
}

    
void PrintList(List *pList)
{
    Link *pCurLink = pList->pHead;

    while(pCurLink != 0)
    {
        cout << pCurLink->data << "->";
        pCurLink = pCurLink->pNext;
    }
}

int ElementsCount(List* pList)
{
    Link* pLink = pList->pHead;

    int count = 0;
    while (pLink != 0)
    {
        count++;
        pLink = pLink->pNext;
    }

    return count;
}

void ClearList(List *pList)
{
    Link *pLink = pList->pHead;
    while(pLink != 0)
    {
        Link *pNextLink = pLink->pNext;
        delete pLink;
        pLink = pNextLink;
    }
    pList->pHead = 0;
}


#pragma once
#include "List.h"

class Queue
{
private:

    List *pList;
        
public:

    Queue()
    {
        pList=new List();
        InitList(pList);
    }

    bool QIsEmpty()
    {
        return (IsEmpty(pList));
    }

    int CountQueueElements()
    {
        return ElementsCount(pList);
    }

    void Enqueue(int data)
    {
        PushBack(pList, data);
    }

    int Dequeue()
    {
        int temp = GetFrontData(pList);
        DeleteFront(pList);
        return temp;
    }

    void PrintQueue()
    {
        PrintList(pList);
    }

    ~Queue()
    {
        ClearList(pList);
    }
};


#pragma once
#include "Queue.h"

class Graph
{

private:

    int V;
    int **E;
    Queue qres; // основной список
    Queue qex; // дополнительный для проверки связности графа

public:

    Graph(int Vcount)
    {
        V = Vcount;
        E = new int *[V];
        for (int i=0; i<V; i++)
        {
            E[i] = new int[V];
            for (int j=0; j<V; j++)
                E[i][j]=0;
        }

    }

    void AddEdge(int i, int j)
    {
        E[i][j]=1;
        E[j][i]=1;
    }

    bool IsAdjacent(int i, int j)
    {
        return (E[i][j]==1);
    }

    void BreadthFirstSearch(int vertex)
    {
        bool* visited = new bool[V];
        for(int i=0; i<V; i++)
            visited[i] = false;
        Queue que;
        que.Enqueue(vertex);
        while (que.QIsEmpty() != true)
        {
            int temp = que.Dequeue();
            visited[temp] = true;
            qres.Enqueue(temp);
            for (int i=0; i<V; i++)
            {
                if (IsAdjacent(temp, i) && (visited[i] == false))
                    que.Enqueue(i);
                if (visited[i] == true)
                    qex.Enqueue(i);
            }
        }
        delete [] visited;
    }

    int GraphCountElements()
    {
        int c1 = qex.CountQueueElements();
        int c2 = qres.CountQueueElements();
        int sum = c1 + c2;
        return sum;
    }

    bool IsConected()
    {
        int Vc = GraphCountElements();
        if ((qex.QIsEmpty()) && (Vc == V))
            return true;
        else
            return false;
    }

    void PrintGraph()
    {
        qres.PrintQueue();
        cout << endl;
    }

    ~Graph()
    {
        delete [] E;
    }

};



#pragma once
#include "List.h"
#include "Queue.h"
#include "Graph.h"



void main()
{

    
    Graph g(4);
    g.AddEdge(0, 1);
    g.AddEdge(1, 2);
    g.AddEdge(2, 3);
    
    g.BreadthFirstSearch(0);

    g.PrintGraph();

    g.GraphCountElements();


    if(g.IsConected())
        cout << "It's connected graph" << endl;
    else
        cout << "It is not connected graph" << endl;

}

Заранее благодарю
Автор: 4aini4eG
Дата сообщения: 27.08.2008 13:20
Я тут заметил ошибку, принцип нахождения циклов я вроде как понял, только вот не могу отобразить

Код: void BreadthFirstSearch(int BeginVert)
    {
        bool* visited = new bool[V];
        for (int i=0; i<V; i++)
            visited[i] = false;
        Queue que;
        que.Enqueue(BeginVert);
        while (que.QIsEmpty() != true)
        {
            int temp = que.Dequeue();
            qres.Enqueue(temp);
            visited[temp] = true;
            for (int i=0; i<V; i++)
            {
                if (IsAdjacent(temp, i) && (visited[i] == false))    
                    que.Enqueue(i);
else
             if (IsAdjacent(temp, i) && ()) // вот не знаю как тут
            } // сделать получается, что если будет
        } // visited[i] == true за исключением последней пройденной
// вершины, то обнаружится цикл
        delete [] visited;
    }
Автор: BlackBerry
Дата сообщения: 02.09.2008 19:22
На языке С я могу описать указатель на массив. Например

#include <stdio.h>

char ( *screen)[25][80][2]= 0xb8000000;

main()
{
(*screen)[0][0][0]= 'A';
}

Можно ли описать константу как указатель на массив ?
Чтобы я мог написать что-то типа
(* 0xb8000000)[0][0][0]='A'
Автор: Qraizer
Дата сообщения: 04.09.2008 14:05
Откастуй костанту к нужному типу.

Код: (*(char (far*)[25][80][2])MK_FP(0xB800, 0))[0][0][0]= 'A';
Автор: DW
Дата сообщения: 07.09.2008 21:13
Qraizer
у меня вопрос, если можно: зачем кастовать к far pointer ?
Автор: Qraizer
Дата сообщения: 08.09.2008 18:35
В смысле, почему именно far? Чтоб не зависеть от модели памяти. Указатель по любому должен быть дальним, а без явного указания far он таковым будет не всегда.
Если вопрос "почему pointer", то это не ко мне, а к автору вопроса.
Автор: DW
Дата сообщения: 11.09.2008 00:01
Именно почему FAR указатель, а не обычный. Никогда простo не встречал такой записи.Насколько я понял, в современных операционных системах все указатели по умалчанию дальние. Так что нет нобходимости указывать явно тип указателя. По идее можно написать просто: (*(char (*)[25][80][2])0xB800000)[0][0][0]= 'A';
Автор: Qraizer
Дата сообщения: 12.09.2008 19:59
Не, в современных как раз наоборот - все ближние. Только сегменты большие - 4Гб, поэтому необходимость делить память на сегменты отпала. Этот же пример из времён DOS, а там сегмент с видеопамятью всегда отдельный и никогда не является частью приложения, т.е. указатель до него должен быть far. Убери far и скомпили в малой модели памяти, работать не должно.
Автор: akaGM
Дата сообщения: 18.09.2008 11:08
совсем забыл С-препроцессор...
что означает две решётки в дефайне?:

Код: # define _NAME_(x) x ## _

void _NAME_(aaa)(int*, int*);
...

void aaa_(int*, int*);
Автор: Abs62
Дата сообщения: 19.09.2008 17:30
akaGM
Угу. Решётки выкидываются, токены, ими разделённые, сливаются.
Token-Pasting Operator (##)
Автор: akaGM
Дата сообщения: 19.09.2008 17:42
Abs62
спас...

всё-таки мощная штука эти литеральные макросы...
как же их порой не хватает в Фор/Пас...
Автор: JamesBond008
Дата сообщения: 23.09.2008 05:15
Привет, помогите пожалуйста с задачкой, вступление написал, а основной алгоритм не догоняю как сделать

Пусть значения границ n отрезков [ai,bi] (i=1,2,...,n) числовой прямой заданы в виде двух массивов {ai} и {bi}. Найти отрезки с наибольшей и наименьшей длинами и определить пересекаются ли они.




#include <iostream>
#include <string>//Использование класса строк
//#include <cstdio>
#include <cstring>//Использование быблиотечных функций работы со строками
#include <cctype>
#include <fstream>//Заголовок необходим для работы с файлами
#define const int pok=0;
using namespace std;


int main()

{

/*Объявление строковых динамических массивов*/
string a;
string str1,str2;
/*..........*/

int i=0;//Объявление целой переменной
char r[80],w[20];//Объявление символьного одномерного массива длиной 80 символов
char otv;//Объявление символьной переменной


cout << "PRIVET !!! Eto soverhenno bezpoleznaya programma !!! =)\n";//Вывод приветствия
metka1://Метка оператора goto
cout << "\nVvesti I.D. iz fyala? "; cin >> otv;//Запрос на ввод данных из файла

switch (otv)
{
case ('y'):
case ('Y'):
{
    fstream both("test.txt");//Открытие файла для ввод\вывода
    
    if(!both)//Проверка на доступ к файлу
    {
        cout << "\nNe MOGY otkrit\' fail!!!\n";
        return 1;
    }

    both >> r;//Считывание массива
    
    both.close();//Закрытие файла
}
break;


case('n'):
case('N'):
{
/*ввод исходный данных вручную*/        
loop1:

    cout << "\nVvedite stroky dlinnoi menee 80-ti simvolov: \n";
    cout << "\n";
    gets(r);//ввод массива с клавиатуры
    
    /*проверка на пробелы в массиве*/
    for (i=0;r[i];++i)
    {
        if(r[i]==' ')
        {
            cout << "\a\a\a\nVvedite zanovo bez probelov!!!\n";
            goto loop1;
        }    
    }
    /*..........*/

    if (strlen(r)==0)goto loop1;

/*..........*/
}
break;


default:
    {
    cout << "\a\a\a";//звуковой сигнал об ошибке
    goto metka1;//оператор goto
    }
}

cout << "\nDlina stroki ravna: " << strlen(r) << "\n\n\n";//вывод длины массива

    int len=strlen(r);

    for (i=0;r[i];i++)r[i]=tolower(r[i]);//все прописные буквы делаются строчными

    a=r;//сливаем все значения (кроме '/0') в массив а
    for(i=0;i<80;i++){r[i]=' ';}

    int k=1,j=0,c=0,p,q=0,q1=0,i1;//объявление целых переменных
    //char pok;
    if(len==1){cout << a; goto loop3;}
    

/*основной алгоритм решения задачи*/
Автор: Padre1
Дата сообщения: 24.09.2008 11:12
помогите плз.до экзамена 15 мин. нужно слово "университет" закодировать по методу Фано!очень нужно!заранее спасибо!
Автор: raimur
Дата сообщения: 02.10.2008 12:27
товарищи программисты подскажите пожалуйста каким способом можно реализовать класс Bankomat моделирующий работу банкоматаюв классе должны содержатся поля для хранения ин банкомата, информации о текущей сумме денег оставшейся в банкомате минимальной и максимальной сумме которой позволяется снять клиенту в один день.Сумма денег представляется номиналами 10 -1000 руб.реализовать метод инициализации банкомата метод загрузки купюр в банкомат и метод снятия определенной суммы денег.метод снятия денег выполнять проверку на корректность снимаемой суммы : она не должна превыщать максимальное значение.и быть не меньше минимального.метод toString() должен преобразовать в строку сумму денег оставшееся в банкомате....ай корче хотя бы подскажите кто нить как это делать!!!каким способом....ну ато ничего не выходить!! горю до утра срочно нужно!!!ну пожалуйста!!!!
Автор: vipettut
Дата сообщения: 02.10.2008 14:33
raimur

Пишешь класс Bankomat. У него должны быть поля для хранения количества купюр каждого номанала. Ну или массив или хэш для этого. Метод пополнения банкомата - функция, в которую надо передавать список (номинал купюры, количество купюр). Или проще - передаем только номинал и количество (т.е. за 1 раз можно пополнить банкомат купюрами одного номинала). У банкомата должны быть поля (и соотв. методы чтения и/или записи) минимальной и максимальной выдаваемой суммы (хотя в реальной жизни это [и] от банка-эмитента карточки вроде должно зависеть). Метод toString() - суммируешь все бабки в банкомате: сумма (номинал купюры * количество купюр) и переводишь число в строку. Вроде все примитивно.
Автор: raimur
Дата сообщения: 02.10.2008 14:56
Ну вроде чуть яснее...ну а как же метод снятия денгег с банкомата или же как точнее мне объявить клиента который будет снимать деньги и его остаток на счете?или же мне не нужно объявлять ?Или есть какой то другой способ?
Автор: vipettut
Дата сообщения: 02.10.2008 19:24
raimur

Метод снятия денег - это должна быть функция, которая на вход принимает число, а на выходе возвращает список из (номинал купюры, количество купюр. Без повторений). Или же просто список из номиналов купюр (с повторениями).
Автор: raimur
Дата сообщения: 02.10.2008 22:47
Спасибо огромное выручил!!!вроде дошло!!!
А еще один маленький вопросик как насчет идентификационного гомера банкомата(ин)?
как и зачем интересно его реализовывать?
Автор: Huwkerok
Дата сообщения: 10.10.2008 22:49
Form1->FindComponent("Series"+IntToStr(rr))->AddXY(i,(A[rr-2][0]-A[rr-2][1]*i),"",clWhite);
'AddXY' is not a member of 'TComponent'
скажите что изменить ?
Автор: lamoza
Дата сообщения: 11.10.2008 18:31
Есть поле в клетку, и для каждой клетки есть два значения скоростей (по Х и по У), нужно сложить эти два вектора и нарисовать стрелку направления для каждой клетки. Как это можно реализовать на VC++?
Автор: TargeTSan
Дата сообщения: 13.10.2008 00:02
2lamoza

В общем случае, сам понимаешь, будет нечто вот такое...
[no]
struct Point2D
{
double x,y;
};

template<typename T>
void DrawVelocities(size_t xsize, size_t ysize, const Point2D** cells, const Point2D velocities, T drawfunc)
{
for (int i = 0; i < xsize; i++)
for (int j = 0; j < ysize; j++)
drawfunc(cells[i][j], velocities[i][j]);
}

//Остальное зависит от того, что ты используешь для отрисовки. Для GDI+ будет примерно //такое (оччень примерно, давно не работал с ним)

class GDIVelocityDrawer
{
public:
StrangeVelocityDrawer(HDC exthdc): hdc(exthdc) { }
void operator () (const Point2D& src, const Point2D& vec)
{
MoveTo(hdc, src.x, src,y);
LineTo(hdc, src.x + dst.x, src.y + dst.y);
}
private:
HDC hdc;
};

// А дальше мы всё это пробуем рисовать

int main(int argc, char** argv)
{
size_t xdim, ydim;
Point2D** cells;
Point2D** velocities;
HDC dc;
// тут мы всё это дело инициализируем как нам надо
DrawVelocities(xdim, ydim, cells, velocities, GDIVelocityDrawer(dc));
return 0;
}
[/no]
Можно по вкузу дописать цвета или сменить отрисовщик, не суть важно.
Если это не то что ты хотел, уточни задачу
Автор: KuPbI4
Дата сообщения: 13.10.2008 00:13
извините не в тему написал))
Автор: TargeTSan
Дата сообщения: 14.10.2008 22:43
2Huwkerok
Подозреваю, что FindComponent возвращает поинтер на базовый класс TComponent, который о AddXY и слыхом не слыхивал, хтотя ты ищешь по имени какой-то компонент, наследованный от TComponent. Попробуй делать dynamic_cast<...> к требуемому классу, т.е.

dynamic_cast<MyCoolComponent*>(Form1->FindComponent("Series"+IntToStr(rr)))->AddXY(i,(A[rr-2][0]-A[rr-2][1]*i),"",clWhite);

Учти однако, что это не есть полностью безопасное решение (идёт приведение от базового класса к потомку).
Автор: Qraizer
Дата сообщения: 15.10.2008 20:18
Не, это вполне безопасное решение, но только если не забыть проверить результат dynamic_cast<> на успех.
Автор: Kish
Дата сообщения: 19.10.2008 19:35
Приветствую.
Хочу реализовать такую задачу на C++ Builder. Программа, что-то типа, подсветка синтаксиса для Web'а. Строится на поиске нужного тэга и замене его.
Приведу небольшой пример:
В одно поле TMemo вводим исходный код

Код: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="en">
<head>
<title>Заголовок</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="css/style.css" rel="stylesheet" type="text/css" media="screen" />
</head>
Автор: AZA_N
Дата сообщения: 03.11.2008 19:44
Заранее прошу прощения, если не в ту тему, но, помогите, пожалуйста, с решением следующей проблемы. Мне необходимо разобраться с системой библиотек Geant4 (под WinXP+cygwin+VS2005). Трудность для меня заключается в том, что я много лет писала только чисто расчетные программы на Фортране (со скромным GUI только для удобства проведения расчетов и обработки результатов), а С++ никогда не использовала. В сети по нему куча литературы, так что синтаксис – дело наживное. Бывшие фортранщики, поделитесь опытом, как лучше научиться думать на С++ и забыть фортран (что для этого лучше почитать в кн. Страуструпа 1000 страниц – может, что покороче есть?), а также куда сунуться (кроме офф. сайта и странички НИИЯФ МГУ ), чтобы отыскать побольше примеров использования этих библиотек?
Автор: xdude
Дата сообщения: 03.11.2008 20:07
AZA_N
C++ - это, в первую очередь, объектно-ориентированный язык. Поэтому я бы порекомендовал начать с изучения объектно-ориентированного подхода к программированию. Фортран, насколько мне известно, процедурно-ориентированный язык, и в этом плане к нему будет ближе C. Использовать С++ в качестве процедурно-ориентированного языка тоже возможно, но это будет равносильно забиванию гвоздей плоскогубцами - технически возможно, но насчет целесообразности можно поспорить. Хотя, это лично моё мнение.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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