Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> структуры, ошибка ввода-вывода 
V
    Опции темы
Веталька
Дата 9.3.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: нет
Всего: 6



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

#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();
   }




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


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
mes
Дата 9.3.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 9.3.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



позвольте немного его подправить..
Код

#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 а то цикл не работает
PM   Вверх
Albor
Дата 9.3.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



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

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

Это сообщение отредактировал(а) Albor - 9.3.2009, 13:53
PM MAIL ICQ   Вверх
azesmcar
Дата 9.3.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

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


ладно, выражусь иначе - работает впустую. smile
PM   Вверх
Веталька
Дата 9.3.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: нет
Всего: 6



Цитата(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 а то цикл не работает

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


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
azesmcar
Дата 9.3.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

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


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

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

PM   Вверх
Веталька
Дата 9.3.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: нет
Всего: 6



Цитата(azesmcar @ 9.3.2009,  14:03)
Цитата

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


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

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

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


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
azesmcar
Дата 9.3.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

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


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

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

вот парочка

http://www.mingw.org/
http://www.microsoft.com/express/vc/
PM   Вверх
Веталька
Дата 9.3.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: нет
Всего: 6



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


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
azesmcar
Дата 9.3.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

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


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

если вопрос решен пометьте как решенный пожалуйста.
PM   Вверх
zim22
Дата 9.3.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



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

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


--------------------
PM MAIL   Вверх
Веталька
Дата 9.3.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: нет
Всего: 6



Цитата(azesmcar @ 9.3.2009,  14:40)


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

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

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


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
azesmcar
Дата 9.3.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



функция ignore убирает из потока переданный вторым параметром символ n-ое количество раз.

код
Код

std::cin.ignore();


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

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

Цитата

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


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

Это сообщение отредактировал(а) azesmcar - 9.3.2009, 15:20
PM   Вверх
Dem_max
Дата 9.3.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Оригинальное решение  starr+k


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0645 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.