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

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

01.02.2019, 13:15. Показов 3573. Ответов 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
05.02.2019, 23:54  [ТС]
Студворк — интернет-сервис помощи студентам
8Observer8, но без си не обойтись, например, при программировании микроконтроллеров, написании драйверов и т.д. А так да, наверное, можно и на с# всё писать.
0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
06.02.2019, 00:02
IchStudiereC, поэтому Вам и стоит определиться для себя, чем же вы хотите заниматься. Если писать ядра, драйвера, программы для МК, то это определённо Си.
0
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,025
Записей в блоге: 242
06.02.2019, 01:26
Цитата Сообщение от IchStudiereC Посмотреть сообщение
А так да, наверное, можно и на с# всё писать.
Not for all. For example, JavaScript and TypeScript is better for Web Application. You cannot use C for Web Apps (in fact you can with WebAssemply). But for some tasks C# will be easier then C. For example - GUI applications. Yes, you can find a lot of GUI libraries for the pure C language: GTK+, WinAPI and so on. But it is more easier to use C# with WinForms or WPF.

Цитата Сообщение от IchStudiereC Посмотреть сообщение
но без си не обойтись, например, при программировании микроконтроллеров, написании драйверов и т.д.
C is a part of C++. I study C/C++ because I want to write game servers in the future. But it is easier for me to study how to write game servers for simple games in TcpSocket/C#, WebSockets/JavaScript/TypeScript.

C# does not depend on C/C++. You can learn them together.
0
 Аватар для COKPOWEHEU
4089 / 2687 / 432
Регистрация: 09.09.2017
Сообщений: 11,949
06.02.2019, 11:15
Цитата Сообщение от 8Observer8 Посмотреть сообщение
C is a part of C++.
Это не так. Правильнее сказать что большая часть Си входит в С++, но есть и неподдерживаемые части. Не говоря уж про различие подходов. Скажем, в современном С++ не приветствуется ручное управление памятью.
1
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
06.02.2019, 19:03  [ТС]
COKPOWEHEU, ну тогда я продолжаю учить си?
Далее добиваю знание до среднего уровня и начинаю учить с++?
А в свободное от этих языков время играюсь с кнопочками и формочками в с#?

Что интересно, даже у Шилдта в учебнике по с++ сначала даётся краткое описание с, а потом уже только рассказывается про с++.)
0
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,025
Записей в блоге: 242
06.02.2019, 19:07
Цитата Сообщение от IchStudiereC Посмотреть сообщение
А в свободное от этих языков время играюсь с кнопочками и формочками в с#?
And read books about C#.
0
 Аватар для COKPOWEHEU
4089 / 2687 / 432
Регистрация: 09.09.2017
Сообщений: 11,949
07.02.2019, 12:50
IchStudiereC, зависит от того, чем планируете заниматься. Для системного программирования и встраиваемых систем (микроконтроллеров) достаточно одного Си.
Для движка игры или другой развесистой математики, критичной к скорости лучше взять С++.
Для офисно-подобных GUI (где упор идет не на скорость, как в играх, а на разнообразие и функционал) лучше, наверное, С#. Но тут точно сказать не могу, поскольку занимаюсь в основном контроллерами (Си или С++ в стиле Си).
0
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,025
Записей в блоге: 242
07.02.2019, 16:39
It is depend on what kind of applications you want to write. If you want to write simple browser 2D/3D games for browser it is better to take TypeScript/JavaScript and WebGL based libraries: Phaser.js, Pixi.js, Three.js, Babylon.js and so on.

If you want to write your own browser 2D/3D game engine for browser games (or you need 2D/3D graphics on your browser with shader math and linear algebra) it is better to take pure WebGL 1.0/2.0 and TypeScript/JavaScript.

If you need 2D/3D graphics with shader math inside your C#/WPF or C#/Winforms non-game applications you can use shader OpenGL 3+ inside C#.

