Program wypisujący słowa z jedną samogłoską

0

Cześć!

Mam za zadanie napisać program tworzący nowy zbiór zJednaSamogloska.txt, w którym zapiszę wszystkie słowa(max.20 literowe) ze zbioru slownik.txt, w których występuje tylko jedna samogłoska (niekoniecznie 1 raz). Wszystkie litery w słowniku są zapisane dużymi literami.

Oto mój sposób na to zadanie:


#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define ROZMIAR sizeof samogloski/sizeof(char)


char samogloski[] = {'A', 'Ą', 'E', 'Ę', 'I', 'O', 'Ó', 'U', 'Y'};
int znaleziono[ROZMIAR];

int main(void)
{
	char slowo[20];

	FILE *plik1, *plik2;
	plik1 = fopen("slownik.txt", "r");
	plik2 = fopen("zJednaSamogloska.txt", "w");
	
	while (feof(plik1) == 0)
	{
		fscanf(plik1, "%s", slowo);
			
		int i, j;
		
		for (i = 0; i < ROZMIAR; i++)
			for (j = 0; slowo[j] != '\0'; j++)
				if (samogloski[i] == slowo[j])
					znaleziono[i]++;		
	
		if (znaleziono[0] != 0 && znaleziono[1] == 0 && znaleziono[2] == 0 && znaleziono[3] == 0 && znaleziono[4] == 0 && znaleziono[5] == 0 && znaleziono[6] == 0 && znaleziono[7] == 0) fprintf(plik2, "%s\n", slowo);
		else if (znaleziono[0] == 0 && znaleziono[1] != 0 && znaleziono[2] == 0 && znaleziono[3] == 0 && znaleziono[4] == 0 && znaleziono[5] == 0 && znaleziono[6] == 0 && znaleziono[7] == 0 && znaleziono[8] == 0) fprintf(plik2, "%s\n", slowo);
		else if (znaleziono[0] == 0 && znaleziono[1] == 0 && znaleziono[2] != 0 && znaleziono[3] == 0 && znaleziono[4] == 0 && znaleziono[5] == 0 && znaleziono[6] == 0 && znaleziono[7] == 0 && znaleziono[8] == 0) fprintf(plik2, "%s\n", slowo);
		else if (znaleziono[0] == 0 && znaleziono[1] == 0 && znaleziono[2] == 0 && znaleziono[3] == 0 && znaleziono[4] != 0 && znaleziono[5] == 0 && znaleziono[6] == 0 && znaleziono[7] == 0 && znaleziono[8] == 0) fprintf(plik2, "%s\n", slowo);
		else if (znaleziono[0] == 0 && znaleziono[1] == 0 && znaleziono[2] == 0 && znaleziono[3] == 0 && znaleziono[4] == 0 && znaleziono[5] != 0 && znaleziono[6] == 0 && znaleziono[7] == 0 && znaleziono[8] == 0) fprintf(plik2, "%s\n", slowo);
		else if (znaleziono[0] == 0 && znaleziono[1] == 0 && znaleziono[2] == 0 && znaleziono[3] == 0 && znaleziono[4] == 0 && znaleziono[5] == 0 && znaleziono[6] != 0 && znaleziono[7] == 0 && znaleziono[8] == 0) fprintf(plik2, "%s\n", slowo);
		else if (znaleziono[0] == 0 && znaleziono[1] == 0 && znaleziono[2] == 0 && znaleziono[3] == 0 && znaleziono[4] == 0 && znaleziono[5] == 0 && znaleziono[6] == 0 && znaleziono[7] != 0 && znaleziono[8] == 0) fprintf(plik2, "%s\n", slowo);
		else if (znaleziono[0] == 0 && znaleziono[1] == 0 && znaleziono[2] == 0 && znaleziono[3] == 0 && znaleziono[4] == 0 && znaleziono[5] == 0 && znaleziono[6] == 0 && znaleziono[7] == 0 && znaleziono[8] != 0) fprintf(plik2, "%s\n", slowo);
	
		for (i = 0; i < ROZMIAR; i++)
		znaleziono[i] = 0;
	}

	fclose(plik2);
	fclose(plik1);
	
	printf("Skonczylem");
	
return 0;
}

Podejrzewam, że można to zrobić bardziej ekonomicznie niż za pomocą if-else, bo gdybym miała 30 liter, musiałabym wypisać 30 przypadków......ale nic mi nie przychodzi do głowy... Proszę o jakieś wskazówki :)

0
char* tab = new...
while(!feof(file)){
bool cos = false;
fscanf(...,&tab);
for(char t:tab){
  if(cos) break;
  for(char c: samogloski)
    if(c == t) {fwrite(...); cos = true;  break;}}

}
 
3
#include <stdio.h>
#include <string.h>

int main(void)
  {
   const char samogloski[]="AĄEĘIOÓUYaąeęioóy",*fnd,*f;
   char slowo[20],*ptr;

   while(fscanf(stdin,"%s",slowo)==1)
     {
      fnd=NULL;
      for(ptr=slowo;*ptr;++ptr)
        {
         if((f=strchr(samogloski,*ptr))!=NULL)
           {
           	if((fnd)&&(fnd!=f))
           	  {
           	   fnd=NULL;
           	   break;
           	  }
           	fnd=f;
           }
        }
      if(fnd) fprintf(stdout,"%s\n",slowo);
     }
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1