0 / 0 / 0
Регистрация: 02.02.2018
Сообщений: 3

Не работает программа

02.02.2018, 23:31. Показов 1568. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача:Известны оценки каждого студента из группы по экзамену, Определить количество студентов группы, получивших на экзамене двойку.
Программа не выдает кол-во двоек, вот код программы. Был бы рад если бы кто помог)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "stdafx.h"
#include <iostream>
#include <clocale>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE, "rus");
    int n;
    int r;
    int s=0;
    cout<< "Введите кол-во студентов: ";
    cin>>n;
    int *a = new int[n];
    for(int i=0;i<n;i++)
    {
        r =2 + rand()% 4;
        a[n] = r;
        cout<<a[n]<<endl;
    }
    
    for(int i=0;i<n;i++)
       if(r==2)
       s=s++;
    cout<<"Кол-во студентов получивших двойку "<<s<<endl;
    
    system ("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2018, 23:31
Ответы с готовыми решениями:

Программа , которая выводит время, за которое программа работает
Вообщем, нужно что бы считалось время от начала работы программы, и выводилось на экран.

Почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает
почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает. Имею в ввиду что сделал прогу которая меняет...

Программа работает на Delphi 2007 или более ранней но не работает на старших версиях (10.1 например)
В программе используются дополнительные файлы и dll написанные на fortran их кода нет ;( в ранних вернсиях все хорошо, в старшей 10.1 или...

39
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
03.02.2018, 12:56
Студворк — интернет-сервис помощи студентам
Avaddon74,
a = i++ тогда равносильно a = i = i + 1 будет, что однозначно не так. И постфиксный икремент имеет более высокий приоритет, чем присвоение. Я вам больше скажу, у него приоритет выше, чем у префиксного.

Добавлено через 2 минуты
То есть --x++ это --(x++), а не (--x)++. По этой причине кстати --x++, как правило (если кто-то не сделает контринтуитивную перегрузку), не является валидной операцией, так как x++ не возвращает lvalue (значение, куда можно присвоить).
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.02.2018, 13:09
Цитата Сообщение от alex white Посмотреть сообщение
Я вам больше скажу, у него приоритет выше, чем у префиксного.
Вот вам для проверки у кого выше приоритет
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main(){
    int a(5);
 
    std::cout << a++ << std::endl;
    std::cout << ++a << std::endl;
 
    return 0;
}
Добавлено через 3 минуты
Таблица приоритетов
https://ravesli.com/urok-38-pr... iativnost/
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
03.02.2018, 13:12
Avaddon74,
при чём здесь приоритет?
В таблице, как я и сказал.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.02.2018, 13:30
alex white, Понял свою ошибку, я ещё забыл про ассоциативность и с приоритетами напутал, для меня почему-то "чем выше" показалось что относится к номеру приоритета.

Добавлено через 7 минут
А почему тогда эта конструкция:
C++
1
2
3
4
5
int a[5]{1,2,3,4};
    int x = 0;
 
    std::cout << a[x++] << std::endl;
    std::cout << a[++x] << std::endl;
возвращает:
1
3
ведь приоритет преинкремента ниже чем у оператора индекса массива?
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
03.02.2018, 13:33
Цитата Сообщение от Avaddon74 Посмотреть сообщение
ведь приоритет преинкремента ниже чем у оператора индекса массива?
Ниже.
Поэтому --a[i] это --(a[i]), а не (--a)[i].
Но тут то преинкремент - подвыражение операции индекса. А подвыражение этой операции в любом случае выполняется раньше, чем сама операция, хоть присвоение туда пихайте (a[x = x + 1])
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.02.2018, 13:39
Цитата Сообщение от alex white Посмотреть сообщение
А подвыражение этой операции в любом случае выполняется раньше
тогда почему здесь
C++
1
std::cout << a[x++] << std::endl;
Выводится 1 а не 2, ведь пост-инкремент тоже выражение при чем даже с равным приоритетом по отношению к индексу?
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
03.02.2018, 13:53
Avaddon74, потому что x++ возвращает оригинальное значение x, а не x + 1, несмотря на то, что x меняется.
t = x; x = x + 1; return t; - примерно так бы выглядела функция, выполняющая аналогичные действия.
1
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.02.2018, 14:05
alex white, хорошо, т.е.
x++ это t = x; x = x + 1; return t;
а ++x это x = x + 1; return x;
А приоритет у пре-инкремента ниже, я тогда логику не понимаю, должно быть наоборот, если приоритет ниже, тогда сначала возвращает, а потом инкрементирует, а в пост-инкременте должно быть сначала инкрементирует, а потом возвращает

Добавлено через 2 минуты
До этого все было логично, пока я думал что пост-инкремент ниже по приоритету чем пре-инкремент, теперь не логично ))
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
03.02.2018, 14:09
Avaddon74, приоритет здесь вообще не причём, приоритет - это правило построения деревьев операции (операндами операций с низким приоритетом являются операции более высокого приоритета), по сути - неявные скобки.
Трудно понять, что вы пишете, но такое ощущение, будто вы расцепляете операцию на части, происходящие в разное время ("сначала возвращает, а потом инкрементирует" - нет, именно сначала инкрементирует, потом возвращает, вопрос в том, ЧТО он возвращает).
1
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
03.02.2018, 14:09
Avaddon74, дело в том, что инкременты/декременты стоит расценивать как обычные функции-опреаторы, коими они и являются, например, напишите класс и перегрузите эти операторы, а ещё лучше, для наглядности, вместо перегрузки опреаторов напишите обычные функции, которые будут выполнять работу операторов, и всё встанет на свои места. Например:
C++
1
2
3
4
5
6
7
8
9
10
int postInc(int& n) { // постинкремент
   int temp = n;
   n = n + 1;
   return temp;
}
 
