Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108

Функции и их создание

01.02.2019, 13:15. Показов 3667. Ответов 66
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Начал изучать Си.
Дошёл до темы "Функции".

Решил написать простенькую программу для сложения двух чисел. Если пользователь хочет продолжать сложение - нажимает y, не хочет - n.

Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
 
char* choice(char *sym);
 
int main(int argc, char* argv[])
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
   char *sym;
   int a, b, c; 
   while(1)
   {
      printf("Введите число а = \n");
      scanf("%d", &a);
      printf("Введите число b = \n");
      scanf("%d", &b);
      c = a+b;
      printf("Результат с = %d \n", c);
      choice(sym);
    }   
}
 
char* choice(char *sym)
{
   while(1)
   {
       printf("Продолжить??? Введите y/n \n");              
       scanf("%c", &sym);         
       if (sym == "y") 
         continue;
       if (sym == "n")  
         break;
       else
       {
         printf("Повторите ввод!\n");
         scanf("%c", &sym);
       }    
   }
}


Но, к сожалению, данный код не работает. Сложение производится только один раз, и потом постоянно "продолжить... повторите ввод и т.д.". Странно, почему так. Если скопировать тело функции в основную программу, то всё работает как надо. В чём может быть дело?

Заранее спасибо за ответы!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.02.2019, 13:15
Ответы с готовыми решениями:

Создание функции, формирующую предложение из аргументов функции, аргументы . Аргументы - переменное число
Короче, вот бы всё норм. Хочу соединять, но он мне выдаёт ошибку, когда использую strcat. Не могу понять, с типами аргументов вроде проблем...

Создать базу данных с(Создание функции БД, Создание процедуры БД, Создание тригера БД)
В задание для курсовой работы по БД входят вот такие пункты: 1.2 Создание функции БД. 1.3 Создание процедуры БД 1.4 Создание...

Создание функции внутри другой функции
доброго времени суток. необходимо решить 3 задачи, скрипт с вычислениями поместить в файле .js, а результаты и входные данные (вводимые...

66
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
27.02.2019, 15:22  [ТС]
Студворк — интернет-сервис помощи студентам
D3m1an, получается, что объявление массива и его заполнение элементами необходимо производить в самой функции?
***
В случае данной программы использование функции практически не сократило длину кода, значит, её применение тут излишне?

8Observer8, примерно то же самое всё. Но я вижу слово класс, а это уже ООП. Пока продвигаться дальше не буду, надо разобраться с */&. Придётся читать Шилдта ещё раз

***
И ещё вопрос ко всем.
Может ли человек стать хорошим программистом без порядочного знания высшей математики.
Или если в ней буксуешь, то лучше даже за программирование не браться?
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
27.02.2019, 16:14
Цитата Сообщение от IchStudiereC Посмотреть сообщение
Может ли человек стать хорошим программистом без порядочного знания высшей математики.
For example, math in necessary for GameDev. It is necessary for me because I study game programming and I write my own game engines in JavaScript/WebGL and C#/OpenGL. I must study: linear algebra, trigonometry, calculus for game physics. But there are a lot of jobs in programming world where you do not need math or it will be elementary math.

Добавлено через 2 минуты
Цитата Сообщение от IchStudiereC Посмотреть сообщение
Но я вижу слово класс, а это уже ООП.
Yes, you cannot create functions outside of class in C#.
0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
27.02.2019, 16:20
IchStudiereC, совершенно верно. В данном случае, когда программа короткая и выполняет одну лишь функцию, то проще обойтись без функций и выполнить весь механизм в main. Создание функций полезно тогда, когда операцию приходится выполнять повторно, либо её механизм засоряет главный код.

Создание массива вы можете также выполнить и в main, но тогда нужно будет обеспечить доступ к данной области памяти сторонним функциям. Допустим, также через указатель или статическую память.
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
27.02.2019, 16:29  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
trigonometry
Особенно стереометрия) Про высшую геометрию и топологию молчу)
Цитата Сообщение от 8Observer8 Посмотреть сообщение
lot of jobs in programming world
Например? Только не веб-разработка.
Цитата Сообщение от D3m1an Посмотреть сообщение
... статическую память.
Это про static... ?
А динамическое выделение через malloc?
0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
27.02.2019, 16:45
IchStudiereC, можно динамически. Но, метод выделения памяти не влияет на доступ к ней. В общем, если массив у вас внешний, используйте 3ий аргумент для доступа к нему. Будет проще.
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
27.02.2019, 16:54
Цитата Сообщение от IchStudiereC Посмотреть сообщение
Например? Только не веб-разработка.
I was programming microcontrollers in Assembler and C in this company:during 4 years and I used only elementary math sometimes. We read values from sensors, analyzed them and make some decision in accord of technical specification.

I worked in a few companies where math was not required. For example, if you make GUI applications with Databases.

