Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
BOPOHOK
0 / 0 / 0
Регистрация: 05.07.2016
Сообщений: 2
#1

Работа с файлами в C/C++ - C++

05.07.2016, 17:29. Просмотров 387. Ответов 3

Всем добрый вечер.
Ваш форум часто помогал мне, я находил ответы на многие свои вопросы. На сей раз я затупил конкретно.
Задание - написать простейшую игру "Виселица", суть которой состоит в посимвольном отгадывании зашифрованного слова.
Есть уже написанная мною и даже рабочая программа (прилагается).
Сложность у меня вызывало то, что нужно создать файл, из которого программа будет брать загадываемые слова. Она должна случайным образом выбрать одно слово из файла и считать его. Слова в файле должны быть расположены в столбик (для удобства дальнейшей работы с ними, ибо будет пилиться оконное приложение с возможностью дополнения этой базы слов).
Вроде кажется нетрудным, но уже в течение нескольких дней не могу реализовать решение.
Можете направить на путь истинный, пожалуйста?
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdio.h>
#include <string.h>
#include <string>
#include <stdlib.h>
#include <time.h>
#include <iostream>
 
int main()
{
    int r=0,q=0,e=0,*w,l,a,i,u=0,j,repeat=0;
    char b;
    char *s1, **s;
    w=new int[q];
    s=new char*[5];              //
    s[0]="ТРИГИДРОФОСФАТ";       //  Вот этот кусок
    s[1]="СИНХРОФАЗОТРОН";       //  нужно заменить
    s[2]="ДЕСЕПТИКОН";           //  на чтение из файла
    s[3]="ПОПКОРН";              //
    s[4]="ДЕСИНХРОНИЗАЦИЯ";      //
//--------------------------------------------------------------------------
    printf("\t\tДобро пожаловать в игру 'Виселица'");
    printf("\n\t\t  Выберите уровень сложности:\n"       // Здесь выбирается
             "\t\t       1 - лёгкий\n"                   //  сложность игры
             "\t\t       2 - средний\n"
             "\t\t       3 - тяжёлый\n");
    printf("\n");
    scanf("%d",&j);
    printf("\n");
    if (j==1) e=7;
    if (j==2) e=5;
    if (j==3) e=3;
//--------------------------------------------------------------------------
    srand(time(NULL));
    a=rand()%4;         // Выбирает случайную строку
    l=strlen(s[a]);     // Длина выбранной строки
    s1=new char[l];
    for (i=0;i<l;i++)   // Создание другого массива, состоящего из
        s1[i]='-';      //              прочерков
    for (i=0;i<l;i++)
    printf("%c",s1[i]); // Вывод его на экран
    printf("\n");
//--------------------------------------------------------------------------
    while ((e>(-1)) && (u!=l)) // Пока есть попытки и слово не отгадано
    {                          // (т.е. кол-во отгаданных символов не равно длине слова)
        fflush(stdin);
        printf("Введите символ: ");
        scanf("%c",&b);
        printf("\n");
        for (j=0;j<l;j++)  //  Проверка на повторы
            if (s1[j]==b)  //
                repeat++;  //
        if (repeat==0)     //   Если повторов нет,
        {                  // то выполняем этот цикл
        for(i=0;i<l;i++)
        {
            if (s[a][i]==b)
            {
                r++;    // Индикатор который показывет, угадан символ или нет
                        // (т.е. выполнять замену символов в массиве с прочерками или нет)
                w[q]=i; // Заполнение массива, который содержит
                q++;    // номера элементов которые нужно замаенить в массиве
            }           // с прочерками если введенный пользовательм символ
        }               // содержится в искомом слове
        if (r>0)
        {
            for (i=0;i<q;i++)
            {
                s1[w[i]]=b;
                u++;
            }
            puts(s1);
            printf("\n");
            //ниже идет обнуление для следующего шага
            for (i=0;i<q;i++)
                w[i]=0;
            q=0;
            r=0;
 
        }
        else  // Если буквы нет в загаданном слове
        {
                if (e>=0)
                {
                e--;
                printf("Такой буквы нет. Осталось попыток - %d\n\n\n",e);
                puts(s1);
                }
                if (e<0)
                {
                    e--;
                    printf("Попыток не осталось\n\n\n");
                    puts(s1);
                    //   Здесь добавить отрисовку
                    // очередного элемента виселицы
                }
        }
        }
        else  // Если есть повторы, ты выдаем вот это
        {
            if (e>=0)
            {
                e--;
                printf("Такой символ уже введён. Осталось попыток - %d\n\n\n",e);
                puts(s1);
                repeat=0;
            }
            if (e<0)
            {
                e--;
                printf("Попыток не осталось\n\n\n");
                puts(s1);
                //   Здесь добавить отрисовку
                // очередного элемента виселицы
            }
        }
    }
 
    if (u==l)
    {
        printf("\nwin\n");
    }
    else
    {
        printf("\nlose\n\n");
        printf("Искомое слово - ");
        puts(s[a]);
    }
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2016, 17:29
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с файлами в C/C++ (C++):

Работа с файлами
Помогите написать программу, я даже не знаю к чему взяться! Я с файлами пока не...

Работа с файлами в С++
Здравствуйте! Следующая проблема: С++ не может открыть файл. Пробовал и...

Работа с файлами
У меня вот такая задача. Есть текстовик с неким текстом(не пуст), из него нужно...

Си, работа с файлами
помогите пожалуйста написать прогамму на Си, вот само задание:...

Работа с файлами
написал класс fail для чтения из файла class fail { public: fail( int...

Работа с файлами
Нужно создать программу которая записывает в файл,вводимый текст. Далее...

3
Renji
2142 / 1501 / 457
Регистрация: 05.06.2014
Сообщений: 4,339
05.07.2016, 17:33 #2
Лучший ответ Сообщение было отмечено BOPOHOK как решение

Решение

Загрузить все слова, потом выбрать нужное. Читать только одно слово не получится, если вы не готовы делать все строки файла одинаковой длины.
C++
1
2
3
4
5
std::vector<std::string>dict;
std::string temp;
for(std::ifstream stream("test.txt");stream>>temp;)
    dict.push_back(temp);
std::cout<<dict[rand()%dict.size()];
1
gazlan
3139 / 1915 / 311
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
05.07.2016, 22:48 #3
Цитата Сообщение от BOPOHOK Посмотреть сообщение
случайным образом выбрать одно слово из файла и считать его. Слова в файле должны быть расположены в столбик
Создайте вспомогательный индексный файл из записей вида {WordOffset; WordSize}, из которого случайным образом будете выбирать текущую запись. Сами слова могут быть записаны как угодно - хоть в столбик, хоть в строчку. (Лучший вариант, разделить их нулем (0x00) и отобразить файл в память, без всяких <iostream>)

Таким образом, ваша "база" будет состоять из двух файлов: .DIC (собственно список слов) и .IDX (вспомогательный индексный файл). (Пере)индексация должна производиться при каждом обновлении списка слов.
1
BOPOHOK
0 / 0 / 0
Регистрация: 05.07.2016
Сообщений: 2
06.07.2016, 00:45  [ТС] #4
В итоге все решилось куда проще. Тупее, но проще. Спасибо тем, кто откликнулся.
C++ (Qt)
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <stdio.h>
#include <string.h>
#include <string>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <fstream>
#include <locale>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
    int r=0,q=0,e=0,*w,l,a,i,u=0,j,repeat=0;
    char b;
    char *s1;
    w=new int[q];
    const int N=256; //Константный размер строки
    const char *FName ="add_words.txt"; //Путь к файлу;
    int count=0;
    srand(time(NULL));
    a=rand()%9;
    char s[256];
    char S[N]={""}; //В S будут считываться строки
    ifstream file(FName); //Открыли файл для чтения
   while (!file.eof()) //Будем читать информацию пока не дойдем до конца файла
     {
       file.getline(S,N); //Построчное считывание информации в S
       if (count==a)
           strcpy(s,S);
       count++;
     }
     file.close();  //Закрыли открытый файл
//--------------------------------------------------------------------------
    printf("\t\tДобро пожаловать в игру 'Виселица'");
    printf("\n\t\t  Выберите уровень сложности:\n"  // Здесь выбирается
             "\t\t       1 - лёгкий\n"                   //  сложность игры
             "\t\t       2 - средний\n"
             "\t\t       3 - тяжёлый\n");
    printf("\n");
    scanf("%d",&j);
    printf("\n");
    if (j==1) e=5;
    if (j==2) e=4;
    if (j==3) e=3;
//--------------------------------------------------------------------------
    l=strlen(s);
    s1=new char[l];
    for (i=0;i<l;i++)
        s1[i]='-';
    for (i=0;i<l;i++)
    printf("%c",s1[i]);
    printf("\n");
//--------------------------------------------------------------------------
    while ((e>(-1)) && (u!=l))
    {
        fflush(stdin);
        printf("Введите символ: ");
        scanf("%c",&b);
        printf("\n");
        for (j=0;j<l;j++)  //  Проверка на повторы
            if (s1[j]==b)  //
                repeat++;  //
        if (repeat==0)     //   Если повторов нет,
        {                  // то выполняем этот цикл
        for(i=0;i<l;i++)
        {
            if (s[i]==b)
            {
                r++;
                w[q]=i;
                q++;
            }
        }
        if (r>0)
        {
            for (i=0;i<q;i++)
            {
                s1[w[i]]=b;
                u++;
            }
            puts(s1);
            printf("\n");
            //ниже идет обнуление для следующего шага
            for (i=0;i<q;i++)
                w[i]=0;
            q=0;
            r=0;
 
        }
        else  // Если буквы нет в загаданном слове
        {
                e--;
                printf("Такой буквы нет. Осталось попыток - %d\n\n\n",e);
                puts(s1);
                //   Здесь добавить отрисовку
                // очередного элемента виселицы
        }
        }
        else  // Если есть повторы, ты выдаем вот это
        {
            e--;
            printf("Такой символ уже введён. Осталось попыток - %d\n\n\n",e);
            puts(s1);
            repeat=0;
            //   Здесь добавить отрисовку
            // очередного элемента виселицы
        }
    }
 
    if (u==l)
    {
        printf("\nwin\n");
    }
    else
    {
        printf("\nlose\n");
        printf("Искомое слово - ");
        puts(s);
    }
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2016, 00:45
Привет! Вот еще темы с решениями:

Работа с файлами
Задали лабораторку не успеваю разобраться что к чему?Помоги пожайлуста.

Работа с файлами
Мне нужно реализовать программу следующим образом:все входные данные...

Работа с файлами
Здравствуйте,помогите пожалуйста с решением задачи, Каждая строка текстового...

работа с файлами
подскажите пожалуйста a. В текстовом файле хранятся квадратные вещественные...


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

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

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