I study how to write my own game engines with multiplayer (in C#/TcpSockets and Node.js/JS/TS) using this book with shader OpenGL: C# Game Programming: For Serious Game Creation

About the Author

Daniel Schuller is a British-born computer game developer who has worked
and lived in the United States, Singapore, Japan, and is currently working in
the United Kingdom. He has released games on the PC as well as the Xbox 360
and PlayStation 3. Schuller has developed games for Sony, Ubisoft, Naughty
Dog, RedBull, and Wizards of the Coast, and maintains a game development
website at http://www.godpatterns.com. In addition to developing computer
games, Schuller also studies Japanese and is interested in Artificial Intelligence,
cognition, and the use of games in education.
Добавлено через 4 минуты
I plan to rewrite my game engine to C++ in the future when it will be necessary. But now it is critical for me to focus on linear algebra, shader math in GLSL, math physics and mutliplayer with sockets. It is difficult to me use C++ and Winsock. Modern C++ is very hard for games. ".NET" has build-in "using System.Net;" module for sockets.
0
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,025
Записей в блоге: 242
07.02.2019, 19:02
I will show when C# is better then C++ for computer graphics. For example, you need 2D/3D viewer/constructor for Windows. The most of programmers have Visual Studio with WinForms. You can use WinForms GUI and OpenTK.GLControl for graphics. It is more simple to use C# for this task then C++. You need only .NET if you want to run EXE on user computer.

I made the example. In this example I use standard ColorDialog Control to set a background color and to set a color for a triangle.

You can download the project for VS and just run it: EditedTriangle_WinFormsOpenGL31CSharp.zip

For running this EXE you need .NET 2.0 and OpenGL 3.1: EditedTrianlge_WinFormsOpenGL31CSharp_EXE.zip

Название: EditedTriangle_WinFormsOpenGL31CSharp.png
Просмотров: 469

Размер: 2.4 Кб
0
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,025
Записей в блоге: 242
07.02.2019, 19:28
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Для офисно-подобных GUI (где упор идет не на скорость, как в играх, а на разнообразие и функционал) лучше, наверное, С#.
You can use C# for programming games too. For example, you can take: Unity, Monogame, Godot, CryEngine and so on. Monogame use OpenTK for binding with OpenGL. OpenTK is a part of Xamarin. You can write non-games apps with graphics for Android and iOS using C# Xamarin. It is better to use Unity/C# for writing games for Android and iOS because it this case you can find jobs. If you can write games only on our games engine it is worse to find jobs. I think it is more effective to use C#/OpenGL (and/or WebGL/JS/TS) to study interesting things and study game engine like Unity, because Unity is the most popular game engine for Android and iOS.

I use OpenTK. OpenTK has linear algebra, audio (OpenAL). You can use C# to write your own little game engine for learning computer graphics and father use Unity, Godot and so on. And you can embed a canvas in your WinFroms or WPF application to draw graphics using OpenGL - it is more effective then GDI+.

I forgot to show the standard WinForms ColorDialog:

0
 Аватар для COKPOWEHEU
4089 / 2687 / 432
Регистрация: 09.09.2017
Сообщений: 11,949
08.02.2019, 09:42
Цитата Сообщение от 8Observer8 Посмотреть сообщение
You can use C# for programming games too.
Не спорю, но все же C# штука более медленная, чем С или С++.
0
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,025
Записей в блоге: 242
08.02.2019, 11:50
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
но все же C# штука более медленная, чем С или С++.
Speed of C# and JS/TS is more then enough for tasks that I solve.

IchStudiereC, if you want to begin to study computer graphics then this is one of the best (and the biggest one - 1264 pages) book with examples in C# and WPF: Computer Graphics Principles and Practice - 3rd Edition - 2013 - John F. Hughes, Andries van Dam, Morgan McGuire, David F. Sklar, James D. Foley, Steven K. Feiner, Kurt Akeley. Previous edition (1995) was in C and OpenGL.
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
11.02.2019, 22:30  [ТС]
Спасибо за советы.
Я ещё буду обращаться в будущем с вопросами
А пока у меня на повестке дня всякие сортировки элементов в массивах)
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
27.02.2019, 12:26  [ТС]
Продолжаем разговор)

Тему массивы прошёл, но с функциями по-прежнему проблемы.
Программа самая простая: нахождение мин/макс значения в массиве.

Кликните здесь для просмотра всего текста
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
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
 
int main()
{
  int a[10];
  int max, min;
  srand(time(NULL)); 
 
  for(int i=0;i<10;i++)
     a[i]=rand() % 50-20;  
  for(int i=0;i<10;i++)   
     printf("%d \t", a[i]);   
  max=a[0];   
  min=a[0];
  for(int i=0;i<10;i++)
  {
     if (a[i]>max)
        max=a[i];
     else
        {
        if(a[i]< min)
          min=a[i]; 
        }  
  }      
printf("%d %d \t", max, min);     
}