Цитата Сообщение от IchStudiereC Посмотреть сообщение
Особенно стереометрия) Про высшую геометрию и топологию молчу)
Geometry was my favourite subject in school and linear algebra was my favourite subject in University. Stereometry and tomology does not require in GameDev. You can see the contents of this book what is required for GameDev: 3D Math Primer for Graphics and Game Development
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
28.02.2019, 21:02
Цитата Сообщение от IchStudiereC Посмотреть сообщение
Но я вижу слово класс, а это уже ООП.
Урок 1. Введение в ООП. Классы и объекты

Video
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
01.03.2019, 14:59  [ТС]
8Observer8, пока рано классы, с азами проблемы

Я лазаю по киберфоруму, всякие задачки решаю, заданные другими пользователями ранее.
Если не получается, подглядываю решение.
Есть вопросик такой: Найти одинаковые элементы массива и организовать следующий вывод:
***
C
1
2
3
Введённый массив: 1 4 6 2 1 6 8 1...
Элемент [1]  равен (1) повторяется 1 раз с a[5], а[8] 
и т.д.
***

Вот кусочек программы:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(int i=0; i<20; i++)
  {
     int temp=0;
     for(int j=0; j<i; j++)
        if(a[i]==a[j])
          temp++;
        if(temp==0)
        {
          for(int j=i+1; j<20; j++)
          if(a[i]==a[j])
            temp++;
          if(temp !=0)
            printf("Элемент [%d]=(%d) повторяется %d раз(a)\n", i, a[i], temp);                                                       
        }            
    }
Как надо оператор printf модернизировать? Пока не могу догадаться.

Добавлено через 3 минуты

Не по теме:

Кликните здесь для просмотра всего текста
Модераторы не против, если я буду в одной теме все свои вопросы задавать?

0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
01.03.2019, 15:12
IchStudiereC, немного не ясно , что вы хотите модернизировать.
Если нужно выводить неопределенное количество элементов : "а[2] , а[6]" - а в другой раз допустим : " а[7] " - то здесь явно необходимо сделать цикл с очередным выводом всех элементов, которые отвечают условию. Это один вариант.
Либо, записывать в некий массив те элементы, что соответствуют условию и выводить уже просто строку после слов "повторяется 1 раз".
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
01.03.2019, 16:05  [ТС]
D3m1an, не получается
Кликните здесь для просмотра всего текста
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
//for (int k; k<20; k++)
//{  
  for(int i=0; i<20; i++)
  {
     int temp=0;
     for(int j=0; j<i; j++)
        if(a[i]==a[j])
        {       
          temp++;
          //a[k]=a[i];
        }
        if(temp==0)
        {
          for(int j=i+1; j<20; j++)
          if(a[i]==a[j])
            {
              temp++;
              //a[k]=a[i];
            }
          if(temp !=0)
             printf("Элемент [%d]=(%d) повторяется %d раз(a) \n", i, a[i], temp);                                                   
        }              
    }  
//}
   //for (int k; k<20; k++)
      // printf("\n Повторяются элементы %d ", k);

Добавленное закомментировал
0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
01.03.2019, 16:11
IchStudiereC, я сейчас с телефона пишу. Поэтому вот маленький пример как вывожу я неопределенное количество элементов.
Смысл должен быть понятен.

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 <stdio.h>
 
int comp(int n, const int * a, size_t size)
{
    for(int i = 0; i < size; i++)
        if(n == a[i])   return 1;
    return 0;
}
 
int main()
{
    const int a[] = {1, 3, 5, 7, 9};
    int e[5];
    
    for(int i = 0; i < 5; i++)
        scanf("%d", &e[i]);
    
    printf("Nums: ");
    for(int i = 0; i < 5; i++)
        if(comp(e[i], a, 5))
            printf("%d ", e[i]);
    printf("\n");
    return 0;
}
Добавлено через 59 секунд
Code
1
2
1 1 3 4 5
Nums: 1 1 3 5
Это вывод
1
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
06.03.2019, 00:12  [ТС]
Доброй ночи.

Продолжаю работать с массивами.
Задача: реверс элементов.
Вот таким образом он осуществляется:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
for(int i=0; i <n/2; i++) 
 {
       int tmp = a[i];
       a[i] = a[n-i-1]; 
       a[n-i-1] = tmp;
    }

Я опять хочу в виде функции это дело реализовать:
Кликните здесь для просмотра всего текста
void reverse(int *a)
{
int n;
for(int i=0; i <n/2; i++)
{
int tmp = a[i];
a[i] = a[n-i-1];
a[n-i-1] = tmp;
}
}


