Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   нужны задания практические по С (http://forum.oszone.net/showthread.php?t=74777)

bool 17-11-2006 18:05 513401

С,C++| bases
 
вспоминаю и изучаю дальше - С, самостоятельно. Дайте какие нибудь задания пожалуйста, а лучше несколько по возрастающей (по сложности) . Или посоветуйте где можно эти задания найти 8) Уровень начинающего.

Diseased Head 17-11-2006 19:11 513428

bool
Мне это тоже интересно.
Но у меня такое ощущение что все забыли про C. Про структурное программирование забыли. И непонятно, почему?
Ведь ОО языки предназначены для написания, больших по размеру программ (ну можно и средних). А писать на C++ (и др. ООЯ) маленькие проги это дибилизм. Уж не говоря о C# и Java. Эти мне кажется вобще предназначены только для прикладух и под сеть, а системные проги на них писать, по моему, изврат.
Или я не прав?

CyraxZ 17-11-2006 20:30 513471

Цитата:

вспоминаю и изучаю дальше - С, самостоятельно
Чистый C сейчас практически нигде не используется, посему советую (лично моё мнение) взяться за C++... Даже фирмы, которые писали на чистом C, скажем, драйвера или программы прошивки для всяких устройст (т.е. системное низкоуровневое программирование), сейчас переходят на C++. Потому что сейчас уже разницы практически нет, что мы напишем прогу с использованием классов и конструкторов на C++, что с использованием переменных и инициализирующих функций (вместо конструкторов) на чистом C. А вернее, машинный код после компиляции C-программы ничуть не быстрее и не короче, чем после компиляции аналогичной C++-программы (а эти параметры - скорость и размер кода - в системном программировании играют ведущую роль). Раньше то, возможно, и была. Но сейчас компиляторы и оптимизаторы сделали своё дело.
Это о скорости выполнения кода и о его размере. Что касается простоты, удобства и эффективности, то верх берёт, однозначно, C++...

Цитата:

Но у меня такое ощущение что все забыли про C. Про структурное программирование забыли. И непонятно, почему?
С++ - не чисто объектно-ориентированный язык (в отличие, например, от C#). C++ проектировался как язык общего назначения с уклоном в сторону системного программирования и поддерживающий несколько парадигм программирования, куда наряду с парадигмой ООП входит и парадигма процедурного программирования. Никакой стиль программирования язык не навязывает, он всего лишь предоставляет удобные средства для использования какой-либо парадигмы. Т.е. С++ не заменяет C, а всего лишь добавляет поддержку абстракции данных, объектно-ориентированного и обобщённого программирования (его главные преимущества перед традиционным C).
Т.е. на C++ запросто можно написать структурную программу без использования классов и конструкторов/деструкторов (если нравится). На C же ООП-программа пишется довольно сложно (поддержки ООП то нет)...

Таким образом, системные программы на C++ пишутся так же легко, как и на чистом C. Чего не скажешь, например, о C#. На C# тоже можно писать системные программы, но это неоправданно сложно и неэффективно, поскольку C# - полностью объектно-ориентированный язык (там даже функция main принадлежит классу) и заточенный именно на ООП. Другие парадигмы он не поддерживает...

Coutty 18-11-2006 17:39 513792

CyraxZ, а почему на C# неэффективно писать системные программы? Тот же Visual Studio 2005 всё равно сначала переводит программу с поддерживаемых языков (C++, C#, Basic - всё равно) в свой IL-код, а уж потом выходит бинарник. Так по сути - какая разница на каком языке, если есть ещё общий для всех IL?
Или моя логика неверна? Было бы интересно знать.

bool, посмотри курс по C/C++ на intuit.ru. Там вроде не особо сложно.

ivank 18-11-2006 18:42 513814

Coutty
Студия умеет генерить для C++ как нэйтив код, так и IL. Драйверы всё ещё в нэйтив делают. К тому же в плюсах работа с указателями много прозрачней, чем в C# (в котором указатели тоже есть, но более ограниченные. Основное назначение - связка с ансэйф кодом; непосредственно при программировании ими никто не пользуется).

Diseased Head 18-11-2006 19:43 513836

Coutty ты чёт...
Цитата:

Так по сути - какая разница на каком языке, если есть ещё общий для всех IL?
Так именно поэтому и системные проги писать не катит. Потому как все в IL-код, а уж как он потом это в машкод переделывает (???).
Я так думаю, может я не прав. Я в C# не силён.

pva 23-11-2006 19:53 516133

bool, стандартные шаги:
1. напиши прогу "hello, world" (ещё один сишник родился)
2. программу поиска максимального и минимального элемента массива
3. определитель матрицы
4. изменяемый список (рекомендуется двухсвязный)
5. быстрая сортировка этого списка.
Думаю на этом этапе желание работать с чистым C пропадёт

bool 26-02-2007 01:51 555222

забыл совсем про эту тему , да и времени не хватало. Вот по поиску максимального и минимального элемента, что то сразу застопорился)
массив задаю с 11 элементами, а почему позволяет вводить только 5 и сразу результат, и только на максимальный. Ещё подскажите как нужно правильно в начале объявить функции которые будут возвращать значение int, и в которую я буду передавать как аргумент - массив.