Решил выделить кусок нахождения этих элементов в функцию:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int min_max(int min, int max)
{
  int a[10];    
  max=a[0];   
  min=a[0];
  for(int i=0;i<10;i++)
  {
     if (a[i]>max)
        max=a[i];
     else
        {
        if(a[i]< min)
          min=a[i]; 
        }  
  }              
  return min, max;
}


И вызываю так:
C
1
min_max(min, max);
Но, не работает. Подкажите, плз, в чём снова моя ошибка?
0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
27.02.2019, 12:39
IchStudiereC, вы в функцию в качестве аргументов передали копию min и max. Для доступа к переменным(не копиям), необходимо передавать адрес переменных.
Прототип функции должен выглядеть так :
C
1
int min_max(int * min, int * max);
Внутри функции следует обращаться к ним, как к указателям.
В таком варианте вы не потеряете данные вычисленные а ходе работы функции.
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
27.02.2019, 12:49  [ТС]
D3m1an,
Вот так:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int min_max(int *min, int *max)
{
  int a[10];    
  *max=a[0];   
  *min=a[0];
  for(int i=0;i<10;i++)
  {
     if (a[i]>*max)
        *max=a[i];
     else
        {
        if(a[i]< *min)
          *min=a[i]; 
        }  
  }              
  return *min, *max;
}


и вызов : min_max(&min, &max); ?

Но
printf("%d \t %d \t", max, min); - фигня выводится
0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
27.02.2019, 12:55
IchStudiereC, почти. Возвращает функция только одно значение. В вашем случае можно сделать вовсе без return. Либо сообщать о состоянии вычислений определенным значением.
Когда вы используете указатель внутри Функции, данные сохраняются в переменные вне функции. То есть, min и max в main и так получат значения.

Добавлено через 1 минуту
Если без return, то используйте прототип вида :
C
1
void min_max(....);
Добавлено через 21 секунду
Если без return, то используйте прототип вида :
C
1
void min_max(....);
0
3 / 2 / 1
Регистрация: 01.02.2019
Сообщений: 108
27.02.2019, 13:10  [ТС]
return убрал, сделал void и то же самое(
0
 Аватар для D3m1an
296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780
27.02.2019, 13:26
IchStudiereC,
Code
1
2
3
18  -5  29  9   -13     25  -12     15  23  -2  
min = -13
max = 29
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void min_max(int *min, int *max)
{
    
  int a[10];
  for(int i=0;i<10;i++)
     a[i]=rand() % 50-20;  
  for(int i=0;i<10;i++)   
     printf("%d \t", a[i]);     
  *max=a[0];   
  *min=a[0];
  for(int i=0;i<10;i++)
  {
     if (a[i]>*max)
        *max=a[i];
     else if(a[i]< *min)
          *min=a[i]; 
  }              
}
 
int main()
{
  int max, min;
  srand(time(NULL));
  min_max(&min, &max);
  printf("\nmin = %d\nmax = %d", min, max);
  return 0;
}
Добавлено через 9 минут
Так чуть аккуратнее будет выглядеть
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void min_max(int *min, int *max)
{
    int a[10];
    for(int i=0;i<10;i++)   
        printf("%d \t", a[i]=rand() % 50-20 );     
    *min = *max = a[0];
    for(int i=0;i<10;i++)
        if(a[i]>*max)
            *max=a[i];
        else if(a[i]< *min)
            *min=a[i];
}
 
int main(void)
{
    srand(time(NULL));
    int max, min;
    min_max(&min, &max);
    printf("\nmin = %d\nmax = %d", min, max);
    return 0;
}
0
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,025
Записей в блоге: 242
27.02.2019, 14:32
Цитата Сообщение от IchStudiereC Посмотреть сообщение
а затем к с#
I will show you how it will look in C#.

C++
1
2
3
4
5
6
7
8
9
10
void min_max(int *min, int *max)
{
    *min = *max = 0;
}
 
int main(int argc, char *argv[])
{
    min_max(&min, &max);
    return 0;
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class Program
{
    private static void MinMax(out int min, out int max)
    {
        min = max = 0;
    }
 
    private static void Main(string[] args)
    {
        int min, max;
        MinMax(out min, out max);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2019, 14:32
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru