Переписать программу, чтобы она работала не с текстом, а числами - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Постараюсь быть максимально конкретным. Прога на языке Си. Здесь (проверено) работающая нормально прога с символами. В одном документе input.txt записано слово. После команды
printf("Vvod:\n");
scanf("%s",&word2[0]);
это слово копируется во второй документ output1.txt. Код этой проги:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <malloc.h>
 
int n;
struct Node
{
char word[40];
 
struct Node *next;                                         //ссылка на след. узел
struct Node **ptr;                                        //указатель (вместо ссылки "&Head")
};
typedef struct Node*PNode;                      //тип данных:указатель на узел
PNode Head=NULL;
struct Node **ptr = &Head;                      //инициирование указателя (вместо ссылки "&Head")
 
PNode CreateNode(char NewWord[])                                            //СОЗДАНИЕ ЭЛ-ТА СПИСКА
{PNode NewNode=(PNode)malloc(sizeof(struct Node));         //указатель на новый узел
strcpy(NewNode->word,NewWord);                      //записать слово(замена NewWord на word)
NewNode->next=NULL;                                                                //следующего узла нет
return NewNode;}                                                                         //рез-т функции-адрес узла
 
void AddFirst(PNode ptr,PNode NewNode)               //ДОБАВЛЕНИЕ УЗЛА В НАЧАЛО СПИСКА
{NewNode->next=Head;
Head=NewNode;}
 
void AddLast(PNode ptr,PNode NewNode)           //ДОБАВЛЕНИЕ УЗЛА В КОНЕЦ СПИСКА
{PNode q=Head;
if (Head==NULL)                                                     //если список пуст
{AddFirst(Head,NewNode);                                    //вставляем первый элемент
return;}
}
 
int main()
{
 PNode ptr = NULL, p;
 FILE *in,*out1;
char word[40],word2[40];
 
printf("Vvod:\n");
scanf("%s",&word2[0]);                                                //ввод слова на запрос №1(компилятор предупреждал: поэтому ввел [0])
 
in=fopen("input.txt","r");                                         //открытие файла 1
 
 while (1)                                                                //в n хранится значение, к-е вернула ф-я fscanf.Если это число меньше 1(чтение прошло неудачно или закончились данные в файле),то происходит выход из цикла.
 {
n=fscanf(in,"%s",word);                                        //чтение данных из файла 1
if (n<=0)
break;
p=CreateNode(word);                                             //создание нового узла
AddLast(Head,p);                                                    //добавление
}
fclose(in);                                                               //закрытие файла1
 
out1=fopen("output1.txt","w");                               //открытие файла2
                                 //ВЫВОД ДАННЫХ В ФАЙЛ №2(ПО ЗАПРОСУ №1)
p=Head;                                                       //присвоение узлу р "головы"
fprintf(out1,"%s",p->word);
fclose(out1);                                                           //закрытие файла2
 
return 0;                                                                                //(компилятор предупреждал: поэтому ввел)
}
Поставлена задача переделать эту прогу чтобы она работала с числами. Ниже мой результат, но неудачный:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <malloc.h>
 
int n;
struct Node
{
int word[40];
 
struct Node *next;                                         //ссылка на след. узел
struct Node **ptr;                                        //указатель (вместо ссылки "&Head")
};
typedef struct Node*PNode;                      //тип данных:указатель на узел
PNode Head=NULL;
struct Node **ptr = &Head;                      //инициирование указателя (вместо ссылки "&Head")
 
PNode CreateNode(int NewWord[])                                            //СОЗДАНИЕ ЭЛ-ТА СПИСКА
{PNode NewNode=(PNode)malloc(sizeof(struct Node));         //указатель на новый узел
strcpy(NewNode->word,NewWord);                      //записать слово(замена NewWord на word)
NewNode->next=NULL;                                                                //следующего узла нет
return NewNode;}                                                                         //рез-т функции-адрес узла
 
void AddFirst(PNode ptr,PNode NewNode)               //ДОБАВЛЕНИЕ УЗЛА В НАЧАЛО СПИСКА
{NewNode->next=Head;
Head=NewNode;}
 
void AddLast(PNode ptr,PNode NewNode)           //ДОБАВЛЕНИЕ УЗЛА В КОНЕЦ СПИСКА
{PNode q=Head;
if (Head==NULL)                                                     //если список пуст
{AddFirst(Head,NewNode);                                    //вставляем первый элемент
return;}
}
 
int main()
{
 PNode ptr = NULL, p;
 FILE *in,*out1;
int word[40],word2[40];
 
printf("Vvod:\n");
scanf("%d",&word2[0]);                                                //ввод слова на запрос №1(компилятор предупреждал: поэтому ввел [0])
 
in=fopen("input.txt","r");                                         //открытие файла 1
 
 while (1)                                                                //в n хранится значение, к-е вернула ф-я fscanf.Если это число меньше 1(чтение прошло неудачно или закончились данные в файле),то происходит выход из цикла.
 {
n=fscanf(in,"%d",word);                                        //чтение данных из файла 1
if (n<=0)
break;
p=CreateNode(word);                                             //создание нового узла
AddLast(Head,p);                                                    //добавление
}
fclose(in);                                                               //закрытие файла1
 
out1=fopen("output1.txt","w");                               //открытие файла2
                                 //ВЫВОД ДАННЫХ В ФАЙЛ №2(ПО ЗАПРОСУ №1)
p=Head;                                                       //присвоение узлу р "головы"
fprintf(out1,"%d",p->word);
fclose(out1);                                                           //закрытие файла2
 
return 0;                                                                                //(компилятор предупреждал: поэтому ввел)
}
Компилятр выдает предупреждение в строке
strcpy(NewNode->word,NewWord);
Как можно иначе это записать? Пожалуйста, подскажите. Сам не могу допереть.

Решение задачи: «Переписать программу, чтобы она работала не с текстом, а числами»

textual
Листинг программы
#include <stdio.h>
 
typedef struct node_
{
    int data;
 
    struct node_ * next;
} node_t;
 
FILE * fin,
     * fout;
 
node_t * mknode( int data )
{
    node_t * ptr = malloc( sizeof(node_t) );
 
    ptr->next = 0;
    ptr->data = data;
 
    return ptr;
}
 
// добавить узел node после узла end
void append( node_t * node, node_t ** end )
{
    //printf( "appending 0x%x (%d) to 0x%x\n", node, node->data, *end );
 
    if( (*end) )
       (*end)->next = node;
 
    (*end) = node;
}
 
// добавить узел node перед узлом begin
void prepend( node_t * node, node_t ** begin )
{
    //printf( "prepend 0x%x (%d) to 0x%x\n", node, node->data, *begin );
 
    if( (*begin) )
        node->next = *begin;
 
    (*begin) = node;
}
 
// удалить список начиная с узла begin
void free_list( node_t * begin )
{
    node_t * next = begin,
           * cur;
 
    do
    {
       cur = next;
       next = cur->next;
 
       //printf( "deleting %d\n", cur->data );
 
       free( cur );
    }
    while( next );
}
 
// вывести все узлы после узла begin
void out( node_t * begin )
{
    for(;;)
    {
        fprintf( fout, "%d ", *begin );
 
        if( !begin->next ) break;
 
        begin = begin->next;
        fprintf( fout, "-> " );
    }
 
    fputc( '\n', fout );
}
 
//-------------------------------------------------
 
int main()
{
    node_t * begin = 0, // начало списка
           * end = 0; // конец списка
 
    int count = 0; // количество узлв в списке
 
    int in; // сюда вводим
 
    // для отладки
    fin = stdin;
    fout = stdout;
 
    // для файлов
/*
    fin = fopen( "input.txt", "r" );
    fout = fopen( "output.txt", "w" );*/
 
    for(;;)
    {
        //putchar( '>' );
        fscanf( fin, "%d", &in );
 
        if( in == 0 ) // ноль для выхода
           break;
 
        node_t * ptr = mknode( in );
 
        if( count == 0 )
            prepend( ptr, &begin );
 
        append( ptr, &end );
 
        count++;
    }
 
    out( begin );
 
    free_list( begin );
 
    return 0;
}

Объяснение кода листинга программы

  1. Структура данных, используемая в программе, - это связанный список, представленный с помощью указателей на узлы. Каждый узел содержит целочисленное значение и указатель на следующий узел.
  2. В программе определены четыре функции:
    • mknode() - создает новый узел со значением, равным целочисленному аргументу, и возвращает указатель на этот узел.
    • append() - добавляет новый узел в конец списка, который начинается с указанного узла.
    • prepend() - добавляет новый узел в начало списка, который начинается с указанного узла.
    • free_list() - освобождает все узлы списка, начиная с указанного узла.
  3. В функции main() создаются указатели begin и end, которые представляют начало и конец списка. Инициализируются значением 0.
  4. В цикле, пока вводимое значение не равно нулю, выполняются следующие действия:
    • Создается новый узел с целочисленным значением, равным введенному значению.
    • Если список пуст, новый узел добавляется в начало списка с помощью функции prepend().
    • Новый узел добавляется в конец списка с помощью функции append().
    • Указатель count увеличивается на единицу.
  5. Выводится список, начиная с узла begin, с помощью функции out().
  6. Выполняется освобождение всех узлов списка с помощью функции free_list().
  7. Программа завершается возвратом значения 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы