Часть 2. Я начинающий, подскажите как...(Все вопросы начинающих!!!)
ListBox1->Columns=3;
каким образом записать строку в второй и третий столбцы?
пример из МСДН
{
public static void Main()
{
// Creates and initializes a new three-dimensional Array of type Int32.
Array myArr = Array.CreateInstance(typeof(Int32), 2, 3, 4);
for (int i = myArr.GetLowerBound(0); i <= myArr.GetUpperBound(0); i++)
for (int j = myArr.GetLowerBound(1); j <= myArr.GetUpperBound(1); j++)
for (int k = myArr.GetLowerBound(2); k <= myArr.GetUpperBound(2); k++)
myArr.SetValue((i * 100) + (j * 10) + k, i, j, k);
// Displays the properties of the Array.
Console.WriteLine("The Array has {0} dimension(s) and a total of {1} elements.", myArr.Rank, myArr.Length);
Console.WriteLine("\tLength\tLower\tUpper");
for (int i = 0; i < myArr.Rank; i++)
{
Console.Write("{0}:\t{1}", i, myArr.GetLength(i));
Console.WriteLine("\t{0}\t{1}", myArr.GetLowerBound(i), myArr.GetUpperBound(i));
}
// Displays the contents of the Array.
Console.WriteLine("The Array contains the following values:");
PrintValues(myArr);
}
public static void PrintValues(Array myArr)
{
System.Collections.IEnumerator myEnumerator = myArr.GetEnumerator();
int i = 0;
int cols = myArr.GetLength(myArr.Rank - 1);
while (myEnumerator.MoveNext())
{
if (i < cols)
i++;
else
{
Console.WriteLine();
i = 1;
}
Console.Write("\t{0}", myEnumerator.Current);
}
Console.WriteLine();
}
}
Но - когда жму RUN (зеленый треугольник), вместо того чтобы программа работала и я мог проверить действие кнопок, просто мигают на 1сек инспектор и моя форма, а потом снова - режим редактирования. Скорее всего, какая-то мелкая ошибка, подскажите плиз.
Код:
[COLOR="Navy"]#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::colorClick(TObject *Sender)
{
if (Edit1->Color==clBtnFace)
Edit1->Color=clAqua;
else
Edit1->Color=clBtnFace;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::hideClick(TObject *Sender)
{
if (Memo1->Visible==true)
Memo1->Visible=false;
else
Memo1->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::insertClick(TObject *Sender)
{
Memo1->Lines->LoadFromFile(Edit->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::finClick(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
Memo1->Text=" ";
for (int i=1;i<=ParamCount();i++)
{
Memo1->Text +=(ParamStr(i)+"ln");
}
}
//-------------------------------------------------------------------------[/COLOR]
создать окошко, где есть поле memo, строка edit и кнопки с такими опциями:
-1 кнопка меняет цвет чего-нибудь (1клик-красный,2клик-белый,3клик-снова красный и тэдэ)
-2 кнопка что-нибудь прячет (1к-прячет, 2к-показывает и тэдэ)
-3 кнопка заливает текст файла, путь к которому в edit - в memo1
-4 кнопка "завершить" - закрывает форму
не уловил зачем ParamCount, и еще - плиз, не давайте слишком сложных советов типа "если бы прога была в три раза длиннее, она была бы в 10 раз стабильнее". в моей ситуации - пока не актуально. и спасибо огромное за ответ;-)
не уловил зачем ParamCount,
Возвращает количество параметров переданных при запуске программы. ParamStr(i) соответственно возвращает i-тый параметр...
Ну тут просто без комментариев :) HelloWorld самая глючная программа, я всегда это знал :D
Что в вашем понятии значит перестановка слов... Научитесь строить предложение по-русски, а там уже до C# рукой подать.
P.S. сори просто уже не первый неадекватный пост в этой теме...
string word2 = "bbb";
string word3 = "ccc";
Console.WriteLine(word1 + " " + word2 + " " + word3);
Console.WriteLine(word1 + " " + word3 + " " + word2);
Console.WriteLine(word2 + " " + word1 + " " + word3);
Console.WriteLine(word2 + " " + word3 + " " + word1);
Console.WriteLine(word3 + " " + word1 + " " + word2);
Console.WriteLine(word3 + " " + word2 + " " + word1);
И никакого цикла... :D
Рекурсией! Сейчас нет под рукой студии, попробую в браузере общую идею накидать:
{
for (int i = 0; i < Rest.Count; i++)
{
Console.Write(Rest + " ");
var NewRest = new List<String>(Rest);
NewRest.RemoveAt(i);
RecursiveSearch(NewRest);
}
Console.WriteLine("");
}
void main()
{
var Rest = new List () {"Один", "Два", "Три", "Четыре"};
RecursiveSearch(Rest);
}
using System.Collections.Generic;
using System.Text;
namespace ConsoleTest
{
class Program
{
static void RecursiveSearch(List<String> Chain, List<String> Rest)
{
if (Rest.Count == 1)
{
foreach (var str in Chain) Console.Write(str + " ");
Console.WriteLine(Rest[0]);
return;
}
for (int i = 0; i < Rest.Count; i++)
{
var NewChain = new List<String>(Chain);
var NewRest = new List<String>(Rest);
NewChain.Add(Rest);
NewRest.RemoveAt(i);
RecursiveSearch(NewChain, NewRest);
}
}
static void Main(string[] args)
{
var Rest = new List<String>() { "Один", "Два", "Три", "Четыре" };
var Chain = new List<String>();
RecursiveSearch(Chain, Rest);
Console.ReadKey();
}
}
}
Здесь стоит ещё подумать об оптимизации...
{
int _x;
public:
foo()
: _x()
{
}
foo(const foo& x)
: _x(x._x)
{
}
};
Конструктор добавляет адрес созданного объекта в massiv[] и в next предыдущего объекта.
Функция erase() удаляет адрес из massiv[] И вызывает деструктор. По идее.
Но деструкции почему то не происходит. Объект продолжает жить. Почему его не убило?
class myclass
{
public:
static myclass* pointer;
static int counter;
static myclass** massiv;
myclass()//конструктор
{
counter++;
if (pointer)
{
myclass** temp = new myclass* [counter];
pointer->next = this;
number=(pointer->number) +1;
for (int i = 0; i<(counter-1); i++)
{
temp = massiv ;
}
delete [] massiv;
massiv = new myclass* [counter];
for (int i=0; i<(counter-1); i++)
{
massiv = temp ;
}
delete [] temp;
}
else {number=1; massiv = new myclass* [1];}
massiv [counter-1] = this;
next=NULL;
pointer=this;
}
~myclass ()//деструктор
{
printf ("destructor\n");
}
int getnumber()
{
return number;
}
myclass* getadres()
{
return next;
}
void erase ()// удаляет указатель на объект из massiv
{
//
myclass** temp = new myclass* [counter-1];
int j=0;
int n= this->getnumber();
for (int i= 0; i<(counter); i++)
{
if(i != (n-1))
{
temp[j]=massiv;
j++;
}
}
counter--;
massiv = new myclass* [counter];
for (int i=0; i<(counter); i++)
{
massiv = temp ;
}
delete [] temp;
this->~myclass();
}
private:
int number;
myclass *next;//указатель на следующий объект
};
myclass* myclass::pointer = NULL;
myclass** myclass::massiv = NULL;
int myclass::counter =0;
int main()
{
myclass a;
myclass b;
myclass c;
myclass d;
b.erase();
printf ("%d\n", b.getnumber());
delete [] myclass::massiv;
return 0;
}
Конструктор добавляет адрес созданного объекта в massiv[] и в next предыдущего объекта.
Функция erase() удаляет адрес из massiv[] И вызывает деструктор. По идее.
Но деструкции почему то не происходит. Объект продолжает жить. Почему его не убило?
деструктор вызывается при уничтожении объекта, но не уничтожает его.
у вас ни в методе erase, ни в деструкторе не нарушается адресация или значение number, поэтому всё работает.
п.с.
{
...
int n= this->getnumber();
...
}
int n= this->getnumber(); - не имеет смысла, лучше int n = number;
п.с.с.
пришла в голову аналогия...
"Когда рак на горе свистнет, нужно посадить цветочек."
Рак - объект, свист - деструктор, посадить цветочек - задача деструктора.
Рак может свистнуть когда умрёт, а может просто свистнуть. Но сажать цветочки мы будем всегда;)
Издержки предыдущего опыта необъектного программирования. Мыслю пока глаголами.
По поводу int n= this->getnumber(); согласен, просто писал довольно быстро,
C++ стал осваивать недавно. Вопрос не в этом. Получается, каким -то образом до выхода из зоны видимости автоматический объект уничтожить невозможно? В смысле чтобы дальнейшие какие-то действия с ним стали невозможны?
Конкретные примеры: нужно было конвертировать число в строку и прицепить к строковой переменной. Я набирал " convert number to string", просто "number to string". Но ответа не получил. Перелистыванием справочников наткнулся на sprintf, которая делала то что нужно. Эта функция из <stdio> хотя наличие нужного мне инструмента я предполагал в <stdlib>, как atoi(), atof() и т.д. Время было потрачено достаточно много.
Или встретив в книжке cin.get() я захотел почитать обо всех членах класса cin. Ответ был достаточно куцый.
Может я ошибаюсь, но большинство возникающих вопросов типа "How to do it?", а в MSDN ответы на "What is it?" и "How to use it?".
создать объект через new и удалить его через delete.
Конкретные примеры: нужно было конвертировать число в строку и прицепить к строковой переменной. Я набирал " convert number to string", просто "number to string". Но ответа не получил. Перелистыванием справочников наткнулся на sprintf, которая делала то что нужно. Эта функция из <stdio> хотя наличие нужного мне инструмента я предполагал в <stdlib>, как atoi(), atof() и т.д. Время было потрачено достаточно много.
Или встретив в книжке cin.get() я захотел почитать обо всех членах класса cin. Ответ был достаточно куцый.
Может я ошибаюсь, но большинство возникающих вопросов типа "How to do it?", а в MSDN ответы на "What is it?" и "How to use it?".
я бы порекомендовал сначала попробовать поискать в гугле ответы на такие вопросы...
как пример:
http://www.google.ru/search?q=number+to+string+C%2B%2B&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a
первая же ссылка выдаёт:
Converts an integer value to a null-terminated string using the specified radix and stores the result in the given buffer.
If radix is 10 and value is negative the string is preceded by the minus sign (-). With any other radix, value is always considered unsigned.
buffer should be large enough to contain any possible value: (sizeof(int)*8+1) for radix=2, i.e. 17 bytes in 16-bits platforms and 33 in 32-bits platforms.
Further information can be found here.
{
setlocale (LC_ALL, "");
string str;
cout << "Введите строку.";
getline(cin, str); // здесь str считывается в кодировке 866
cout << str;
cin.get();
return 0;
}
Как перевести str в кодировку 1251? Только надо перевести так чтобы в str было в 1251, а не выводить переводя).
я бы порекомендовал сначала попробовать поискать в гугле ответы на такие вопросы...
как пример:
http://www.google.ru/search?q=number+to+string+C%2B%2B&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a
первая же ссылка выдаёт:
Гугль и MSDN несколько разные вещи, и кстати "первая же ссылка" выдает функцию, не входящую в стандарт.
Не нашла соответствующего раздела, потому пишу сюда... Надеюсь, модераторы решат что со мной дальше делать :)
Собственно, ситуация такая -
Использую графическую библиотеку MSFLIB.
Там есть функция, возвращающая положение и размеры окна getwsizeqq.
По идее (как я поняла из описания в "Современный фортран" Бартеньев О.В.)- размеры возвращаются в пикселях. Но практика показала - размеры даются в литеральных символах. Как все-таки получить размер в пикселях (не узнавая каждый раз размер литерального символа)?
Заранее спасибо.
Конкретные примеры: нужно было конвертировать число в строку и прицепить к строковой переменной. Я набирал " convert number to string", просто "number to string". Но ответа не получил. Перелистыванием справочников наткнулся на sprintf, которая делала то что нужно. Эта функция из <stdio> хотя наличие нужного мне инструмента я предполагал в <stdlib>, как atoi(), atof() и т.д. Время было потрачено достаточно много.
Или встретив в книжке cin.get() я захотел почитать обо всех членах класса cin. Ответ был достаточно куцый.
Может я ошибаюсь, но большинство возникающих вопросов типа "How to do it?", а в MSDN ответы на "What is it?" и "How to use it?".[/QUOTE]
Аналогично. Тоже когда-то искал о конвертации числа в строку в MSDN, но нашел не сразу и не совсем то, что хотел, а только функции из CRT: _itow, _itow_s и т.д. Это уже после изучения STL я узнал, что для этого ИМХО удобней использовать строковые потоки:
#include <sstream>
...
int x=1;
string s;
std::stringstream ss;
ss<<x<<endl; //запись числа в строковый поток
ss>>s; //извлечение из потока в строку
Как по мне, так MSDN лучше использовать только в качестве справочного пособия, а не как учебник. Например, выделил какое-то ключевое слово, нажал Ф1, почитал и закрыл. А вот искать какие-то способы решения задач поможет гугл. Поэтому MSDN даже не устанавливаю. Все равно, при необходимости он есть в онлайне.
Проблема с выделяемой под переменую памятью.
В rsdn есть пример работы с wininet
newsreader2
Если я правильно понял то выделяемой памяти не достаточно для больших страниц, тоесть он сработает на 2 строках но страницу из гугла не осилит.
Отладчик ругает переменую lpszBuffer.
Как правильно выделять память под нее?
Мне кажется, что в Code Blocks сделать, чтобы заработала gotoxy, нельзя... Судя по описанию здесь, функция gotoxy - из библиотеки conio.h. Посмотрел у себя в <путь к папке с установленным CodeBlocks>\include файл conio.h:
_CRTIMP char* __cdecl _cgets (char*);
_CRTIMP int __cdecl _cprintf (const char*, ...);
_CRTIMP int __cdecl _cputs (const char*);
_CRTIMP int __cdecl _cscanf (char*, ...);
_CRTIMP int __cdecl _getch (void);
_CRTIMP int __cdecl _getche (void);
_CRTIMP int __cdecl _kbhit (void);
_CRTIMP int __cdecl _putch (int);
_CRTIMP int __cdecl _ungetch (int);
#ifndef _NO_OLDNAMES
_CRTIMP int __cdecl getch (void);
_CRTIMP int __cdecl getche (void);
_CRTIMP int __cdecl kbhit (void);
_CRTIMP int __cdecl putch (int);
_CRTIMP int __cdecl ungetch (int);
...
Как мне представляется, в прилагающейся к Code Blocks библиотеке conio.h функция gotoxy отсутствует...
Впрочем, могу и ошибаться, поэтому хотелось бы узнать мнение более знающих.
#include <sstream>
...
int x=1;
string s;
std::stringstream ss;
ss<<x<<endl; //запись числа в строковый поток
ss>>s; //извлечение из потока в строку
Как по мне, так MSDN лучше использовать только в качестве справочного пособия, а не как учебник. Например, выделил какое-то ключевое слово, нажал Ф1, почитал и закрыл. А вот искать какие-то способы решения задач поможет гугл. Поэтому MSDN даже не устанавливаю. Все равно, при необходимости он есть в онлайне.
Да уж, пока инет перелопатишь.. Информация- основная проблема.
С потоками я разобрался.
Кстати, если подключен <sstream>, <string> подключать не нужно. А в строку поток можно извлечь так:
{
if (strlen(str11)>strlen(str12)) cout<<'"'<<str11<<'"'<<" Больше, чем "<<'"'<<str12<<'"'<<endl;
else cout<<'"'<<str11<<'"'<<(strlen (str11)==strlen (str12)? " равна " : " меньше ")<<'"'<<str12<<'"'<<endl;
return 0;
}
int lab0() //Лабораторная работа 0
{
const int max=256;
char str1 [max];
char str2 [max];
cout<<"Введите 2 строки для сравнения."<<endl<<"Первая строка:"<<endl;
cin.getline(str1,max);
cout<<"Вторая строка:"<<endl;
cin.getline (str2, max);
StrCmp (str1, str2);
return 0;
}
вместо str11 и str12 печатается нечто непереводимое)
CharToOem (str11, str11) выдает ошибку
ясно, что не может преобразовать константу, пробуем иначе:
char strv1[256];
CharToOem (str11, strv1) выдает
всякие функции с использованием русского языка не помогают. =(
в майн использована
Помогите, пожалуйста, я замучилась уже =(
То есть нужна другая библиотека, точнее - другой компилятор?
char strv1[256];
CharToOem (str11, strv1) выдает
Попробовал сделать из вашего кода вот такое:
#include <iostream>
#include <windows.h>
using namespace std;
int StrCmp(const char str11[], const char str12[])
{
char strv1[256];
char strv2[256];
CharToOem(str11, strv1);
CharToOem(str12, strv2);
char buf[20];
if (strlen(strv1) > strlen(strv2))
CharToOem(" больше, чем ", buf);
else if (strlen(strv1) == strlen(strv2))
CharToOem(" равна ", buf);
else
CharToOem(" меньше ", buf);
cout << '"' << strv1 << '"' << buf << '"' << strv2 << '"' << endl;
return 0;
}
int lab0() //Лабораторная работа 0
{
const int max = 256;
char str1 [max];
char str2 [max];
strcpy(str1, "Лабораторная");
strcpy(str2, "работа");
StrCmp (str1, str2);
return 0;
}
int main() {
return lab0();
}
У меня скомпилилось и работает, строки на русском выводятся нормально...
Если у вас до сих пор так и не получилось с CharToOem - не покажете пример кода, в котором у вас, при попытке ее вызывать, выдалась та ошибка при компиляции?
У меня скомпилилось и работает, строки на русском выводятся нормально...
Если у вас до сих пор так и не получилось с CharToOem - не покажете пример кода, в котором у вас, при попытке ее вызывать, выдалась та ошибка при компиляции?
Ваш пример выдал это:
Error 2 error LNK2019: unresolved external symbol "extern "C" int __stdcall CharToOemA(char const *,char *)" (?CharToOemA@@$$J18YGHPBDPAD@Z) referenced in function "int __cdecl StrCmp(char const * const,char const * const)" (?StrCmp@@$$FYAHQBD0@Z) ффф.obj
Error 3 fatal error LNK1120: 2 unresolved externals C:\Documents and Settings\user\Мои документы\Visual Studio 2005\Projects\ффф\Debug\ффф.exe 1
Видимо, что-то не так в компиляторе=(
если да то какие и как именно, заранее спасибо!:confused:[FONT="Courier New"][/FONT]
Пишу программу для КПК wm6. Подскажите какую базу данных можно поставить на кпк? Где ее можно скачать?
Строго говоря, квадратные скобки в C# перегрузить нельзя.
[QUOTE=MSDN]Оператор индексирования массива нельзя перегрузить, но можно определить индексаторы.[/QUOTE]
В частности, это можно сделать так:
{
public int[,] elements = new int[10,10];
public int this[int i, int j] // это и есть индексатор
{
get { return elements[i,j]; }
set { elements[i,j] = value; }
}
}
После такого объявления класса к нему можно обращаться так:
a[0,0] = 1; a[1,5] = 5;
Matrix b = new Matrix();
b[0,0] = -4; b[1,5] = 10;
UPD: я почему-то решил, что речь идёт о C#...
andrey32, уточни язык.
но мне нужно что то типа
object [1][2]=.....
но мне нужно что то типа
object [1][2]=.....
Насколько мне известно, можно перегрузить только operator[]. Примеров этого действительно полно.
С многомерными массивами не так всё просто. Могу лишь советовать посмотреть здесь (пункты 13.10, 13.11, 13.12) и здесь.