Код:

#include <stdio.h>

char find_max(char *x);
char find_min(char *n);
main(void)
{
    int t;
    char a[10];
    printf("input elements of array\n");
    for(t=0;t<10;t++){
      scanf("%c",&a[t]);
      }
    printf("Max = %c\n",find_max(a));
    printf("Min = %c",find_min(a));

}

char find_max(char *x)
{
    int t;
    char max;
    max=x[0];
    for(t=1;t<10;t++){
    if(x[t]>max) max=x[t];
    }
    return max;
}
char find_min(char *n)
{
    int t;
    char min;
    min=n[0];
    for(t=1;t<10;t++){
    if(n[t]<min) min=n[t];
    }
    return min;
}


bool 26-02-2007 02:09 555232

чет меня заклинило 8) пардон, вот работает) посмотрите пожалуйста , как можно оптимальнее её написать, и ещё такой вопрос: вот допустим я хочу прям в программе ввести величину массива. Мне нужно сначала объявить переменную int size; /* размер массива */
а как потом объявлять сам массив? так ведь нельзя: int a[size] , потому что переменная size ещё не определена. Подскажите пожалуйста.

Код:

#include <stdio.h>

find_max(int *x);
find_min(int *n);
main(void)
{
    int t;
    int a[10];
    printf("input elements of array\n");
    for(t=0;t<11;t++){
      scanf("%d",&a[t]);
      }
    printf("Max = %d\n",find_max(a));
    printf("Min = %d",find_min(a));

}

find_max(int *x)
{
    int t;
    int max;
    max=x[0];
    for(t=1;t<11;t++){
    if(x[t]>max) max=x[t];
    }
    return max;
}
find_min(int *n)
{
    int t;
    int min;
    min=n[0];
    for(t=1;t<11;t++){
    if(n[t]<min) min=n[t];
    }
    return min;
}


pva 26-02-2007 20:48 555637

массив переменного размера, так называемый динамический берётся из свободной памяти:
Код:

  int size1 = 10;
  int* array1 = new int[size1];

...

  delete[] array1;

усовершенствовать алгоритм поиска мин/макс дальше сложно. Можно только сделать его более универсальным, не теряя производительности:
Код:

// возвращает указатель на минимальный элемент или на конец массива (если он пустой)
int* find_min(int* first, int* last)
{
  int* result = first;
  if (first!=last)
  {
      while(++first!=last) if (*first<*result) result=first;
  }
  return result;
}

...

// вообще бы надо проверить, что size1>0
  int* min1 = find_min(array1, array1+size1);
  print("found minimum %d at position %d\n", *min1, ((unsigned)min1-(unsigned)array1)/sizeof(int));

// минимум среди первых 10:
  int* min1 = find_min(array1, array1+min(size1,10));
  print("found minimum %d at position %d\n", *min1, ((unsigned)min1-(unsigned)array1)/sizeof(int));


ivank 27-02-2007 00:23 555737

bool
Цитата:

а как потом объявлять сам массив? так ведь нельзя: int a[size] , потому что переменная size ещё не определена. Подскажите пожалуйста.
В C99 так можно.

В дополнение к ответу pva - если массив состоит из данных POD-типа, имеет небольшой размер и его время жизни привязано к области видимости функции (т.к. по выходу из функции он должен быть убит), то можно воспользоваться функцией alloca. Так сказать, pure-C way.

bool 28-02-2007 10:48 556305

а турбо С поддерживает С99? у меня почему то ошибку в синтаксисе показывает, может удобнее учиться на чем нибудь другом? что посоветуете? борланд 6 ?

pva 28-02-2007 22:26 556590

если уж билдер 6, то это достаточно продвинутый компилятор, чтобы использовать шаблоны с++. Есть например такой: vector<typename T>
Код:

#include <vector>
#include <fstream>
using namespace std;

void myFunc()
{
  vector<double> fdoubles(100, 0.);
  // создан объект std::vector<double>,
  // представляющий собой обычный массив из 100 элементов
  // и инициализирован значением 0.0
  // объект будет уничтожен автоматически при выходе из блока
  // для работы с памятью используется класс std::allocator<double>.
  // тот, который по умолчанию использует операторы new и delete[],
  // но можно их переопределить (но лучше не трогать, если нет острой необходимости)

  // работаем как с обычным массивом:
  fdoubles[0] = 3.14;   
  fdoubles[1] = 123.23;

  // если нужна проверка границ:
  fdoubles.at(0) = 3.14;   
  fdoubles.at(101) = 123.23; // здесь вылетит с исключением std::out_of_range

  // меняем размер, если надо, память перераспределяется автоматически
  // но так, что если просишь меньше, то не освобождается, а просто берётся меньше
  // из уже выделенного куска. Например:
  fdoubles.resize(50);  // используется кусок из 100*sizeof(double)
  fdoubles.resize(200); // используется кусок из 200*sizeof(double)
}

vector<double> readData()
{
  // работа с памятью оптимизирована для добавления небольших объектов.
  // то есть это идеальный класс для использования в качестве буфера чтения (небольших объектов)
  // и использования индексации.

  ifstream input("my_data.txt");
  double buf;
  vector<double> result;
  while(input>>buf) result.push_back(buf);

  return result;
}

// TList в делфи - это аналог vector<void*>


bool 04-03-2007 16:38 557847

pva

спасибо, но я попытаюсь освоить сначала всю функциональность С =) без С++.


Пишу программку определения определителя матрицы и у меня такой вопрос возник: правильно ли будет объявлять в цикле главной функции массив? Ведь при каждой итерации цикла будет создаваться новый массив, или он будет заменяться старым?
допустим вот такая ситуация:

pm=--pm; /* pm изначально определена, например pm=5 */

for(бла бла бла) {
бла бла бла
int f[pm][pm]; /* вот здесь =) */
бла бла
}

или лучше в цикл включить функцию объявленную заранее в которой будет этот массив объявляться и по её завершению удаляться, а потом при след. итеррации создаваться вновь?

bool 04-03-2007 20:38 557917

что то я затормозился на этом определителе. использую рекурсивную функцию для определения.

Код:

finder(int *a)
{  register int k;
  int answer;
  if(a[k][k])
  if(k==2) answer = a[k-1][k-1]* a[k][k]-a[k-1][k] * a[k][k-1];
  answer = (-1)^(k+1) * a[1][k] * finder(a[k-1][k-1]);
  return(answer);
}

в функцию передается указатель на массив, но как передать переменную - порядок матрицы? т.е. то чем в функции подменяется переменная к? в моем случае получается, что я её использую до определения

все остальное:
Код:


#include <stdio.h>
#define n 5

finder(int *a);
void main(void)
{
  int b[n][n];
  int pm = 5;
  int opr=0;
  int opr1=0;
  int s;

  for(s=1;s<n;s++){
      pm = pm--;
      int p[pm][pm]; /*здесь опять ошибка синтаксиса С89 */
      opr=(-1)^(s+1) * b[1][s] * finder(p);
      opr1=opr1+opr;
      }
}

подскажите пжлст =)

pva 04-03-2007 21:49 557937

если действовать рекурсивно, то надо каждый раз делать копии подматриц (потому что по сути при выбрасывании столбца и строки метрица меняется). Но можно выбрасывать только индексы.
Код:

// приучайте мышление к универсальным алгоритмам - шаг к С++
typedef int value_type;
typedef unsigned size_type;

