Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/54: Рейтинг темы: голосов - 54, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.09.2011
Сообщений: 46
1

Перевести программу из C++ в Си

24.04.2012, 21:24. Просмотров 10052. Ответов 20
Метки нет (Все метки)

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
77
78
79
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
 
 
class NameDataSet
{
  public:
        char szName[128];
        // указатель на следующую запись в списке
        NameDataSet* pNext;
};
 
// указатель на первую запись списка
NameDataSet* pHead = 0;
 
// добавление нового члена в список
void add(NameDataSet* pNDS)
{
        pNDS->pNext = pHead;
        // заголовок указывает на новую запись
        pHead = pNDS;
}
 
// чтение имени
NameDataSet* getData()
{
        // читаем имя
        char nameBuffer[128];
        cout << "\nEnter name:";
        cin  >> nameBuffer;
 
        // усли "exit" - выход
        if ((stricmp(nameBuffer, "exit") == 0))
        {
                return 0;
        }
 
        // новая запись для заполнения
        NameDataSet* pNDS = new NameDataSet;
 
        // заполнение поля имени и обнуление указателя
        strncpy(pNDS->szName, nameBuffer, 128);
        pNDS->szName[127] = '\0';
        pNDS->pNext = 0;
 
        // возврат адреса созданного объкта
        return pNDS;
}
 
int main(int nNumberofArgs, char* pszArgs[])
{
        cout << "Read names of students\n"
                 << "Enter 'exit' for first name to exit\n";
 
        // создание объекта NameDataSet
        NameDataSet* pNDS;
        while (pNDS = getData())
        {
                // добавление в конец списка
                add(pNDS);
        }
 
        cout << "Entries:\n";
        pNDS = pHead;
        while(pNDS)
        {
                // вывод текущей записи
                cout << pNDS->szName << "\n";
 
                // получение следующей записи
                pNDS = pNDS->pNext;
        }
 
        system("PAUSE");
        return 0;
}
Эту программу нужно перевести в Си. помогите,если не сложно
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2012, 21:24
Ответы с готовыми решениями:

Перевести программу с Си++ в Си
#include &lt;iostream&gt; using namespace std; #include &lt;iostream&gt; int main() { const int N =...

перевести программу на С++
помогите перевести программу с паскаля на С++. uses crt; var i,n:integer; ...

Перевести программу с C++
#include &lt;iostream&gt; using namespace std; #include &quot;time.h&quot; #include &lt;stdlib.h&gt; int main() ...

Перевести программу на С++
нужно перевести в с++ Дан текст, в котором имеются цифры. а) Найти их сумму. б) Найти...

20
DU
1492 / 1138 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.04.2012, 00:10 2
она и так почти сишная.
вместо class написать struct, public: удалить, cin/cout заменить на какие нибудь scanf/printf и инклуды сишные написать.
0
56 / 56 / 13
Регистрация: 12.11.2011
Сообщений: 109
25.04.2012, 01:21 3
Цитата Сообщение от VKhan Посмотреть сообщение
Эту программу нужно перевести в Си. помогите,если не сложно
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
#include <conio.h>
#include <string.h>
#include <stdio.h>
 
struct NameDataSet
{
  public:
        char szName[128];
        // указатель на следующую запись в списке
        NameDataSet* pNext;
};
 
// указатель на первую запись списка
NameDataSet* pHead = 0;
 
// добавление нового члена в список
void add(NameDataSet* pNDS)
{
        pNDS->pNext = pHead;
        // заголовок указывает на новую запись
        pHead = pNDS;
}
 
// чтение имени
NameDataSet* getData()
{
        // читаем имя
        char nameBuffer[128];
        printf("\nEnter name:");
        scanf("%s", nameBuffer);
 
        // усли "exit" - выход
        if ((stricmp(nameBuffer, "exit") == 0))
        {
                return 0;
        }
 
        // новая запись для заполнения
        NameDataSet* pNDS = new NameDataSet;
 
        // заполнение поля имени и обнуление указателя
        strncpy(pNDS->szName, nameBuffer, 128);
        pNDS->szName[127] = '\0';
        pNDS->pNext = 0;
 
        // возврат адреса созданного объкта
        return pNDS;
}
 
int main(int nNumberofArgs, char* pszArgs[])
{
        printf("Read names of students\nEnter 'exit' for first name to exit\n");
 
        // создание объекта NameDataSet
        NameDataSet* pNDS;
        while (pNDS = getData())
        {
                // добавление в конец списка
                add(pNDS);
        }
 
        printf("Entries:\n");
        pNDS = pHead;
        while(pNDS)
        {
                // вывод текущей записи
                printf("%s\n", pNDS->szName);
 
                // получение следующей записи
                pNDS = pNDS->pNext;
        }
 
        _getch();
        return 0;
}
0
Заблокирован
25.04.2012, 04:13 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

extenup, хоть бы скомпилировал для приличия, то что написал
C
1
2
3
4
5
6
7
8
9
10
11
struct NameDataSet
{
        char szName[128];
        NameDataSet* pNext;
} parampampam;                          // готовая переменная
 
struct NameDataSet *foo, bar;        // объявление переменных
 
struct NameDataSet ( struct NameDataSet );     // прототип функции, возвращающей структуру  
                            // NameDataSet и принимающей в качестве аргумента
                            // такую же структуру
0
56 / 56 / 13
Регистрация: 12.11.2011
Сообщений: 109
25.04.2012, 09:00 5
Цитата Сообщение от alkagolik Посмотреть сообщение
extenup, хоть бы скомпилировал для приличия, то что написал
Нормально она компилируется.. И работает точно так же как VKhan привёл в примере на C++
0
Заблокирован
25.04.2012, 13:38 6
Цитата Сообщение от extenup Посмотреть сообщение
Нормально она компилируется
http://liveworkspace.org/code/... 4cb1350368
выбрось компилятор (или верни продавцу как некачественный товар)
В #4 ошибка, забыл имя функции написать, должно выглядеть так
C
1
struct NameDataSet func ( struct NameDataSet );
0
Заблокирован
Автор FAQ
25.04.2012, 15:48 7
VKhan, вот так будет более или менее в стандарте С
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct 
{
    char szName[128];
    // óêàçàòåëü íà ñëåäóþùóþ çàïèñü â ñïèñêå
    void* pNext;
}NameDataSet;
 
// óêàçàòåëü íà ïåðâóþ çàïèñü ñïèñêà
NameDataSet* pHead = 0;
 
// äîáàâëåíèå íîâîãî ÷ëåíà â ñïèñîê
void add(NameDataSet* pNDS)
{
    pNDS->pNext = (NameDataSet*)pHead;
    // çàãîëîâîê óêàçûâàåò íà íîâóþ çàïèñü
    pHead = pNDS;
}
 
// ÷òåíèå èìåíè
NameDataSet* getData()
{
    // ÷èòàåì èìÿ
    char nameBuffer[128];
    printf("\nEnter name:");
    scanf("%s",nameBuffer);
 
    // óñëè "exit" - âûõîä
    if ((strcmp(nameBuffer, "exit") == 0))
        return 0;
    
    // íîâàÿ çàïèñü äëÿ çàïîëíåíèÿ
    NameDataSet* pNDS = (NameDataSet*)malloc(sizeof(NameDataSet));
    // çàïîëíåíèå ïîëÿ èìåíè è îáíóëåíèå óêàçàòåëÿ
    strncpy(pNDS->szName, nameBuffer, 128);
    pNDS->szName[127] = '\0';
    pNDS->pNext = 0;
    // âîçâðàò àäðåñà ñîçäàííîãî îáúêòà
    return pNDS;
}
 
int main(int nNumberofArgs, char* pszArgs[])
{
    printf
    (
        "Read names of students\n"
        "Enter 'exit' for first name to exit\n"
    );
    // ñîçäàíèå îáúåêòà NameDataSet
    NameDataSet* pNDS = NULL;
    while ((pNDS = getData()) && (getchar() == '\n'))
        // äîáàâëåíèå â êîíåö ñïèñêà
        add(pNDS);
    printf("Entries:\n");
    pNDS = pHead;
    while(pNDS)
    {
        // âûâîä òåêóùåé çàïèñè
        printf("%s\n",pNDS->szName);
        // ïîëó÷åíèå ñëåäóþùåé çàïèñè
        pNDS = (NameDataSet*)pNDS->pNext;
    }
    system("pause");
    return 0;
}
http://codepad.org/WTj61Hp8
0
Миниатюры
Перевести программу из C++ в Си  
Заблокирован
Автор FAQ
25.04.2012, 15:54 8
Цитата Сообщение от extenup Посмотреть сообщение
Нормально она компилируется.. И работает точно так же как VKhan привёл в примере на C++
- ты не прав, то что она компилируется это потому что студия воспринимает твой код как будто он написан на плюсах, пусть даже имеются функции printf и scanf

Цитата Сообщение от extenup Посмотреть сообщение
NameDataSet* pNDS = new NameDataSet;
- это ты где видел чтобы в Си был new??? malloc-ать или calloc-ать надо а не использовать плюсовое выделение памяти

Цитата Сообщение от extenup Посмотреть сообщение
_getch();
- это для мелкософта, в Си (в том Си который воспринимается от винды до линукса, гетч и её продвинутый аналог выброшены из стандарта, к сожалению это так)

Цитата Сообщение от extenup Посмотреть сообщение
public:
- паблик в структуре, хм не думаю, кстати кодпад не прпустил

Для всех остальных гневно воскликнувших, "а зачем он ввёл ещё это"
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
&& (getchar() == '\n'))
отвечу, да можно без него, но запустите линковку в кодпаде без (getchar() == '\n') и...и увидите отработку
0
Jupiter
25.04.2012, 15:57
  #9

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C
1
2
3
4
5
6
7
printf
 (
 "Read names of students\n"
 "Enter 'exit' for first name to exit\n"
 );
 // создание объекта NameDataSet
 NameDataSet* pNDS = NULL;
по С89 все объявления должны предшествовать 1-му вызову функции

1
Заблокирован
Автор FAQ
25.04.2012, 16:05 10
Jupiter, я ориентировался на кодпад, он не ругался, значит как я уже сказал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вот так будет более или менее в стандарте С
, притом на сколько помню есть ещё С99 и по моему именно его исповедует здесь львиная доля кодеров, так что ориентировался на него. А так спасибо прийму к сведению
0
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 29
08.06.2012, 18:55 11
а что эта программа делает?
0
Заблокирован
Автор FAQ
09.06.2012, 11:41 12
Цитата Сообщение от geshtat Посмотреть сообщение
а что эта программа делает?
- реализует односвязный список
0
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.06.2012, 11:58 13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
притом на сколько помню есть ещё С99 и по моему именно его исповедует здесь львиная доля кодеров, так что ориентировался на него. А так спасибо прийму к сведению
И правильно делают на самом-то деле Но, к примеру, таже студия не поддерживает.
Цитата Сообщение от Jupiter Посмотреть сообщение
по С89 все объявления должны предшествовать 1-му вызову функции
Не вызову, просто переменные должны быть объявлены в начале блока кода. То есть вот это вполне валидно:
C
1
2
3
4
5
6
7
8
9
void foo() {
     int i = 0;
     bar(); // some func
     
     while (i < 10) {
        int j = 0;
        // .....    
     }
}
2
Заблокирован
10.06.2012, 13:34 14
Цитата Сообщение от fasked Посмотреть сообщение
Но, к примеру, таже студия не поддерживает.
у них свой собственный стандарт есть зачем заморачиваться на какое-то там мировое сообщество.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
void bar(){}
 
int main() {
 
    int i = 10;
    bar();
 
    while ( i-- ) {
        static volatile int j = 0;
        ++j;
    }
/// printf( "%i\n", j );
    return 0;
}
писал в gedit и получил вот
Код
test.c: В функции «main»:
test.c:14:1: ошибка: expected expression before «/» token
веселый казус
1
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.06.2012, 20:26 15
Цитата Сообщение от alkagolik Посмотреть сообщение
писал в gedit и получил вот
gedit это вроде просто редактор?
А C89 (в отличии от С99) не поддерживает однострочные комментарии, поэтому воспринимает "///" как оператор деления. Так что это вполне нормальный warning. Компилятор C99 отработает чисто.
1
397 / 353 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
11.06.2012, 20:49 16
Цитата Сообщение от fasked Посмотреть сообщение
И правильно делают на самом-то деле Но, к примеру, таже студия не поддерживает.
а почему?
и еще я слышал что GNU использует только Ansi C, это правда?
0
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.06.2012, 03:07 17
Цитата Сообщение от aram_gyumri Посмотреть сообщение
а почему?
Что именно "почему"?
Если Вы имеете в виду использование с99, то данный стандарт очень упрощает написание программ. Есть много приятных плюшек, которые, к слову, нисколько не усложняют синтаксис (как это происходит с С++).
Если Вы про Visual Studio, то тут вопросы к Microsoft. Я так понимаю, они вообще не держат Си за язык программирования уже довольно давно.
Цитата Сообщение от aram_gyumri Посмотреть сообщение
и еще я слышал что GNU использует только Ansi C, это правда?
Это которая операционная система? Я про нее мало что знаю. Но скорее всего то, о чем Вы говорите использует только ANSI C из-за высоких требований к переносимости. Версии gcc с поддержкой С99 еще есть не на всех экзотических архитектурах.
2
Заблокирован
12.06.2012, 05:00 18
Цитата Сообщение от fasked Посмотреть сообщение
gedit это вроде просто редактор?
ну да, я получается просто не знал что в ANSI C нету однострочных комментариев и определил это как баг редактора.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10863 / 6743 / 1619
Регистрация: 25.07.2009
Сообщений: 12,476
12.06.2012, 06:41 19
Цитата Сообщение от fasked Посмотреть сообщение
Если Вы имеете в виду использование с99, то данный стандарт очень упрощает написание программ. Есть много приятных плюшек, которые, к слову, нисколько не усложняют синтаксис (как это происходит с С++).
ППКС

Цитата Сообщение от fasked Посмотреть сообщение
Если Вы про Visual Studio, то тут вопросы к Microsoft. Я так понимаю, они вообще не держат Си за язык программирования уже довольно давно.
Ну за то своих насочиняли - Си-диез, Фа-диез... Прям конкурс баянистов...
0
397 / 353 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
12.06.2012, 10:22 20
fasked, спосибо за ответ, а я спрашвал про стандарт.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2012, 10:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Перевести программу из C++ в Си
#include &lt;cstdlib&gt; #include &lt;ctime&gt; #include &lt;iostream&gt; #include &lt;cstddef&gt; #include...

Перевести программу с C++ на Си
Подскажите как. #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt;...

Перевести программу с C++ на C#
Вопрос перевода у меня касается вот этой программы. Я её нашел в этой теме данного форума...

Перевести программу из C++ в Си
#include &lt;iostream&gt; int main() { int size=3; int max_size=size+(size-1); ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.