Переписать программу, чтобы она работала не с текстом, а числами - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д