value_type internal_det(value_type const** rows, size_type* cols, size_type size)
{
  value_type result;

  // rows - это указатели на строчки (с пропусками)
  // cols - индексы столбцов (тоже с пропусками)
  // чтобы взять элемент i, j такой матрицы, нужно:
  // elem = rows[i][cols[j]];

 if (2<size)
 {
  size_type size_less = size-1;
  value_type** rows_less = new value_type*[size_less];
  size_type* cols_less = new size_type[size_less];

  // собираем матрицу  с выброшенным первым столбцом (и строчкой):
  for(size_type i=1; i<size; ++i) rows_less[i-1] = rows[i];
  for(size_type j=1; j<size; ++j) cols_less[j-1] = cols[j];

  // собираем поочереди:
  for(size_type i=0; i<size_less; ++i, rows_less[i]=rows[i]) {
    for(size_type j=0; j<size_less; ++j, cols_less[i]=cols[i]) {
        // я точно не помню формулу, но суть в следующем:
        // получаем определитель матрицы с выброшенным элементом
        value_type det1 = internal_det(rows_less, cols_less, size_less);
        ...
    }
  }
 
  delete [] cols_less;
  delete [] rows_less;
 }
 else
 {
    // матрица 2x2
    result = rows[0][cols[0]] + rows[1][cols[1]] - rows[0][cols[1]] - rows[1][cols[0]];
 }

  return result;
}

value_type det(value_type* matrix, size_type n)
{
  value_type** rows = new value_type*[n];
  size_type* cols = new size_type[n];

  for(size_type i=0; i<n; ++i) rows[i] = matrix + n*i;
  for(size_type i=0; i<n; ++i) cols[i] = i;

  return internal_det(rows, cols, n);
}


ferrum2688 05-03-2007 10:56 558065

Нужны задания?
Напиши марио, змейку, в общем какую-нибудь простенькую игру.

bool 05-03-2007 11:26 558076

pva

огромное thx 8) сейчас переварю это (с новыми типами) допишу с формулой и перейду к структурам =)



ferrum2688

на С? я до такого уровня ещё не дошел, чтобы игры на нем писать, я даже не представляю как графический интерфейс на С стряпать ))

ferrum2688 06-03-2007 15:32 558562

Цитата:

на С? я до такого уровня ещё не дошел, чтобы игры на нем писать, я даже не представляю как графический интерфейс на С стряпать ))
На C,C++ можно просто использовать текстовый режим, члены змейки можно сделать например "*". Конечно в графическом лучше, потому что символы имеют разную высоту и ширину.
В принципе достаточно только gotoxy(int x,int y) и cprintf("*"); , для очистки cprintf(" "), думаю этого достаточно для графики, есть конечно ещё и др. функции(clrscr();-очистка всего экрана), но написать можно и без них. Для того чтоб понять программирование можно писать с ограниченным числом функций, нужно подумать возможно ли на основании твоих знаний решить данную задачу, а большинство придуманных функций для ускорения процесса создания и можно обойтись без них. Например возведение в степень(целую), извлечение корней(целых) можно сделать из:+,-,*,for,if.

bool 15-03-2007 16:22 562112

Цитата:

// приучайте мышление к универсальным алгоритмам - шаг к С++
typedef int value_type;
typedef unsigned size_type;
я уже понял почему на чистом Си писать неудобно) тот же typedef помоему взят уже из С++, по крайней мере его использовать, помоему , можно только в Вин компиляторах(вычитал у Г.Шилдта =) и мой турбо Си отказывается запускать и ругается на синтаксис при его применении) , но все же хочу опробывать все функции которые Шилдт описывает в своем издании, и потом уже начинать освоение С++ (там так и указано в самом начале справочника по С++ "перед началом изучения С++ вы должны знать основы С" ).

bool 15-03-2007 16:45 562122

Цитата:

4. изменяемый список (рекомендуется двухсвязный)
5. быстрая сортировка этого списка.
где почитать про изменяемые списки? поисковики меня отправляют на форумы по дельфи и паскалю.

pva 15-03-2007 20:03 562211

Цитата:

перед началом почитайте C
Увлекаться не советую, ибо хороший программист на С - плохой на С++. Если не работают typedef - надо заменить их на #define. Книжку советую одну: Страуструп, "программирование на С++". Здесь, на сайте можно закачать. Древняя, но такая хорошая! Про двухсвязный список там целая глава. С быстрой сортировкой можно разобраться, посмотрев алгоритмы std::sort, std::stable_sort. А можно сильно мозги не забивать, а просто пользоваться ими. Они самооптимизируются и под вектора и под списки. Работают медленней, чем сортировка по хешу, но если надо, в новейших версиях библиотек поставщиков компиляторов, как правило, такие вещи есть. А вообще, если данных много, то лучше воспользоваться специализированным для них хранилищем - SQL-сервером, которое и выберет и отсортирует с максимальной возможной скоростью.

bool 19-03-2007 12:04 563668

какой компилятор посоветуете использовать для изучения С++ ? работаю на вин2003, если такие существуют , то лучше бесплатный )

билдер С++ или MS Visual C++ ? правда оба не бесплатных 0=)

bool 19-03-2007 15:24 563765

устанавливаю visual C++ express, http://msdn.microsoft.com/vstudio/ex...s/default.aspx кто нибудь работал в нем? чего о нем можно сказать хорошего и плохого?)

bool 21-03-2007 09:52 564609

для обучения вроде самое то, и бесплатно и все вроде есть(для начинающего), только вот почему то у меня без namespace отказывается он работать, т.е. программировать только по новому стандарту? а у Страуструпа в книге описание идет по старому 8( так что параллельно держу открытой литературу Герберта Шилдта по С++.

ivank 21-03-2007 13:51 564747

Цитата:

а у Страуструпа в книге описание идет по старому 8(
Какое издание? С третьего (которому уже почти 8 лет!) идет по "новому" стандарту. Если внимательно читать, то почти в самом начале книги (как раз после введения понятия namespace) он пишет, что для экономии места std:: или using namestpace std; он в примерах будет опускать.

bool 21-03-2007 13:55 564749

у меня видимо самое первое издание))) вот оно http://dump.ru/files/2/2434794630/ , можно ссылку на последнее издание? 8)

bool 21-03-2007 14:16 564761

http://cclib.nsu.ru/projects/gnudocs/texts/cpptut.html - вот ещё, но там тоже ничего нет про новый стандарт, или нового издания нет в электронном виде?

pva 21-03-2007 17:09 564834

про namespace - это мелочи, на которые вы зря обращаете внимание. Один раздогадался - и на всю жизнь. Почитайте про двусвязные списки.

bool 28-03-2007 10:27 567357

возможно не в тот раздел пишу, и это связано с ОС , но исправить не знаю где. Среда MS Visual C++ Express, пишу консольный проект, при запуске кирилица отображаеца "кракозябрами", где и как это можно исправить?

bool 28-03-2007 15:59 567521

класс:
Код:

class vector {
      int* v;
      int  sz;
  public:
          vector(int);      // конструктор
          ~vector();        // деструктор
      int size() { return sz; }
      void set_size(int);
      int& operator[](int);
      int& elem(int i) { return v[i]; }
  };

определяем конструктор:
Код:

vector::vector(int s)
  {
      if (s<=0) error("плохой размер вектора"); sz="s;" v="new" int[s]; }

и функцию:
Код:

int& vector::operator[](int i)
  {
      if(i<0 || sz<="i)" error("индекс выходит за границы"); return v[i]; }

почему ";" в
Код:

sz="s;"
и ")" в
Код:

if(i<0 || sz<="i)"
внутри кавычек?

ivank 28-03-2007 23:17 567681

bool
Цитата:

возможно не в тот раздел пишу, и это связано с ОС , но исправить не знаю где. Среда MS Visual C++ Express, пишу консольный проект, при запуске кирилица отображаеца "кракозябрами", где и как это можно исправить?
По форуму поищите. Неоднократно поднимавшаяся тема.

По поводу кавычек. Вы вообще свой пример скомпилировать пытались? И не получится. Не пользуйтесь тем источником, из которого пример. Ибо бяка.

Diseased Head 28-03-2007 23:24 567683

bool
Цитата:

при запуске кирилица отображаеца "кракозябрами", где и как это можно исправить?
При компиляции что-ли?

А про кавычки, может так:
Код:

sz="s";
и
Код:

if(i<0 || sz<=i)
эт по логике, а так ivank верно сказал --- БЯКА!

trinarry code GO? ........................ GO!!! => not bool

bool 29-03-2007 02:24 567729

Цитата:

эт по логике, а так ivank верно сказал --- БЯКА!
по логике я тоже догадался как нужно ставить)))))))))) дело в том, что во всех учебниках которые я нашел, Бьерна Страустрапа такая бяка. Не знаю, мб перенабирали текст так криво. Компилировал я так, как по логике =) просто интересно почему весь учебник так перелопачен, ведь так хвалили литератур эту.

