Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > структуры


Автор: Веталька 9.3.2009, 12:58
елементарный и смешной вопрос: почему вместо букв выводит символы? и как ето исправить?
Код

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define KST  25


void main()

{
    struct student {                                                                    
    char name [35] ;
    char grup[10];
    long number;  

    } 
           starr[KST],    stud;
    int   k,    kst;
    double inrating;
    clrscr();
    cout<<"kl";
    cin>>kst;
    getchar();
    cout<<"\ndani: ";
        for(k=0;  k<kst;  k++) {
          cout<<"name ";
          cin>>starr[k].name;
          cout<<"grup: ";
           gets ( (starr+k) -> grup) ;
          cout<<"nom st bilet: ";
          cin>>starr[k].number;
        
          getchar();
      }
        for(k=0;  k<kst;  k++);
            { cout<<starr[k].name<<"\n"<<starr+k<<"\n"<<starr[k].number;
                }
   getch();
   }




извинити за невыровняный код

Автор: mes 9.3.2009, 13:39
нельзя ли точней указать какой именно вывод Вам не нравится ?
судя по коду буквами должны выводится только name и grup. Это они у Вас цифрами выводятся или Вы в другом месте букв ожидали ?

Автор: azesmcar 9.3.2009, 13:41
позвольте немного его подправить..
Код

#include <iostream>
#include <string>

int main()
{
    struct student
    {
        std::string name;
        std::string group;
        long number;  
    };

    int no = 0;
    std::cout << "Number of records: ";
    std::cin >> no;

    student *studentArray = new student[no];

    for(int i = 0; i < no; ++i)
    {
        //ignore white-space
        std::cin.ignore(1);
        // input name
        std::cout << "Record[" << i << "].name = ";
        getline(std::cin, studentArray[i].name);
        // input group
        std::cout << "Record[" << i << "].group = ";
        getline(std::cin, studentArray[i].group);
        // input number
        std::cout << "Record[" << i << "].number = ";
        std::cin >> studentArray[i].number;
    }

    for(int i = 0; i < no; ++i)
    {
        std::cout << studentArray[i].name << "\n" << studentArray[i].group << "\n" << studentArray[i].number << std::endl;
    }

    delete [] studentArray;
}



несколько замечаний
1. iostream.h, conio.h и подобные заголовочные файлы давно устарели, если используете cin, cout - включате iostream. И далее using namespace std или как у меня написано.
2. Сохраняйте стиль, если вы написали cin>>starr[k].name, то не надо далее писать gets ( (starr+k) -> grup).
3. clrscr - немного нестандартная функция. Во многих компиляторах ее нет.
4. Зачем создавать массив с запасом на 25 штук, если можно создавать динамически.
5. У вас если в имени есть пробел, код будет работать неверно, используйте getline

P.S. По моему ерунда тут выводится, я не пробовал но тут явно ошибка
cout<<starr[k].name<<"\n"<<starr+k<<"\n"<<starr[k].number;

starr+k - указатель на структуру который вы пытаетесь вывести.

Добавлено через 5 минут и 35 секунд
да, и главная ошибка тут
Цитата

for(k=0;  k<kst;  k++);


точку с запятой уберите... smile а то цикл не работает

Автор: Albor 9.3.2009, 13:52
Цитата(azesmcar @  9.3.2009,  12:41 Найти цитируемый пост)
точку с запятой уберите...  а то цикл не работает

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

Автор: azesmcar 9.3.2009, 13:53
Цитата

Цикл-то работает, только следующий вывод из-за пределов массива, потому и печатается ерунда. 


ладно, выражусь иначе - работает впустую. smile

Автор: Веталька 9.3.2009, 13:57
Цитата(mes @ 9.3.2009,  13:39)
нельзя ли точней указать какой именно вывод Вам не нравится ?
судя по коду буквами должны выводится только name и grup. Это они у Вас цифрами выводятся или Вы в другом месте букв ожидали ?

Выводятся эроглифы

Добавлено через 1 минуту и 3 секунды
Цитата(azesmcar @ 9.3.2009,  13:41)
позвольте немного его подправить..
Код

#include <iostream>
#include <string>

int main()
{
    struct student
    {
        std::string name;
        std::string group;
        long number;  
    };

    int no = 0;
    std::cout << "Number of records: ";
    std::cin >> no;

    student *studentArray = new student[no];

    for(int i = 0; i < no; ++i)
    {
        //ignore white-space
        std::cin.ignore(1);
        // input name
        std::cout << "Record[" << i << "].name = ";
        getline(std::cin, studentArray[i].name);
        // input group
        std::cout << "Record[" << i << "].group = ";
        getline(std::cin, studentArray[i].group);
        // input number
        std::cout << "Record[" << i << "].number = ";
        std::cin >> studentArray[i].number;
    }

    for(int i = 0; i < no; ++i)
    {
        std::cout << studentArray[i].name << "\n" << studentArray[i].group << "\n" << studentArray[i].number << std::endl;
    }

    delete [] studentArray;
}



несколько замечаний
1. iostream.h, conio.h и подобные заголовочные файлы давно устарели, если используете cin, cout - включате iostream. И далее using namespace std или как у меня написано.
2. Сохраняйте стиль, если вы написали cin>>starr[k].name, то не надо далее писать gets ( (starr+k) -> grup).
3. clrscr - немного нестандартная функция. Во многих компиляторах ее нет.
4. Зачем создавать массив с запасом на 25 штук, если можно создавать динамически.
5. У вас если в имени есть пробел, код будет работать неверно, используйте getline

P.S. По моему ерунда тут выводится, я не пробовал но тут явно ошибка
cout<<starr[k].name<<"\n"<<starr+k<<"\n"<<starr[k].number;

starr+k - указатель на структуру который вы пытаетесь вывести.

Добавлено @ 13:46
да, и главная ошибка тут
Цитата

for(k=0;  k<kst;  k++);


точку с запятой уберите... smile а то цикл не работает

а можно поинтирисоватся ?
под какой компилятор етот код?

Автор: azesmcar 9.3.2009, 14:03
Цитата

а можно поинтирисоватся ?
под какой компилятор етот код? 


под любой нормальный

Добавлено через 3 минуты и 32 секунды
примечание: код может не компилироватся под Visual Studio 6. В этом случае выведите декларацию
int i = 0 в main.

Автор: Веталька 9.3.2009, 14:14
Цитата(azesmcar @ 9.3.2009,  14:03)
Цитата

а можно поинтирисоватся ?
под какой компилятор етот код? 


под любой нормальный

Добавлено @ 14:07
примечание: код может не компилироватся под Visual Studio 6. В этом случае выведите декларацию
int i = 0 в main.

а как ето дело в ВС3.1  запустить?

Автор: azesmcar 9.3.2009, 14:23
Цитата

а как ето дело в ВС3.1  запустить?


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

я бы посоветовал скачать нормальный компилятор

вот парочка

http://www.mingw.org/
http://www.microsoft.com/express/vc/

Автор: Веталька 9.3.2009, 14:30
то что ето древность я  прекрано понимаю,  но заставляют пока работать только с ним, нормальные компиляторы у меня есть,
ошибки он выдает неачиная с подключения библиотек и до самого конца кода, думаю буду со своим неправильным долбатца, там действително если точку с запятой убрать все нормально выводит

Автор: azesmcar 9.3.2009, 14:40
Цитата

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


ну желаю успехов..нас тоже в институе заставляли на борланде писать smile я тогда к нему даже привык..

если вопрос решен пометьте как решенный пожалуйста.

Автор: zim22 9.3.2009, 14:53
Цитата(azesmcar @  9.3.2009,  13:41 Найти цитируемый пост)
std::cin.ignore(1);

если закомментировать эту строчку, то первый getline не отработает. вместо этого выведется два cout в одной строке.
azesmcar, объясните пожалуйста, какую сакральную функцию играет эта строка в программе?

Автор: Веталька 9.3.2009, 15:10
Цитата(azesmcar @ 9.3.2009,  14:40)


ну желаю успехов..нас тоже в институе заставляли на борланде писать smile я тогда к нему даже привык..

если вопрос решен пометьте как решенный пожалуйста.

пасибо, нас на борланде не заставляют писать, нам запрещают писать на чем либо другом

Автор: azesmcar 9.3.2009, 15:16
функция ignore убирает из потока переданный вторым параметром символ n-ое количество раз.

код
Код

std::cin.ignore();


уберет 1 char_traits<char>::eof() из потока, что позволит getline прочитать из cin новую строку. Надеюсь нормально обяснил?

Добавлено @ 15:19
если не игнорировать, выходит как будто вы ввели пустую строку. следовательно программа продолжает работать дальше (если можно так выразится smile )

Цитата

пасибо, нас на борланде не заставляют писать, нам запрещают писать на чем либо другом


гуманно smile
Оффтоп:
Бог создал Еву, подвел ее к Адаму и сказал - выбирай...вот так появилась демократия

Автор: Dem_max 9.3.2009, 15:20
Оригинальное решение  starr+k

Автор: zim22 9.3.2009, 15:48
Цитата(azesmcar @  9.3.2009,  15:16 Найти цитируемый пост)
Надеюсь нормально обяснил?

вполне.  smile 

Автор: Веталька 9.3.2009, 16:56
Цитата(azesmcar @ 9.3.2009,  15:16)

Бог создал Еву, подвел ее к Адаму и сказал - выбирай...вот так появилась демократия

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)