Переписать программу, чтобы она работала не с текстом, а числами - C (СИ)
Формулировка задачи:
Постараюсь быть максимально конкретным. Прога на языке Си.
Здесь (проверено) работающая нормально прога с символами. В одном документе input.txt записано слово. После команды
это слово копируется во второй документ output1.txt.
Код этой проги:
Поставлена задача переделать эту прогу чтобы она работала с числами.
Ниже мой результат, но неудачный:
Компилятр выдает предупреждение в строке
Как можно иначе это записать? Пожалуйста, подскажите. Сам не могу допереть.
printf("Vvod:\n");
scanf("%s",&word2[0]);#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;
}
Объяснение кода листинга программы
- Структура данных, используемая в программе, - это связанный список, представленный с помощью указателей на узлы. Каждый узел содержит целочисленное значение и указатель на следующий узел.
- В программе определены четыре функции:
mknode()- создает новый узел со значением, равным целочисленному аргументу, и возвращает указатель на этот узел.append()- добавляет новый узел в конец списка, который начинается с указанного узла.prepend()- добавляет новый узел в начало списка, который начинается с указанного узла.free_list()- освобождает все узлы списка, начиная с указанного узла.
- В функции
main()создаются указателиbeginиend, которые представляют начало и конец списка. Инициализируются значением0. - В цикле, пока вводимое значение не равно нулю, выполняются следующие действия:
- Создается новый узел с целочисленным значением, равным введенному значению.
- Если список пуст, новый узел добавляется в начало списка с помощью функции
prepend(). - Новый узел добавляется в конец списка с помощью функции
append(). - Указатель
countувеличивается на единицу.
- Выводится список, начиная с узла
begin, с помощью функцииout(). - Выполняется освобождение всех узлов списка с помощью функции
free_list(). - Программа завершается возвратом значения
0.