int preInc(int& n) { // преинкремен 
   n = n + 1;
   return n;
}
Так вот, a[x++] и a[++x] равносильны: a[postInc(x)] и a[preInc(x)]
и в ваш код сверху соответственно превратиться в:
C++
1
2
3
4
5
int a[5]{1,2,3,4};
    int x = 0;
 
    std::cout << a[postInc(x)] << std::endl;
    std::cout << a[preInc(x)] << std::endl;
абсолютно не важно кто там в каком порядке по приоритету исполняется, функция может вернуть только то, что в теле у неё написано в return
1
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.02.2018, 14:15
Lambont, alex white, Понял, спасибо!
Я просто раньше думал, что от приоритета зависит, типа:
у = приоритет выше чем у a++ Поэтому сначала присваивается а потом инкрементируется, а у ++a приоритет выше чем у = поэтому сначала инкрементируется, потом присваивается.
Сейчас понял.
0
03.02.2018, 14:26

Не по теме:

Кстати, так же из этого примера видно логику того "проклятого" выражения n = n++; :D

0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.02.2018, 14:35
У меня и так и этак инкрементирует
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main(){
    int a(0);
 
    std::cout << a << std::endl;
    a = a++;
    std::cout << a << std::endl;
    a = ++a;
    std::cout << a << std::endl;
 
    return 0;
}
Вывод:
0
1
2

Добавлено через 5 минут
А вот если с функциями:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
int postInc(int& n) { // постинкремент
    int temp = n;
    n = n + 1;
    return temp;
}
 
int preInc(int& n) { // преинкремен 
    n = n + 1;
    return n;
}
 
int main(){
    int a(0);
 
    std::cout << a << std::endl;
    a = postInc(a);
    std::cout << a << std::endl;
    a = preInc(a);
    std::cout << a << std::endl;
 
    return 0;
}
тогда вывод:
0
0
1
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
03.02.2018, 14:36
Цитата Сообщение от Avaddon74
У меня и так и этак инкрементирует
Вооот, что и не является правильным
Это ведь вы в студии компилировали?
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.02.2018, 14:37
Цитата Сообщение от Lambont Посмотреть сообщение
Это ведь вы в студии компилировали?
Да, VS2015
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
03.02.2018, 14:48
Avaddon74, вот, а в нестудии, например, тут всё как и должно быть
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.02.2018, 14:54
Lambont, Может из-за каких-то ключей?
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
03.02.2018, 15:49
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Может из-за каких-то ключей?
Даже не знаю, но вот, если пробежаться отладчиком и посмотреть дизасмовый код, то студия (ну по крайней мере 2015) в debug сборке без оптимизаций выражение a = a++; скомпилирует вот так:
Assembler
1
2
3
4
5
mov         eax,dword ptr [a]  
mov         dword ptr [a],eax  
mov         ecx,dword ptr [a]  
add         ecx,1  
mov         dword ptr [a],ecx
И вот, к примеру, так же b = i++;:
Assembler
1
2
3
4
5
mov         eax,dword ptr [i]  
mov         dword ptr [b],eax  
mov         ecx,dword ptr [i]  
add         ecx,1  
mov         dword ptr [i],ecx
То есть, студия (ну по крайней мере 2015) генерит именно такой псевдокод:
a = a++; => a = a; a = a + 1;
b = i++; => b = i; i = i + 1;
То есть она со встроенными типами обходится "по своему", и сначала присваивает старое значение и только потом инкриминирует, что в свою очередь выглядит очень странно

Добавлено через 11 минут
С другой стороны, студия тупо экономит лишнее временное хранилище, и разрабы компилятора у студии, скорей всего понимают, что человек, который будет на полном серьёзе использовать a = a++; находится в крайнем неадеквате, а по сему так никто нормальный писать не будет
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.02.2018, 15:49
Lambont, а как в другом компиляторе выглядит этот код на ассемблере?
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
03.02.2018, 16:19
Цитата Сообщение от Avaddon74 Посмотреть сообщение
а как в другом компиляторе выглядит этот код на ассемблере?
К сожалению под рукой их сейчас нет, чтобы проверить, но скорей всего должны как-то примерно так:
a = a++;
Assembler
1
2
3
4
5
mov         eax,dword ptr [a]  
mov         ecx,dword ptr [a]  
add         ecx,1  
mov         dword ptr [a],ecx
mov         dword ptr [a],eax
b = i++;
Assembler
1
2
3
4
5
mov         eax,dword ptr [i]  
mov         ecx,dword ptr [i]  
add         ecx,1  
mov         dword ptr [i],ecx
mov         dword ptr [b],eax
Хотя тут экономии всё равно никакой у студии не будет, так что скорей всего это просто её "прихоть"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2018, 16:19
Помогаю со студенческими работами здесь

не пойму в чем дело, программа должна работать, но она черт побери не работает :( (программа по работе с реестром)
Программа предназначена для поиска какого-нить слова по реестру и удаления ключа или раздела если в нем встречается искомое слово. С...

После AVZ не работает программа Credo Межевой план автоматически закрывается и не работает цифровая подпись
После AVZ не работает программа Credo Межевой план автоматически закрывается и не работает цифровая подпись. Помогите пожалуйста!

Программа не работает правильно. Программа должна брать значения из файла Avto_a.accdb из третьих столбцов таблицы TOYOT
Программа не работает правильно. Программа должна брать значения из файла Avto_a.accdb из третьих столбцов таблицы TOYOTA_95_TS18.csv,...

Программа работает в отладке, но не работает в скомпилированном виде
Доброго времени суток. Появилась не предвиденная проблема :( Не получается разобраться, поскольку в отладчике все летает без ошибок. А...

Программа работает в консоли xp, но не работает в dosbox в 7ке
Добрый день, проблему описал в заголовке, код: .286 DSEG SEGMENT STR_ALRLOADED db 'is unloaded ', 13, 10, '$' ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru