Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]где ошибка программы


Автор: Randol 25.6.2007, 21:08
вообщем дело такое;
начал изучать С++ сомастоятельно. на учебнике было задания найти средную оценку класса,  надо начинать ввести оценки студентов и для оканчаний надо вести -1 и тем самым закочить ввести оценки и вывести средную оценку класса
 на книге было написона так
 
Код
#include<iostream.h>
#include<iomanip.h>
main ()
{
    float average;
    int counter, grade, total;
    total=0;
    counter=0;

    cout << "vedite ocenku ili -1 dlya zoversheniya:";
    cin >> grade;

    while (grade!=-1); {
        total=total+grade;
        counter=counter+1;
    cout << "vedite ocenku ili -1 dlya zoversheniya:";
    cin >> grade;
    }
    if (counter!=0) {
        average= (float)total/counter;
        cout << "srednee znacheniya rovna " <<setprecision (2)
        << setiosflags (ios::fixed | ios::showpoint)
        << average<<endl;
    }
    else 
        cout << "ocenki ne vedeny" <<endl;
        return 0;
    }



(я написал на visual C++ ) жму ctrl+F5 появляется окошка который ведется толька одна оценка, затем enter и ничего больше
подскажите пожалоста в чем ошибка и помагите исправить её

Автор: DigitSphinx 25.6.2007, 21:26
Код

while (grade!=-1); {
        total=total+grade;
        counter=counter+1;
    cout << "vedite ocenku ili -1 dlya zoversheniya:";
    cin >> grade;
    }

Убери точку с запятой !
У тебя получился бесконечный цикл !

Автор: DigitSphinx 25.6.2007, 22:13
Если нет других вопросов по программе , пометь тему как решенную (это сверху кнопочка такая )

Автор: Randol 26.6.2007, 17:07
ок спосиба.
теперь вопрос такой;
надо написать программу которую считает результаты сдачи эгзамена
1 для отметки здачи, 2 для отметки нездачи 
Код
#include <iostream.h>
main ()
{
    int passes=0, fail=0, student=1, result;
    while (student<=10) {
        cout<< "vedite rezultat (1 zdal 2 nezdal)";
        cin>> result;
        if (result==1)
            passes=passes+1;
        else
            fail=fail+1;
        student=student+1;
    }
    cout<< "zdali "<<passes<<endl;
    cout<< "ne zdali "<<fail<<endl;
    if ( passes>8)
        cout<< "povysit oplatu"<<endl;
    return 0;
}



теперь я хотелбы изменить и добавить такие условия
если вести другие цифры кроме 1 или 2 то вывемти сообщения чтота вроде вы вели другие цифры
как это сделать ?

Автор: DigitSphinx 26.6.2007, 18:36
Цикл будет такой
Код

while (student<=10) 
{
        cout<< "vedite rezultat (1 zdal 2 nezdal)";
        cin >> result;
        if (result==1)
            passes++;
        else if (result == 2)
            fail++;
        else 
        {
            cout << "Error" << endl;
            continue;
        }
        student++;
}


Автор: Xenon 26.6.2007, 19:37
Так очевиднее smile
Код

while(student <= 10)
{
    cout << "Vvedite rezultat: 1 - sdal, 2 - ne sdal";
    cin >> result;
    switch(result)
    {
    case 1: ++passes; break;
    case 2: --fails; break;
    default: cout << "Error" << endl; continue;
    }
    ++student;
}

Автор: DigitSphinx 26.6.2007, 20:21
Xenon, 
Есть еще очень много способов !
Но человек начинающий а ты ему switch , ++passes   smile 
Кстати что --fails значит ??  smile

Добавлено через 1 минуту и 16 секунд
У тебя может получится количество не сдавших -3  smile  что не есть хорошо  smile  smile 

Автор: Xenon 26.6.2007, 20:39
Модератор: Сообщение скрыто.

Автор: Randol 12.7.2007, 17:26
задача такая;
надо наисать программу которая ведется сторона квадрата и затем ресует "*" символом квадрат.

Код
#include <iostream.h>
#include <iomanip.h>
main()
{
    int row=1, row1=1,a, column=1;
    cout <<"vedite storonu ";
    cin >> a;
    while ( row <a) {
        ++row;
        cout << "*";}
    while ( column <a) {
        ++column;
        cout << "*"<< setw(a-1) << "*" <<endl;
    }
    while (row1<=a) {
        ++row1;
        cout << "*" ;}
    cout<<endl;
    
    return 0;
}

программу я написал. но когда она запускается вместе с квадратом из звездачек "*" верху с правой стороны появляется еще одна "*".
отступ между квадратом и лишной звездачкой меняется зависимости стороны заданной квадрата.
подскажите пожалоста где ошибка программы.

Автор: bsa 12.7.2007, 17:41
Если честно, не понял. Вводится длина стороны?
С форами было бы намного понятней:
Код
#include <iostream>
#include <iomanip>
using namespace std;
main()
{
    int a;
    cout <<"vedite dlinu storony: ";
    cin >> a;
    for(int i = 0; i < a; ++i)
        cout << "*";
    cout<<endl;
    for(int i = 0; i < a-2; ++i)
        cout << "*"<< setw(a-1) << "*" << setw(1) <<endl;
    for(int i = 0; i < a; ++i)
        cout << "*";
    cout<<endl;
    
    return 0;
}
А проблема со звездочкой была из-за того, что ты не сделал конец строки после рисования горизонтальной стороны.

Автор: JackYF 12.7.2007, 17:43
Вот, переделал немного:
Код

#include <iostream.h>
#include <iomanip.h>
int main()
{
   int row=1, row1=1,a, column=1;
   cout <<"vedite storonu ";
   cin >> a;
   while ( row <=a) {
      ++row;
      cout << "*";
   }
   cout << "\n";
   while ( column <a-1) {
      ++column;
      cout << "*"<< setw(a-1) << "*" <<endl;
   }
   while (row1<=a) {
      ++row1;
      cout << "*" ;
   }
   cout<<endl;

   return 0;
}


Автор: Randol 14.7.2007, 13:34
ясно, спосибо.
и вот еще:
некак немогу написать программу которую печатает триугольник из "*".  Чтота вроде такого

*
**
***
****
*****
******

если нетрудно подскажите как надо сделать или напишите ее цикл.

Автор: Dov 14.7.2007, 13:48
Код

void Triangle(int n)
{
    if(n > 1)
        Triangle(n - 1);
    for(int i = 0; i < n; i++)
        cout << '*';
    cout << endl;
}

int main()
{
    Triangle(6);

    return 0;
}

Автор: Randol 19.7.2007, 11:45
всем спасибо за помощ.
потскажите пожалоста как будет оператор который будет печатать случайно выбронное число из набора.
набор дапустим может бать такой: 2, 4, 6, 8,10.

Автор: bsa 19.7.2007, 11:58
Код
#include <stdlib.h>
...
array[(int) (array_size * (rand() / (RAND_MAX + 1.0)))];
где array - это "набор" (массив значений)
array_size - количество значений в "наборе"

Автор: Randol 19.7.2007, 12:02
а можна написать это без использования массива?

Автор: bsa 19.7.2007, 12:13
random() выдает целые значения от 0 до RAND_MAX. Вот и разминайся.

Автор: Randol 19.7.2007, 19:58
никак немогу написать программу с функций который ведедся баллы студентов и печатаестся оценки. если баллы 100-90 то оценка 5, если 80-89 то 4, 70-79 оценка 3, 60-69 оценка 2.
Код

#include <iostream.h>
int quality (int);
main ()
{
    int ball, student;
    cout << " skolka studentov: ";
    cin >> student;
    for (int a=1; a<=student; a++) {
        cout << "vedite ball studenta: ";
        cin >> ball;
        cout << "ocenka rovna: " << quality(ball);
        cout << endl;
    }
    return 0;
}
quality ( int x)
{
    if ( 90 <=x || x<=100)
        cout << "5";
        if ( 80<=x || x<=89) 
        cout << "4";
        if ( 70<=x || x<=79)
            cout << "3";
            if ( 60<=x || x<=69)
                cout << "2";
        return x;
}



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

Автор: DogStyle 19.7.2007, 20:48
Господа, вы убиваете в человеке талант smile 
А если бы он попросил разжевать Hello World???
Я понимаю вопросы разные бывают, но мне кажется здесь банальная лень!!!! 
Остановите беспредел!!!

Автор: bsa 19.7.2007, 21:26
Готовые программы делаются http://forum.vingrad.ru/forum/Vingrad-help-center.html.

Автор: JackYF 19.7.2007, 23:35
Randol, у функции должно быть возвращаемое значение.
Код

#include <iostream.h>
int quality (int);
main ()
{
    int ball, student;
    cout << " skolka studentov: ";
    cin >> student;
    for (int a=1; a<=student; a++) {
        cout << "vedite ball studenta: ";
        cin >> ball;
        cout << "ocenka rovna: " << quality(ball);
        cout << endl;
    }
    return 0;
}
int quality ( int x)
{
    if ( 90 <=x || x<=100)
    return 5;
    if ( 80<=x || x<=89) 
    return 4;
    if ( 70<=x || x<=79)
    return 3;
    else
        return 2;
}

Автор: zkv 19.7.2007, 23:58
JackYF, пара проверок лишних у тебя  smile 
Код

    if ( 90 <=x || x<=100)
    return 5;
    if ( 80<=x ) 
    return 4;
    if ( 70<=x )
    return 3;
    else
        return 2;

Автор: Randol 30.7.2007, 16:06
нужно выполнить следуйше задачу.
надо прочитать 10 чисел и после того, как прочли очередное число, надо напечатать его, но только втом случее если оно не дублирует ранее прочитонные числа.

вот программа:
Код
#include <iostream.h>
int linesearch(int [], int);
main()
{
    int const size=10;
    int a[size], element, count=0;
    for (int i=0; i<size; i++) {
        count++;
        cout << "vedite mssiv: ";
    cin >> a[i];
    element=linesearch(a, count);
    if (element == 0)
        cout << " "<< endl;
    else
        cout << element << endl;
    }
        return 0;
}
linesearch(int array[], int sizen)
{
    int const son=10;
    int mass[son];
    for (int x=0; x<sizen; x++)
        array[sizen]=mass[x];
    for (int n=0; n<sizen; n++)
        if (array[sizen] != mass[n])
            return n;
        else return 0;
}




немогу выполнить задачу. получается совсем нето что задоно. помагите пожалоста найти ошибку и изменить её.

Автор: bsa 30.7.2007, 16:20
Вообще-то твоя linesearch делает совсем не то, что ты хочешь.
Во-первых, она зачем-то перезаписывает array[sizen] sizen раз (что может быть неправильно, так как sizen может быть равно 10 - размеру массива), в итоге получая array[sizen] = mass[sizen-1], в то время как, массив mass содержит случайные непроинициализированные данные.
Во-вторых, на втором цикле происходит немедленный выход на первой же итерации (т.е. поиска собственно не происходит).
В третьих, тебе надо выводить значение элемента или его индекс? По заданию - значение, а судя по возвращаемому значению linesearch - индекс в массиве.

Автор: Randol 30.7.2007, 17:46
вот, попробовал исправить.

Код
#include <iostream.h>
#include <iomanip.h>
int linesearch(int [], int, int);
main()
{
    int const size=10;
    int a[size], searchkey, element;

    for (int x=0; x<size; x++) {
        cout << "vedite element massiva: ";
        cin >> searchkey;
        a[searchkey];
    element=linesearch(a, searchkey, size);

    if (element ==0)
        cout << setw(26) << " " << endl;
    else
        cout << setw(26) << element << endl;
    }
    return 0;
}
int linesearch(int array[], int key, int sizen)
{
    for (int n=0; n<sizen; n++)
        if (array[n]==key)

            return 0;
    else
        return key;


но все равно неработает.
вчем ошибка?

Автор: Earnest 30.7.2007, 17:49
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: Guedda 31.7.2007, 12:35

M
Guedda
Модератор: Пожалуйста, один топик - один вопрос.
Тему закрываю!

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