Я думаю, что вы придерживаетесь ключевой идеи: медианное значение всех значений в четырех массивах - это просто медиана всех значений, поэтому, если мы пройдем половину всех значений, то все, что будет дальше, будет медианой , Я хотел бы предложить структурирование следующим образом:
int firstIndex = 0;
int secondIndex = 0;
int thirdIndex = 0;
int fourthIndex = 0;
double current;
for (int i = 0; i < n/2; i++) {
// 1.) Find the value out of the four at firstIndex, secondIndex, ...
// which is smallest, and assign it to current
// 2.) Increment whichever of the four indices belongs to that element
}
// whatever is in current at the end of the loop is the middle element
Вы, вероятно, хотите функцию findMin(int index1, int index2, int index3, int index4)
. Этот метод также может отвечать за проверки за пределами границ, поэтому основной цикл может просто полагаться на него, чтобы он указывал в правильном направлении, и не заботиться о том, что в нем нет элементов в любом данном массиве.
Имеет ли это смысл? Я попытался оставить достаточно двусмысленности, чтобы позволить вам справиться с большей частью реальной работы по реализации:)
Можно добавить somethig как это в pre.h файл:
...
#ifdef COUNT
#if COUNT == 2
#undef COUNT
#define COUNT 3
#endif
#if COUNT == 1
#undef COUNT
#define COUNT 2
#endif
#else
#define COUNT 1
... here put your pre.h code
#endif
И в post.h:
#ifdef COUNT
#if COUNT == 1
#undef COUNT
#endif
#if COUNT == 2
#undef COUNT
#define COUNT 1
#endif
#if COUNT == 3
#undef COUNT
#define COUNT 2
#endif
...
#end
#ifndef COUNT
... here put your pre.h code
#endif
Но необходимо знать, как глубоко может Вы идти.
Если Вы знаете максимальную глубину рекурсии, то необходимо смочь моделировать нажатие/поп путем определения нового макроса на каждом уровне. Для 3 примеров уровня Вы даете, который посмотрел бы что-то как:
Pre.h:
#ifdef RECURSION_COUNT_1
#ifdef RECURSION_COUNT_2
#ifdef RECURSION_COUNT_3
#error Recursion level too deep
#else
#define RECURSION_COUNT_3
#endif
#else
#define RECURSION_COUNT_2
#endif
#else
#define RECURSION_COUNT_1
#undef YOUR_SYMBOL_HERE
#endif
Post.h
#ifdef RECURSION_COUNT_3
#undef RECURSION_COUNT_3
#else
#ifdef RECURSION_COUNT_2
#undef RECURSION_COUNT_2
#else
#ifdef RECURSION_COUNT_1
#undef RECURSION_COUNT_1
#define YOUR_SYMBOL_HERE
#endif
#endif
#endif
pre.h
#ifndef MYSYMBOLUNDEFFERSTACK
#define MYSYMBOLUNDEFFERSTACK 0
#else
#define MYSYMBOLUNDEFFERSTACKTMP (MYSYMBOLUNDEFFERSTACK+1)
#undef MYSYMBOLUNDEFFERSTACK
#define MYSYMBOLUNDEFFERSTACK MYSYMBOLUNDEFFERSTACKTMP
#undef MYSYMBOLUNDEFFERSTACKTMP
#endif
#if MYSYMBOLUNDEFFERSTACK == 0
#undef mysymbol
#endif
post.h
#ifndef MYSYMBOLUNDEFFERSTACK
#error "Async Post.h"
#else
#define MYSYMBOLUNDEFFERSTACKTMP (MYSYMBOLUNDEFFERSTACK-1)
#undef MYSYMBOLUNDEFFERSTACK
#define MYSYMBOLUNDEFFERSTACK MYSYMBOLUNDEFFERSTACKTMP
#undef MYSYMBOLUNDEFFERSTACKTMP
#endif
#if MYSYMBOLUNDEFFERSTACK == 0
#define mysymbol "MY_SYMBOL_DEFINITION"
#endif
Который хорошо работает в этом случае:
#include "stdio.h"
#include "pre.h"
#include "pre.h"
#include "pre.h"
//const char *pCompileError = mysymbol;
#include "post.h"
//const char *pCompileError = mysymbol;
#include "post.h"
//const char *pCompileError = mysymbol;
#include "post.h"
int main(void)
{
const char *p = mysymbol;
printf("%s\n", p);
return 0;
}
Править: Хорошо работает с gcc 4.0.
Постепенное увеличение/постепенное уменьшение значения во время компиляции, вероятно, возможно с крылом колдовства метапрограммирования Loki. Но действительно ли Вы уверены, что это необходимо?
Почему Ваш h файл включен так многие время? Почему бы не использовать включать защиту?
Попытка:
#ifndef MYMACROGUARD
#undef MYMACRO
#define MYMACROGUARD MYMACROGUARD+1
#endif
#if MYMACROGUARD <= 0
#undef MYMACROGUARD
#else
#define MYMACROGUARD MYMACROGUARD-1
#endif
Протестированный с этим кодом
#define MYMACRO
#include<iostream>
using namespace std;
int main()
{
#ifdef MYMACRO
cout<<"1"<<endl;
#endif
#include <pre.h>
#ifdef MYMACRO
cout<<"2"<<endl;
#endif
#include <pre.h>
#ifdef MYMACRO
cout<<"3"<<endl;
#endif
#include <post.h>
#ifdef MYMACRO
cout<<"4"<<endl;
#endif
#include <post.h>
#ifdef MYMACRO
cout<<"5"<<endl;
#endif
}
$> g++ -w -I. test.cpp && ./a.out
1
5