вызываю:
C
1
reverse (a);
И не работает корректно. Не понимаю почему
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
06.03.2019, 15:23  [ТС]
Я сделал

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
 void reverse(int *a, int n)
 {
    
 for(int i=0; i <n/2; i++) 
   {
       int tmp = a[i];
       a[i] = a[n-i-1]; 
       a[n-i-1] = tmp;
    } 
 }


Вызов:
C
1
reverse (a, n);
Добавлено через 4 часа 19 минут
Снова ничего не понимаю

Задача: Выбор одной из половин массива(ч-з switch)
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     printf("Нужна первая половина массива или вторая? (1/2)\n");
    _flushall();
    char ch = getchar();
    putchar(ch);
    puts(" ");
    switch (sym)
    {
      case '1': 
        for(int i=0; i <n/2; i++)
          b[i]=a[i];
        for(int i = 0 ; i < n/2; i++)
           printf("%d \t", b[i]);  
      case '2':
        for(int i=n/2; i <n; i++)
          c[i]=a[i];  
        for(int i = n/2 ; i < n; i++)
           printf("%d \t", c[i]); 
     }


"Первый" case не работает) Вырезаю, ставлю его под "второй" case - и, о Боги, он работает. Но теперь уже "второй" не заводится) Wtf!
0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
06.03.2019, 16:40
IchStudiereC, полный код , пожалуйста.

Добавлено через 1 минуту
И break отсутствует в switch. Хотя, может вы так и задумывали.
Врятли, сначала операции идут с первой половиной, затем со второй. При этом если выбрать кейс 2, то программа отработает, но если выбрать 1, то она выполнит оба кейса.
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
06.03.2019, 23:37  [ТС]
D3m1an, ах) Я просто некорректно свич использовал.
Получается, после отработки какого-то из кейсов обязателен брейк, и, соответственно, программа прервётся.
А я хотел дальше с кусочком массива работать.
Значит, надо через if делать?

Добавлено через 11 минут
Да, сделал через него.
0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
07.03.2019, 10:51
IchStudiereC, программа не прервется. break прекращает работу текущего цикла, позволяет выйти из него немедленно. То есть, программа продолжит свою работу после switch до своего конца.
Ещё один полезный оператор - continue позволяет прервать выполнение программы в цикле и перейти к следующей итерации цикла(не выходя из него).
Рекомендую почитать про них, если до сих пор есть вопросы по работе с ними.

Добавлено через 48 секунд
Если в кейс добавить return, тогда программа закончит свою работу.
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
13.03.2019, 15:25  [ТС]
Что-то я давно не отписывался)

ГСПЧ.

На примере самого простого, линейного..
Почему записи

C
1
2
3
4
for (int i=0;i<=N;i++){
        x[i]=((a*x0)+b)%c;
                x0=x[i];
}
и

C
1
2
for (int i=0;i<=N;i++,x0=x[i])
        x[i]=((a*x0)+b)%c;
не дают аналогичные результаты на выводе?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
13.03.2019, 15:44
а вот так ?
C
1
2
for (int i=0;i<=N;x0=x[i++])
        x[i]=((a*x0)+b)%c;
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
13.03.2019, 15:59  [ТС]
ValeryS, это даёт третий результат)

Добавлено через 1 минуту
вру, работает)

Добавлено через 36 секунд
i++, не убрал сначала

Добавлено через 53 секунды
а с точки зрения опытного программиста, какая запись считается оптимальной?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
13.03.2019, 16:06
Цитата Сообщение от IchStudiereC Посмотреть сообщение
а с точки зрения опытного программиста, какая запись считается оптимальной?
или моя, или первая
вторая это так называемая UB(неопределенное поведение)
запись i++ это постинкременент т.е сначала используется значение переменной а потом увеличивается на 1
в такой записи
Цитата Сообщение от IchStudiereC Посмотреть сообщение
i++,x0=x[i]
когда произойдет это потом? или после запятой и в x[i] уже следующая ячейка массива,или после скобки, тогда все правильно
один компилятор может сделать так, а другой эдак
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.03.2019, 16:06

Создание функции
я не совсем понял как в матлабе действует такое присваивание f(x)='x^3+1.5*x^2-0.9*x+0.7'; Но функцию на разбиении посчитать не могу...

Создание функции
люди помогите пожалуйста! выбивает ошибку никак немогу понять в чем она! вот исходник кода: function Poisson(d: Double) : Extended; ...

Создание функции
Есть строка с символами f98neroi4nr0c3n30irn03ien3c0rfekdno400wenwkowe00koijn35pijnp46ij7k5j78p3kj546p465jnpoj35po6j345&quot; нужно создать...

создание функции в С++
подскажите пожалуйста подробно как создать свою функцию в С++ через файлы .h и .cpp при компиляции выдаёт ошибку что не может распознать...

Создание функции
Разработать функцию определяющую, является ли строка перевертышем (читается одинаково с начала и с конца). С помощью этой функции вывести...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru