[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Ты не прав: вот тебе пример:

    Code:
    #include "stdio.h"
    
    int main() {
        int x = 1;
    	printf("1: %d\n", x);
    	{
    		printf("2: %d\n", x);
            int x = 2;
    		printf("3: %d\n", x);
    	}
    	printf("4: %d\n", x);
    	getchar();
    	return 0;
    }
    
    Переменная, объявленная во внутреннем блоке, замещает ту, которая объявлена во внешнем(примеры 2 и 3 в программе). Однако в конце блока она исчезает(примеры 3 и 4)


    Очень старый компилятор. Обнови.
    Более новые версии уже не компилят этот код. И правильно делают - в коде ошибка.
     
  2. 4y4o

    4y4o Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    40
    Likes Received:
    2
    Reputations:
    0
    Ребятки ответы на Дейтела нужны!!! 2007 год книженция
     
  3. Barttos

    Barttos New Member

    Joined:
    6 Jun 2008
    Messages:
    19
    Likes Received:
    2
    Reputations:
    0
    Добрый день
    Нужна книга по Visual C++ 2008
    Нашол только старые и одну 2005-ого года
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Спокойной ночи. Читай закрепленную в разделе тему.
     
  5. BEGINER

    BEGINER New Member

    Joined:
    16 Aug 2008
    Messages:
    18
    Likes Received:
    1
    Reputations:
    0
    Прошу прощения, я совершенно не понимаю, что такое область видимости.
    Вы не могли бы показать где находится область видимости в коде полученном после компиляции этой программы?
    Там четко видно, что переменная х находится по адресу dword ptr [ebp-4] даже после выхода из цикла for. И, следовательно, ее без проблем можно вывести на экран. Почему же тогда компилятор ругается?

    Code:
    //задаем х
    00401588   mov         dword ptr [ebp-4],1 	//x=1
    0040158F   jmp         0040159a
    00401591   mov         eax,dword ptr [ebp-4] 	//
    00401594   add         eax,1			//x++;
    00401597   mov         dword ptr [ebp-4],eax	//
    0040159A   cmp         dword ptr [ebp-4],0Ah	//x<=10
    0040159E   jg            004015c6
    //{
    //проверка х
    004015A0   cmp         dword ptr [ebp-4],5	//if(x==5)
    004015A4   jne          004015a8
    004015A6   jmp         004015c6		//break
    //вывод х
    004015A8   push        offset 0046c03c	//" "
    004015AD   mov         ecx,dword ptr [ebp-4]	//x
    004015B0   push        ecx
    004015B1   mov         ecx,004777e0		//cout
    004015B6   call          004010ff		//<<
    004015BB   push        eax
    004015BC   call          00401285		//<<
    004015C1   add         esp,8
    004015C4   jmp         00401591
    //}
    //вывод х
    004015C6   push        offset 004010c8	// \n
    004015CB   mov         edx,dword ptr [ebp-4]	// x
    004015CE   push        edx
    004015CF   push        offset  0046c01c 	//"Cukl prervan pri x == 5 "
    004015D4   push        004777e0		//cout
    004015D9   call          00401285 		//<<
    004015DE   add         esp,8
    004015E1   mov         ecx,eax
    004015E3   call          004010ff		//<<
    004015E8   mov         ecx,eax
    004015EA   call          004011e0		//<<
    
     
    #1465 BEGINER, 30 Aug 2008
    Last edited: 30 Aug 2008
  6. ExZoD

    ExZoD Member

    Joined:
    4 Jun 2008
    Messages:
    23
    Likes Received:
    6
    Reputations:
    0
    область видимости переменной - это ее свойство, благодаря которому переменные можно делать локальными или глобальными. Если переменная объявлена в теле функции/цикла/условия, то и обращаться к ней можно только внутри тела функции/цикла/условия. Это вполне нормальное поведение для многих ЯП.
    Например, если разработкой программы занимается целый отдел, то сколько человек в своих функциях объявят переменную i для использования в циклах. И надо как эти переменный разделять.
    Еще пример: чтобы было в рекурсивных функциях, не будь у них своей области видимости? толку от них уж точно мало будет.
     
  7. Barttos

    Barttos New Member

    Joined:
    6 Jun 2008
    Messages:
    19
    Likes Received:
    2
    Reputations:
    0
    nerezus, читал ))
    но книга старая...
     
  8. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    После компиляции - это уже бинарник. В каждом компилере он свой и т.д.
    Тем более чтот я не знаю асм в достаточной степени, чтобы его так легко читать.
    Я вообще веб-программист)

    Просто я сказал факт. И мои слова подтвердил код(см. мой пример) и ошибка компилятора.
     
  9. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    BEGINNER, это просто одно из правил С++, которое облегчает жизнь. Просто такое джентельменской соглашение. Это все равно что закрытые члены класса. Вроде как они закрыты, однако если провести фокус с указателями, то можно спокойно получить к ним доступ.
    Вы продемонстрировали исходник на асме. Используется регистр Ebp, которые работает со стеком. В данном коде очень мало переменных, а если их будет больше? Кто даст гарантию, что Х будет все время находится именно по этому адресу? Может компилятор решит на его место записать что-то другое и что дальше произойдет? Правильно, Х перестанет существовать. Зачем хранить уже не нужные переменные?
     
  10. cylaaaan

    cylaaaan Elder - Старейшина

    Joined:
    31 Aug 2006
    Messages:
    0
    Likes Received:
    44
    Reputations:
    8
    как в с++ разделить 127.0.0.1:8080 в массив

    к примеру на php:
    $address = "127.0.0.1:8080";
    $array = explode(":", $address);
    echo $array[0]." - ".$array[1];

    и как сделать на си++ примерно так (php):
    foreach($array as $key => $value)
    echo $key." ".$value."\n";
     
  11. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    Code:
    // test.cpp : Defines the entry point for the console application.
    //
    #include <iostream>
    #include <cstdlib>
    #include <fstream>
    #include <string>
    #include <vector>
    #include "stdafx.h"
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	vector<string> vectIP;
    	vector<string> vectPort;
    	string strValues;
    	fstream File("c:\\proxies.txt");
    	
    	while (!File.eof())
    	{
    		getline(File, strValues, ':');
    		vectIP.push_back(strValues);
    		getline(File, strValues, '\n');
    		vectPort.push_back(strValues);
    	}
    
    	for (unsigned int i = 0;i < vectIP.size();++i)
    	{
    		cout << vectIP[i] << ":" << vectPort[i] << endl;
    	}
    	
    	File.close();
    	system("pause");
    	return 0;
    }
    
    Это для файла.

    Если у тебя строка, то тут проще.
    Code:
    // test.cpp : Defines the entry point for the console application.
    //
    #include <iostream>
    #include <cstdlib>
    #include <string>
    #include "stdafx.h"
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	string strSomething = "127.0.0.1:8808";
    	int nPos            = strSomething.find(':');
    	string strIP        = strSomething.substr(0, nPos);
    	string strPort      = strSomething.substr(nPos+1);
    
    	cout << strIP << ":" << strPort << endl;
    	system("pause");
    	return 0;
    }
    
     
    #1471 4p3, 31 Aug 2008
    Last edited: 31 Aug 2008
  12. 4y4o

    4y4o Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    40
    Likes Received:
    2
    Reputations:
    0
    #include "stdafx.h"
    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main()
    {
    float nomwet = 0, nachbal = 0, rashod = 0, prihod = 0, predel = 0, newbal = 0;
    while (nomwet != -1)
    {cout << "Vvedite nomer weta (ili -1): ";
    cin >> nomwet;
    cout << "Vvedite na4alniu balans: ";
    cin >> nachbal;
    cout << "Vvedite symmy rashodov: ";
    cin >> rashod;
    cout << "Vvedite symmy prihoda: ";
    cin >> prihod;
    cout << "Vvedite predel kredita: ";
    cin >> predel;
    cout << "HOMEP WETA: " << nomwet << endl;
    newbal = nachbal + rashod - prihod;
    cout << "Balans: " << newbal << endl;
    if (newbal > predel)
    cout << "PREDEL PREVUWEN!!!\n";}
    return 0;
    }

    Почему после ввода -1 цыкл сразу не прерывается а требует ввода всех остальных данных и только тогда прерывается?
     
  13. Smapt

    Smapt Elder - Старейшина

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Всё правильно, цикл сразу должен дойти до конца, после чего ин проверит nomwet и если она равна -1 завершится.


    Ппробуй что-нить в этом роде:
    Code:
    #include "stdafx.h"
    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main()
    {
    float nomwet = 0, nachbal = 0, rashod = 0, prihod = 0, predel = 0, newbal = 0;
    while (1)
    {cout << "Vvedite nomer weta (ili -1): ";
    cin >> nomwet;
    
    if (nomwet==-1) 
    {
    getchar();
    return 0;
    }
    
    cout << "Vvedite na4alniu balans: ";
    cin >> nachbal;
    cout << "Vvedite symmy rashodov: ";
    cin >> rashod;
    cout << "Vvedite symmy prihoda: ";
    cin >> prihod;
    cout << "Vvedite predel kredita: ";
    cin >> predel;
    cout << "HOMEP WETA: " << nomwet << endl;
    newbal = nachbal + rashod - prihod;
    cout << "Balans: " << newbal << endl;
    if (newbal > predel)
    cout << "PREDEL PREVUWEN!!!\n";}
    return 0;
    }
    
     
    #1473 Smapt, 31 Aug 2008
    Last edited: 31 Aug 2008
  14. 4y4o

    4y4o Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    40
    Likes Received:
    2
    Reputations:
    0
    как зделать чтобы при nomwet = -1 цыкл сразу завершился?
     
  15. ExZoD

    ExZoD Member

    Joined:
    4 Jun 2008
    Messages:
    23
    Likes Received:
    6
    Reputations:
    0
    Code:
    if (nomwet == -1) break;
     
  16. 4y4o

    4y4o Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    40
    Likes Received:
    2
    Reputations:
    0
    Господа как сравнить десять введённый чисел? Только if? или можна по другому?
     
  17. UnPazz

    UnPazz Elder - Старейшина

    Joined:
    30 Aug 2008
    Messages:
    95
    Likes Received:
    43
    Reputations:
    6
    для чего сравнивать? в сортировке используется сравнение? Сортировки разные есть - по разному можно сравнивать 10 чисел - почти всегда только if используется, но иногда нет.
    Например, вот алгоритм сортировки Шелла :

    Напиши, подробнее что нужно.
     
    1 person likes this.
  18. 4y4o

    4y4o Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    40
    Likes Received:
    2
    Reputations:
    0
    ох ты )) Извени. во первых С++, во вторых вводим десять чисел и нада определить большее из них.
     
    #1478 4y4o, 1 Sep 2008
    Last edited: 1 Sep 2008
    1 person likes this.
  19. Smapt

    Smapt Elder - Старейшина

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    _http://ru.wikibooks.org/wiki/Язык_Си_в_примерах/Сортировка

    почтай, должно помочь)
     
  20. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    Юзайте #include <algorithm>

    Изобретение велосипеда, это не true

    Code:
    // test.cpp : Defines the entry point for the console application.
    //
    #include <iostream>
    #include <cstdlib>
    #include <algorithm>
    #include "stdafx.h"
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	const int nSize = 10;
    	int nArray[nSize];
    
    	for (int i = 0;i < nSize;++i)
    		cin >> nArray[i];
    	cout << *std::max_element(nArray, &nArray[10]) << endl;//дадада именно на 11 элемент. Это же итераторы
    	system("pause");
    	return 0;
    }
     
Thread Status:
Not open for further replies.