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

Странная Зося

30.10.2019, 03:40. Показов 649. Ответов 14

Студворк — интернет-сервис помощи студентам
Задали в универе написать такую программу:

Маленькая Зося прячет свои конфеты в коробочки. Она часто хотела бы знать, сколько в какой находится, но, к сожалению, она еще не умеет считать, поэтому она попросила вас помочь ей. Написать программу, которая ответит на вопрос Зоси: Сколько конфет находится в коробочках, которые стоят между двумя указанными коробочками?

Вход:
Первая строка ввода состоит из одного целого числа x (1 <= x <= 1000) обозначающего количество коробочек. В следующей строке находится x целых чисел, описывающих количество конфет в каждой коробочке - от первого до x-того. Каждая коробочка вмещает максимум 100 конфет.
В следующей строке находится число y (1 <= y <= 1000) запросов Зоси. Следующие y строк содержат по два целых числа a и b (1 <= a <= b <= x), обозначающие коробки, выбранные Зосей.
Выход:
На выходе должны появиться y-линий - каждая должна содержать ровно одно число, которое является ответом на вопрос Зоси, то есть общее количество конфет в коробках, которые стоят между указанными (вместе с содержанием указанных коробок).

Пример:

Вход:
6
1 2 3 4 5 6
4
1 3
2 4
4 4
1 6

Выход:
6
9
4
21

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

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
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int pud, pyt, sum=0;
    scanf("%d", &pud);
    int tabpud[pud-1];
    for (int i=0; i<pud; i++){
        scanf("%d", &tabpud[i]);
    }
    scanf("%d", &pyt);
    int tabpyt[1][pyt-1];
    for (int i=0; i<pyt; i++){
        for(int z=0; z<2; z++){
            scanf("%d", &tabpyt[z][i]);
        }
    }
    for (int i=0; i<pyt; i++){
        for (int z=tabpyt[0][i]; z<=tabpyt[1][i]; z++){
            sum=sum+tabpud[z];
        }
        printf("%d\n", sum);
        sum=0;
    }
    printf("%d", tabpyt[1][1]);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2019, 03:40
Ответы с готовыми решениями:

странная ситуация
Всем привет. не работает данная конструкция. #include &lt;stdio.h&gt; void insert(char *items, int...

Странная(или не странная, незнаю) реакция на буквы, знаки операций
Всем добрый день. Делаю маленькую наработку, пока есть только начало. Ниже код: #include...

Странная кодировка, ну ооочень странная
Всем доброго времени суток! Помогите пожалуйста решить проблему! Вот исходный код проекта:...

Странная функция
Здравствуйте. Кто-нибудь сталкивался с такой функцией. Yi известно....

14
Мозгоправ
1741 / 1035 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
30.10.2019, 20:05 2
Headleex,
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 <stdio.h>
 
int boxes[1000];
 
int main(void) {
 
    int max_box;    // количество коробок
    int max_req;    // количество запросов
    int res;        // количество конфет в коробках (ответ на запрос)
    int begin, end; // начальный и конечный номер коробки в запросе
    int i, j;
    scanf("%d", &max_box);
 
    for (i = 0; i < max_box; ++i)
        scanf("%d", &boxes[i]);
    printf("\n");
 
    scanf("%d", &max_req);
    for (i = 0; i < max_req; ++i) {
        scanf("%d%d", &begin, &end);
        --begin; --end;  // у нас коробки нумеруются с 0
        res = 0;
        for (j = begin; j <= end; ++j)
            res += boxes[j];
        printf("%d\n", res);
    }
 
    return 0;
}
0
из племени тумба-юбма
2438 / 1766 / 412
Регистрация: 29.11.2015
Сообщений: 8,587
Записей в блоге: 15
31.10.2019, 19:38 3
Уважаемый L0M, не сочтите за дерзость, но хочется спросить: почему в большинстве случаев, знающие люди вроде вас, в качестве ответов пишут свой вариант кода, а не исправляют вариант кода от ТС? Ведь ТС гораздо интересней, когда укажут на ошибки в его коде, чем напишут новый вариант. Еще раз повторюсь, это относится не именно к вам, а ко многим людям которые помогают на форуме.
0
Мозгоправ
1741 / 1035 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
31.10.2019, 20:36 4
Цитата Сообщение от мама Стифлера Посмотреть сообщение
почему в большинстве случаев, знающие люди вроде вас, в качестве ответов пишут свой вариант кода, а не исправляют вариант кода от ТС?
Потому что в большинстве случаев проще закрасить, чем от стенки отскребать.

Вот в данном конкретном случае пришлось бы словами описывать преобразование варианта кода ТС в мой вариант. С обоснованием почему это надо сделать так, а не иначе, почему не не так, как это сделано у ТС, и какие альтернативные варианты могут быть. Это много текста. Это много времени. Это бесплатно. И это не интересно.

Но лично я в таких случаях стараюсь оставаться в контексте варианта ТС. Т.е. использовать примерно тот уровень и те возможности языка, которые использовал ТС. Если ТС заинтересован в том, что бы найти свои ошибки и прокачать скилл, то он сравнит варианты решений и если в моём варианте что-то непонятно, то спросит.
1
из племени тумба-юбма
2438 / 1766 / 412
Регистрация: 29.11.2015
Сообщений: 8,587
Записей в блоге: 15
01.11.2019, 02:05 5
Все таки я поковырялся и смог разобраться в причине неправильного расчета.
1. строка 12 int tabpyt[1][pyt-1], должно быть int tabpyt[2][pyt]
Сразу хочется сказать, что массивы так не объявляют через переменные, да программа работает, но это не правильно. При объявлении нужно всегда указать конкретный размер, чтоб выделить память под массив ровно столько, сколько необходимо. Поэтому читайте темы про динамические массивы.
2. строка 20 sum=sum+tabpud[z], должно бытть sum=sum+tabpud[z-1]
Еще по поводу многократного объявления переменной внутри цикла - это просто лишнее. Можно так делать, если переменная задействована один раз и в других циклах не встречается. А в данном случае, такие пременные объявляются в начале программы.
0
Заблокирован
02.11.2019, 17:05 6
Цитата Сообщение от мама Стифлера Посмотреть сообщение
знающие люди вроде вас, в качестве ответов пишут свой вариант кода, а не исправляют вариант кода от ТС?
Потому что никто не хочет читать и разбирать чужой код. Проще по заданию написать свой вариант.
Если код хоть сколько-нибудь длинный, то 99% на то, что никто тебе тут не поможет.
0
из племени тумба-юбма
2438 / 1766 / 412
Регистрация: 29.11.2015
Сообщений: 8,587
Записей в блоге: 15
02.11.2019, 17:47 7
sodda, я это все понимаю, что легче написать свой код, чем разбирать чужой. Но просто не всем ТС интересен чужой вариант. Вот например для меня было бы интересней, если бы указывали ошибки в моем варианте, чем просто написали мне новый рабочий вариант. А кому то совсем без разницы, главное чтобы работало.
0
Заблокирован
02.11.2019, 17:58 8
Цитата Сообщение от мама Стифлера Посмотреть сообщение
sodda, я это все понимаю, что легче написать свой код, чем разбирать чужой. Но просто не всем ТС интересен чужой вариант. Вот например для меня было бы интересней, если бы указывали ошибки в моем варианте, чем просто написали мне новый рабочий вариант. А кому то совсем без разницы, главное чтобы работало.
Это понятно. Вопрос был о другом)
0
Мозгоправ
1741 / 1035 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
02.11.2019, 19:58 9
Цитата Сообщение от sodda Посмотреть сообщение
Потому что никто не хочет читать и разбирать чужой код. <...> Если код хоть сколько-нибудь длинный, то 99% на то, что никто тебе тут не поможет.
Неправда ваша.

Тут вопрос скорее в качестве кода. Если код говно, больше в логическом смысле, чем в техническом, то да, ф топку. Если код нормальный (ну ошибся где-то человек, или что-то не понимает), то почему не помочь?

И, одно дело, когда надо поправить пару строк, ну или одну функцию, а другое, когда надо править практически каждую строку.

Цитата Сообщение от мама Стифлера Посмотреть сообщение
Вот например для меня было бы интересней, если бы указывали ошибки в моем варианте, чем просто написали мне новый рабочий вариант.
И здесь вопрос в качестве кода.

Ещё есть психологический аспект вопроса. Лично мне, в большинстве случаев, просто не хочется тратить свои силы и время на вопрос, если я вижу, что человек ни хрена на понимает в том, что спрашивает, и в том коде, который показывает (который якобы он написал). Не люблю халявщиков.

