КУРСОВА РАБОТА № 1
ПРОГРАМИРАНЕ И ИЗПОЛЗВАНЕ НА КОМПЮТРИ
МАРУШ ЙОРДАНОВ ДЕНЧЕВ
Факултет: ФЕТТ
Група: 24
Факултетен номер: 1012060260
Задание: Да се напише програма на С, за откриване на буквите в зададена дума. Да се използва символен низ, като първоначално низа се инициализира със символа „*”. Когато бъде отгатната буква, тя се поставя на мястото на съответните „*”.
Програмата да е оргранизирана с меню и да се реализира ( чрез функции ):
-
Отгатване на дума
-
Задаване на нова дума и брой възможни грешни отговори ( запис на списъка с думи във файл )
-
Думите да се избират произволно от зададен файл
Използвани библиотеки:
-
stdio.h – основна библиотека в C за вход/изход
-
stdlib.h – необходима за rand() функцията
-
string.h – форматиране на стринг
-
time.h – необходима за инициализиране на текущото време
Използвани константи:
-
maxrows – брой редове
-
maxcols – максимален брой символи на дума
Описание на собствените функции:
file_open_error
Описание: Изкарва на екрана общо съобщение за грешка при опит за отваряне на файл.
Параметри: -
guess_a_word
Описание: Основна функция. Работата на фунцкията е да извлече случайна дума от масива words. Това се постига чрез вградената в C функция rand(). Показване на потребителя * вместо буквите на думата. Преглежда се целия низ на думата буква по буква и се сравнява дали въведената от потребителя буква вече е използвана – реализира се чрез масив „pos”, в които всяка позната буква се записва с позицията си, проверява се дали въведената буква е вярна и ако не – показване пак на *. Излиза се от фунцкията в момента, в който потребителя познае цялата дума.
Параметри: char words[максимално количество редове][максимално количество колони], int count
read_words
Описание: Четене на думите от файл-а “words.txt”
Параметри: char words[максимално количество редове][максимално количество колони], int *count – обръщане към адреса на променливата
write_a_word
Описание: Записване на въведена от потребителя дума в края на “words.txt”. Записване на броя възможни отговори към тази дума.
Параметри: -
#include
#include
#include
#include
#define maxrow 10
#define maxcol 100
extern void read_words( char words[maxrow][maxcol], int *count );
extern void write_a_word();
extern void file_open_error();
extern void guess_a_word( char words[maxrow][maxcol], int count );
int main()
{
int menu, count, random, i, b = 0, stoinost = 0,letters = 0;
char words[maxrow][maxcol], word[maxrow], letter;
static int pos[maxrow];
do
{
// Menu
printf( "\n\n1.Zaredi dumi\n2.Pusni igrata\n3.Napishi novi dumi\n4.Izlez\n\nTvoqt izbor: " );
scanf( "%d", &menu);
if( menu == 1 )
{
read_words( words, &count );
printf( "Bqha zaredi %d dumi", count );
} else if( menu == 2 )
{
guess_a_word( words, count );
} else if( menu == 3 )
{
write_a_word();
} else if( menu == 4 )
{
break;
}
} while(1);
return 0;
}
void guess_a_word( char words[maxrow][maxcol], int count )
{
int random, i, b = 0, stoinost = 0,letters = 0;
char word[maxrow], letter;
static int pos[maxrow];
// Prarvim sluchaino chislo v intervala ot nula do broq na dumite
srand ( time( NULL ) );
random = rand()%count;
// Blagodarenie na sluchainoto chislo vzemame sluchaina duma ot masiva s dumi
strcpy( word, words[random] );
// Pokazvame zvezdichki na mqstoto na vsqka bukva
for( i = 0; i < strlen( word ); i++ )
printf( "*" );
// Nulirane
letters = 0;
// Preborqvane broq na znacite na dumata
for( i = 0; i < strlen( word ); i++ ) {
if( ( ( word[i] >= 'a' ) && ( word[i] <= 'z' ) ) ){
letters++;
}
}
// Nulirane na rabotnite promenlivi
stoinost = 0;
b = 0;
for( i = 0; i < maxrow;i++ )
pos[i] = 0;
do {
// Prost razgranichitel
printf("\t");
// Potrebitelq vavejda bukva
scanf( "%c", &letter );
// Broene na otgorite na potrebitelq
b++;
// Cikalene prez dumata
for( i = 0; i < strlen( word ); i++ ) {
// Podsigurqvame se che nqma da chetem prazni znaci
if( !( ( letter >= 'a' ) && ( letter <= 'z' ) ) ){
break;
}
// Ako potrebitelq e poznal bukvata - otbeleji tova
if( word[i] == letter ){
pos[i] = 1;
stoinost++;
}
// Pri poznata bukva - pokaji q
if( word[i] == letter ){
printf( "%c", letter );
// Ako veche ima poznati bukvi
} else if( pos[i] ){
printf( "%c", word[i] );
// Pokaji pak * ako nishto ot gornite ne otgovarq
} else printf("*");
}
} while( stoinost != letters );
printf( "\n\n" );
printf( "Poznahte dumata '%s' s %d opita", word, b/2 );
}
void file_open_error()
{
printf( "Ima problem s otvareneto na faila. Molq proverete dali fails s ime words.txt se namira w directoriata na programata" );
}
void write_a_word()
{
char word[maxrow];
int b;
printf( "Molq vavedete jelanata ot vas duma koqto iskate da zapisha: " );
scanf( "%s", &word );
printf( "\n" );
printf( "Zapishete broq na greshnite otgovori: " );
scanf( "%d", &b );
printf( "\n" );
FILE *fp;
if( ( fp = fopen( "words.txt", "a+" ) ) == NULL )
file_open_error();
else {
fprintf( fp, "%s|%d\n", word, b );
}
fclose( fp );
}
void read_words( char words[maxrow][maxcol], int *count )
{
int i = 0;
// File pointer
FILE *fp;
if( ( fp = fopen( "words.txt", "rt" ) ) == NULL ) {
file_open_error();
} else {
do {
fscanf( fp, "%s", words[i] );
if( feof( fp ) )
break;
i++;
} while(1);
*count = i;
}
fclose( fp );
}
Сподели с приятели: |