pva 29-03-2007 16:21 568060

Вложений: 1
Я пользуюсь вот вариантом книжки Страуструпа, который прикрепил во вложении. Вот честно, никаких упомянутых глюков не нашёл. Посмотрите, не пожалеете ;)

bool 29-03-2007 17:06 568075

Спасибо =) , действительно все исправлено, да ещё и примеры есть к каждой главе в архиве

ivank 30-03-2007 01:08 568256

Цитата:

просто интересно почему весь учебник так перелопачен, ведь так хвалили литератур эту.
Потому что хвалили литературу, а не результат труда криворуких наборщиков.

bool 21-04-2007 21:40 577721

у меня вопрос по компиляторам снова 8)
вот код:
Код:

#include "stdafx.h"
#include <iostream>
using namespace std;


int main()
{
        char alpha[] = "abcdefghijklmnopqrstuvwxyz";
        int sz = strlen(alpha);
        for(int i=0;i<sz;i++){
                char ch = alpha[i];
                cout << '\'' << ch << '\''
                        << " = " << int(ch) <<
                        " = " << oct(ch) << "\n";
        }

        return 0;
}

ошибка в преобразовании символьного типа в шестнадцатиричную запись:
Цитата:

c:\documents and settings\администратор.comp\мои документы\visual studio 2005\projects\5.1\5.1\5.1.cpp(17) : error C2664: 'std::oct' : cannot convert parameter 1 from 'char' to 'std::ios_base &'
все остальное работает, вопрос: дело в компиляторе или ошибка в коде?
компилятор visual C++ express

ivank 22-04-2007 00:07 577785

Надо так:
Код:

                cout << '\'' << ch << '\''
                        << " = " << int(ch) <<
                        " = " << oct << ch << dec << "\n";


bool 22-04-2007 00:24 577790

пардон, в восьмиричную

ivank

спасибо)

bool 22-04-2007 20:45 578067

простенькая программка, меняет местами значения переменных. Передаю адреса переменных в функцию которая меняет(должна =) ) местами.
Код:

#include "stdafx.h"
#include <iostream>
using namespace std;


int main()
{
        int change(int* i,int* j);
        int a = 6;
        int b = 7;
        change(&a,&b);
        cout << "a =" << a << "\n";
        cout << "b =" << b << "\n";
        return 0;
}

int change(int* i,int* j)
{
        int q = *i;
        *i = *j;
        *j = q;
}


в результате все равно:
Код:

a = 6
b = 7

в чем я опять облажался? =(

ivank 22-04-2007 21:11 578082

bool
Не знаю. У меня и gcc и VS6 (по техническим причинам более новых студий временно нет). Может быть дело из-за кривой оптимизации.

P.S. Чтобы данная программа вообще скомпилировалась надо изменить тип функции change на void. И её прототип лучше поместить до main, а не внутри.

bool 22-04-2007 21:39 578096

ivank
у меня бесплатный visual C++ express(регистрация на microsoft.com бесплатная), на нем скомпилировалось , но так вот криво 8( сейчас качаю борланд билдер, попробую на нем.

bezumes 23-04-2007 07:48 578194

bool Так не подойдет?
Код:

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
        int change(int *i,int *j);
        int a = 6;
        int b = 7;
        int &c=a;
        int &d=b;
        cout << "a =" << c << "\n";
        cout << "b =" << d << "\n";
        change(&a,&b);

        cout << "a =" << c << "\n";
        cout << "b =" << d << "\n";
        cin>>a;
        return 0;
}

int change(int *i,int *j)
{
        int q = *i;

        *i = *j;
        *j = q;

        return 0;
}


bool 24-04-2007 00:24 578645

bezumes

ivank верно сказал, функция ведь ничего не возвращает, да и копилятор действительно странно работал. Запустил то же самое в борланде, и без проблем скомпилировалось и получил правильный результат. Странно то, что потом я ещё раз попробЫвал скомпилировать это все в VC++ express и все скомпилилось и такой же верный результат как и в борланде. 0.о

bool 05-05-2007 21:25 583512

вопрос по функции CharToOem(), присутствует ли она в компиляторах борланд и VC++ Express , запускаю программу и в обоих компиляторах идет ругань на эту функцию:

Цитата:

[C++ Error] Unit1.cpp(12): E2268 Call to undefined function 'CharToOem'
- борланд
Цитата:

error C3861: 'CharToOem': identifier not found
- VC++ Express

все заголовки:
Код:

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


yurfed 05-05-2007 22:17 583532

Цитирую запись полугодовой давности
Цитата:

Чистый C сейчас практически нигде не используется, посему советую (лично моё мнение) взяться за C++
Скажите, а зачем переходить? если ты виртуоз с топором и стругаешь детали так, как не получится у начинающего хирурга со скальпелем, то для чего нужны переходы с одного языка на другой? Практически все задачи можно решить любым из языков.
Я не говорю о специализированных языках, конкретно заточенных под что-то.

bool 06-05-2007 00:56 583581

СТОП! СТОП! СТОП! Не превращайте тему в очередной спор на тему: "какой язык программирования круче" !!!

bezumes 06-05-2007 09:46 583632

Цитата:

Код:

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


Необходимо подключить еще
Код:

#include <windows.h>

bool 06-05-2007 21:30 583788

bezumes
когда подключаю <windows.h> , компилятор ругается на его отсутствие вообще у себя.

bezumes 06-05-2007 22:06 583798

Вложений: 1
Цитата:

когда подключаю <windows.h> , компилятор ругается на его отсутствие вообще у себя.
Хм.Значит придется обходится без CharToOem. Попробуйте тогда вот так.Хоть что-нибудь должно же работать:)
Код:

#include <locale>

std::wcout.imbue(std::locale(".866"));
wchar_t str[] = L"Привет!!!";
wcout << str << endl;

Код:

#include <locale>

std::wcout.imbue(std::locale(".866"));
std::wstring string(L"Привет");
  wcout << string << endl;
  wcout << L"Привет !!!" << endl;
 
  unsigned char ch;
  ch='Ж';
  cout<<ch<<"\t"<<hex<<(int)ch<<endl;

  ch='\x86';
  cout<<ch<<"\t"<<hex<<(int)ch<<endl;

Вот кстати и windows.h

EvgeniyQQQ 07-05-2007 00:14 583834

bool
Цитата:

MSDN
Function Information
Minimum DLL Version user32.dll
Header Declared in Winuser.h, include Windows.h
Import library User32.lib
Цитата:

компилятор ругается на его отсутствие вообще у себя
странно, в Builder точно, должно работать.

EvgeniyQQQ 07-05-2007 19:41 584181

Преобразовать ASCII в Unicode можно с помощью "сишной" функции mbstowcs().
Код:

#include <stdio.h>
#include <tchar.h>

#include "stdlib.h"

void main()
{
        char str[] = "example";
        wchar_t str_t[sizeof("example")];
        //Функция преобразующая ASCII в Unicode
        mbstowcs(str_t,str,sizeof("example"));
        wprintf(_T("%s\n"),str_t);
}


bool 31-05-2007 23:48 593622

1) в MS Visual C++ Express, если успешно прошла компиляция , то при дальнейшем изменении проекта и повторной компиляции он продолжает компилиться по старому, не изменённому, варианту. Пробывал сохранять после изменения, а потом уже компилировать, не помогает =/ Что я делаю не правильно?
2) модераторам: возможно ли название этой темы сменить на "C,C++ | азы" ?

pva 04-06-2007 12:37 594839

я использую такую фигнюшку, если не принципиально что только под виндой рабоатет
Код:

std::wstring wstr(const char* s, unsigned size);
std::wstring wstr(const char* s) {return wstr(s, std::strlen(s));}

...

std::wstring wstr(const char* s, unsigned size)
{
    std::wstring w(size, wchar_t());
    MultiByteToWideChar(CP_ACP, 0, s, w.size(), &w[0], w.size());
    return w;
}


bool 27-06-2007 00:46 604518

программка для побайтного вывода значения типа double в двоичном представлении:

Код:

#include "stdafx.h"
#include <iostream>
using namespace std;

union bits {
        bits(double n);
        void show_bits();
        double d;
        unsigned char c[sizeof (double)];
};

bits::bits(double n)
{
        d = n;
}

void bits::show_bits()
{
        int i, j;

        for( j = sizeof(double) -1; j >=0; j--) {
                cout << "Double declaration of the bit" << j << ":";
                for( i = 128; i; i >>=1)
                        if(i & c[j]) cout << "1";
                        else cout << "0";
                        cout << "\n";
        }
}

int main()
{
        bits ob(1991.829);
        ob.show_bits();
        return 0;
}

меня интересует вот эта часть:
Код:

if(i & c[j]) cout << "1";
else cout << "0";

ведь мы определяем d, а не с[] , почему сравнивают побайтно i и c? потому что они в объединении и следовательно в одной области памяти? объясните пожалуйста поподробнее

bool 28-06-2007 19:46 605518

ещё такой полуоффтопный вопрос : что значит
Цитата:

Присылайте ваши резюме на блабла@блаблабла.ru с кодом C++/010
. Что есть C++/010???

pva 29-06-2007 11:33 605780

по поводу вопроса:
union - это "объединение", все поля будут занимать одну и ту же память. Это сделано в древнем языке "си" для того, чтобы можно было легко переделать из одного вида в другой. Компилятор автоматически выбирает под такие объединения столько памяти, сколько необходимо, чтобы хранить все члены объединения. Например:
Код:

union {
  int i;
  char c[3];
} union1;

union1.i = 0x12345678;

// хранится как:
// хранится как:
// адрес    значение 
// 440000  0x78      // i=0x12345678 //c[0]=0x78
// 440001  0x56                      //c[1]=0x56
// 440002  0x34                      //c[2]=0x34
// 440003  0x12

У вас биты отображаются в обратном порядке:
[code]
void bits::show_bits()
{
int i, j;

// мы перебираем память задом-наперёд?

for( j = sizeof(double) -1; j >=0; j--) {
cout << "Double declaration of the bit" << j << ":";
for( i = 128; i; i >>=1) // перебираем биты задом-наперёд?
if(i & c[j]) cout << "1";
else cout << "0";
cout << "\n";
}
}
[code]

bool 29-06-2007 17:38 605953

pva
спасибо =)
т.е. в первой итерации 128 побитно сравнивают с c[j]? объясните пожалуйста как получился первый байт? я попробЫвал вывести значение
c[j], и так какая то хрень получилась, вроде @0000000, оно и понятно, ведь тип то char. Понял я то, что мы идем по разрядам байта с конца, т.е сначала 128, потом 64 , 32 и т.д. А вот как получается результат? Вот кстати и он:

Код:

байт 7: 01000000
байт 6: 10011111
байт 5: 00011111
байт 4: 01010000
байт 3: 11100101
байт 2: 01100000
байт 1: 01000001
байт 0: 10001001


Admiral 03-05-2008 20:11 794025

Энтузиазм закончился? Если нет, то вот одна задачка, вернее вопрос, для тех кто и с С++ уже немного знаком, из одного популярного журнала:
"Определить какой из кодов, к какому из синтаксисов (С или С++) относится и объяснить почему, по каким параметрам был найден ответ".
Код:

forum (o, s)
int o, s;
{
int z;
for (z = 1; n>0; --n)
    z = z*t;
return z;
}

Код:

//Some text to view on output device
printf("%d %d\n", e*=2, f+=3);

Код:

for (int z = 0; z< MAXIMUM -1 && o! = '\n'; ++p; summa+=z)
Код:

int forums: 4
Только не надо разыскивать ни журнал, ни его номер в поисках ответа, попробуйте ответить своими силами, знаниями и пониманиями.


Время: 17:51.

Время: 17:51.
© OSzone.net 2001-