И, кстати, мама Стифлера, по вашему комменту #5.

Цитата Сообщение от мама Стифлера Посмотреть сообщение
1. строка 12 int tabpyt[1][pyt-1], должно быть int tabpyt[2][pyt]
Сразу хочется сказать, что массивы так не объявляют через переменные, да программа работает, но это не правильно.
В С99+ это разрешено. Variable-length array (VLA) называется.
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Еще по поводу многократного объявления переменной внутри цикла - это просто лишнее.
На самом деле не страшно. Компилятор соптимизирует. Скорее всего переменной цикла, как таковой, вообще не будет: значение будет в регистре процессора.
0
из племени тумба-юбма
2438 / 1766 / 412
Регистрация: 29.11.2015
Сообщений: 8,587
Записей в блоге: 15
02.11.2019, 20:20 10
Цитата Сообщение от L0M Посмотреть сообщение
В С99+ это разрешено. Variable-length array (VLA) называется.
Вот тут вы меня ошарашили, я с таким трудом вникаю в эти динамические двумерные массивы, со всеми двойными указателями и выделением/освобождением памяти. А тут оказывается с 99 года уже можно обходится без выделения памяти. Причем чуть ранее на форуме, я написал подобный вариант создания массивов через переменные. Так меня в ответ спросили в духе типа - серьёзно ли я так думаю? После этого я начал усердно вникать в суть выделения памяти для двумерных массивов.

Добавлено через 7 минут
Вот кстати нашел ту старую тему Для заданного массива целых чисел подсчитать количество нечетных элементов
0
Мозгоправ
1741 / 1035 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
02.11.2019, 20:33 11
мама Стифлера, только не надо мешать в одну кучу динамические массивы и VLA. Это разные вещи.

VLA потенциально опасен, поскольку размещается на стеке. Чуть более опасен, чем локальная переменная-массив в функции. И там, и там можно исчерпать стек. Только размер автоматического массива можно проверить во время компиляции и выдать предупроеждение, а размер VLA можно проверить в только в рантайме.

Цитата Сообщение от мама Стифлера Посмотреть сообщение
Причем чуть ранее на форуме, я написал подобный вариант создания массивов через переменные. Так меня в ответ спросили в духе типа - серьёзно ли я так думаю?
Смотря для какого языка вы такое написали. В C99+ VLA есть, в C++ VLA - нет (по стандарту). Дело несколько осложняется тем, что некоторые компиляторы С/С++, поскольку умеют оба языка, делают послабление (извините, расширение, зависящее от реализации) и считают допустимым VLA в коде на C++. Что есть неправильно.

Цитата Сообщение от мама Стифлера Посмотреть сообщение
После этого я начал усердно вникать в суть выделения памяти для двумерных массивов.
Это правильное решение вне зависимости от VLA.
1
из племени тумба-юбма
2438 / 1766 / 412
Регистрация: 29.11.2015
Сообщений: 8,587
Записей в блоге: 15
02.11.2019, 21:01 12
Цитата Сообщение от L0M Посмотреть сообщение
Смотря для какого языка вы такое написали
Для классического Си.
По началу колебался с выбором языка для изучения(С/С++). Потом после многих вопросов/ответов, решил, что классический Си, для меня будет более оптимальным для изучения. Хотя в С++ много всяких дополнительных плюшек, в сторону улучшения и упрощения написания программ.
0
Заблокирован
03.11.2019, 14:26 13
Цитата Сообщение от L0M Посмотреть сообщение
И, одно дело, когда надо поправить пару строк, ну или одну функцию, а другое, когда надо править практически каждую строку.
Согласен. Но вижу часто, что хоть сколько-нибудь длинный код никто даже и не пытается разобрать.
0
из племени тумба-юбма
2438 / 1766 / 412
Регистрация: 29.11.2015
Сообщений: 8,587
Записей в блоге: 15
04.11.2019, 21:29 14
Цитата Сообщение от sodda Посмотреть сообщение
Но вижу часто, что хоть сколько-нибудь длинный код никто даже и не пытается разобрать
Тут конечно соглашусь, могу предоставить свой, далеко не идеальный код. В нем только от избытка переменных, сразу пропадет желание копаться ))) Хотя на самом деле, он очень простой.
Кликните здесь для просмотра всего текста

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* Вариант 2
Поиск всех вариантов расстановок 8 ферзей
на шахматной доске, размером 8х8 клеток */
#include <stdio.h>
int oper(int *x, int *y, int *m, int *p, int ni, int n) // check function
{
x[ni-1]=ni; y[ni-1]=n; m[ni-1]=x[ni-1]-y[ni-1]; p[ni-1]=x[ni-1]+y[ni-1];
if (ni>1)
{
    int nf;
    for (nf=1; nf<ni; nf++)
    {
        if (y[ni-1]==y[nf-1] || m[ni-1]==m[nf-1] || p[ni-1]==p[nf-1]) // conflict with the Queens
        {
            n=99;
            break;
        }
    }
return n;
}
} // oper
 
int main(void)
{
char ABC[]={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
int CoordX[8], CoordY[8], CoordMinus[8], CoordPlus[8];
int n1, n2, n3, n4, n5, n6, n7, n8, j;
int i=1;
 
for (n1=1; n1<=8; n1++) // for Queen A
{
j=1; // for the check function transfer 'oper'
if (oper(CoordX, CoordY, CoordMinus, CoordPlus, j, n1) == 99) continue;
    for (n2=1; n2<=8; n2++) // for Queen B
    {
j=2;
if (oper(CoordX, CoordY, CoordMinus, CoordPlus, j, n2) == 99) continue;
        for (n3=1; n3<=8; n3++) // for Queen C
        {
j=3;
if (oper(CoordX, CoordY, CoordMinus, CoordPlus, j, n3) == 99) continue;
            for (n4=1; n4<=8; n4++) // for Queen D
            {
j=4;
if (oper(CoordX, CoordY, CoordMinus, CoordPlus, j, n4) == 99) continue;
                for (n5=1; n5<=8; n5++) // for Queen E
                {
j=5;
if (oper(CoordX, CoordY, CoordMinus, CoordPlus, j, n5) == 99) continue;
                    for (n6=1; n6<=8; n6++) // for Queen F
                    {
j=6;
if (oper(CoordX, CoordY, CoordMinus, CoordPlus, j, n6) == 99) continue;
                        for (n7=1; n7<=8; n7++) // for Queen G
                        {
j=7;
if (oper(CoordX, CoordY, CoordMinus, CoordPlus, j, n7) == 99) continue;
                            for (n8=1; n8<=8; n8++) // for Queen H
                            {
j=8;
if (oper(CoordX, CoordY, CoordMinus, CoordPlus, j, n8) == 99) continue;
                                printf("%2d position: Q1[%c%d], Q2[%c%d], Q3[%c%d], Q4[%c%d], Q5[%c%d], Q6[%c%d], Q7[%c%d], Q8[%c%d]\n",
                                i, ABC[CoordX[0]-1], CoordY[0], ABC[CoordX[1]-1], CoordY[1], ABC[CoordX[2]-1], CoordY[2], ABC[CoordX[3]-1], CoordY[3],
                                ABC[CoordX[4]-1], CoordY[4], ABC[CoordX[5]-1], CoordY[5], ABC[CoordX[6]-1], CoordY[6], ABC[CoordX[7]-1], CoordY[7]);
//                              getchar();
                                i++;
                            } // Queen H
                        } // Queen G
                    } // Queen F
                } // Queen E
            } // Queen D
        } // Queen C
    } // Queen B
} // Queen A
printf("\nTotal positions: %d",i-1); getchar();
} // main
0
Заблокирован
04.11.2019, 21:47 15
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Тут конечно соглашусь, могу предоставить свой, далеко не идеальный код. В нем только от избытка переменных, сразу пропадет желание копаться
И я про это. Особенно если код изобилует всякими прелестями, вроде скобок всех мастей, точек с запятой и тд.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2019, 21:47
Помогаю со студенческими работами здесь

Странная дата
Странная дата модификации агента. Видел даты которые уходили на несколько тысячелетий вперед, но...

Странная ошибка
// ConsoleApplication5.cpp: определяет точку входа для консольного приложения. // #include...

Странная ошибка!
При открытии форм в бд пишет: Generic LSE Failure (no more info!) Что бы это значило?

Странная кодировка
Всем хай. Сбивается кодировка. Фишка в том, что я получаю строку, делаю с ней разные манипуляции, а...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru