this code firstly takes two words for user. Then, it check those length with a function. Then the code send the words and their length to another function for it to find commen letters in these words. The same function also print that how many commen letters they have.(The user enter just lower letter or just capital letters)
for example:
input1: emirhan
input2: celek
output: The words that you entered have 2 common letters
output shouldn't be 3 because input2 (celek) has 2 'e' and the code count just one of them.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 40
int length(char word[30]) {
int uzun;
uzun = strlen(word) - 1;
return uzun;
}
int equation(char x[MAX], char y[MAX], int length1, int length2) {
int i, j, k, l;
int sayac = 0; // sayac means counter
if (length1 >= length2) {
for (i = 0; i < length1; i++) {
for (j = 0; j < length2; i++) {
if (x[i] == y[j]) { // if the code find a common letter,it will enter if
sayac++;
for (k = i + 1; k < length1; k++) { //This 'for' check that does first word same letter or not?
if (x[k] == x[i]) {
sayac--;
}
}
for (l = j + 1; l < length2; l++) { //This 'for' check that does second word same letter or not?
if (y[l] == y[j]) {
sayac--;
}
}
}
}
}
}
if (length1 < length2) {
for (i = 0; i < length2; i++) {
for (j = 0; j < length1; i++) {
if (x[i] == y[j]) {
sayac++;
for (k = i + 1; k < length2; k++) {
if (x[k] == x[i]) {
sayac--;
}
}
for (l = j + 1; l < length1; l++) {
if (y[l] == y[j]) {
sayac--;
}
}
}
}
}
}
printf("The words that you entered have %d common letters", sayac);
}
int main() {
char x[MAX]; //input1
char y[MAX]; //input2
int length1; // length of first word
int length2; // length of second word
printf("PLS, enter the first word:");
fgets(x, sizeof(x), stdin);
printf("PLS, enter the second word:");
fgets(y, sizeof(y), stdin);
length1 = length(x);
length2 = length(y);
equation(x, y, length1, length2);
return 0;
}
I edited the my code again and I solved the problem. I had a mistake in loops. I coded loops again.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 40
int length(char word[30]) {
int uzun;
uzun = strlen(word) - 1;
return uzun;
}
void equation(char x[MAX], char y[MAX], int length1, int length2) {
int i, j, k, l;
int sayac = 0; // sayac means counter
for (i = 0; i < length1; i++) {
for (j = 0; j < length2; j++) {
if (x[i] == y[j]) { // if the code find a common letter,it will enter if
sayac++;
for (k = i + 1; k < length1; k++) { //This 'for' check that does first word same letter or not?
if (x[k] == x[i]) {
sayac--;
}
}
for (l = j + 1; l < length2; l++) { //This 'for' check that does second word same letter or not?
if (y[l] == y[j]) {
sayac--;
}
}
}
}
}
printf("The words that you entered have %d common letters", sayac);
}
int main() {
char x[MAX]; //input1
char y[MAX]; //input2
int length1; // length of first word
int length2; // length of second word
printf("PLS, enter the first word:");
fgets(x, sizeof(x), stdin);
printf("PLS, enter the second word:");
fgets(y, sizeof(y), stdin);
length1 = length(x);
length2 = length(y);
equation(x, y, length1, length2);
return 0;
}
Related
I have made one program, where you enter a few characters (10 max). It makes you a list, count average length of surnames, tell about how much different names. But the problem is, when I enter the last number (10) - it sorts me it incorrectly (like 1, 10, 2, 3, 4, 5, 6, 7, 8, 9). Beneath I will present my code.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct people {
char num[2];
char surname[20];
char name[10];
} peoples[10], c;
int main()
{
int i, j, k = 0, l = 0, m = 0, n = 0;
float s = 0;
char str[100];
system("chcp 1251 > nul");
for (i = 0, j = 0; i < 10; i++, j++)
{
printf("Enter number, surname, name %d of your human: ", i + 1);
gets(str);
while (str[n] != '\n')
{
if (str[n] != ' ')
{
peoples[j].num[k] = str[n];
}
else
break;
n++;
k++;
}
n++;
k = 0;
while (str[n] != '\n')
{
if (str[n] != ' ')
{
peoples[j].surname[k] = str[n];
}
else
break;
n++;
k++;
}
n++;
k = 0;
while (str[n] != '\n')
{
if (str[n] != '\0')
{
peoples[j].name[k] = str[n];
}
else
break;
n++;
k++;
}
n = 0;
k = 0;
}
for (i = 0; i < 10; i++)
{
for (j = i + 1; j < 10; j++)
{
if (!strcmp(peoples[i].name, peoples[j].name))
m = 1;
}
if (m == 0)
l++;
m = 0;
s = s + strlen(peoples[i].surname);
}
for (i = 0; i < 9; i++)
for (j = 0; j < 9; j++)
if (strcmp(peoples[j].num, peoples[j+1].num) > 0)
{
c = peoples[j+1];
peoples[j+1] = peoples[j];
peoples[j] = c;
}
for (i = 0; i < 10; i++)
{
printf("%s ", peoples[i].num);
printf("%s ", peoples[i].name);
printf("%s ", peoples[i].surname);
printf("\n");
}
printf("\nYou have %d different names\n", l);
printf("Avarege lenght of surname is = %f\n", s / 10);
}
If you want to give numeric input, then use actual numeric data.
Change the num field to become an int instead of a single-character string:
struct people {
int num;
char surname[20];
char name[10];
};
Use fgets to read the line:
fgets(str, sizeof str, stdin);
[Error checking left as exercise for reader]
Then use e.g. sscanf for parse your string:
sscanf(str, "%d %s %s", &peoples[j].num, &peoples[j].name, &peoples[j].name);
[Error checking left as exercise for reader]
And finally, instead of doing your own sorting use the standard qsort function:
qsort(peoples, 10, sizeof(struct people), &compare_people_num);
With the comparison function being something like this:
int compare_people_num(const void *a, const void *b)
{
const struct people *p1 = a;
const struct people *p2 = b:
return p1->num - p2->num; // Change order to reverse sort
}
Using sscanf and qsort will make your code much simpler and easier to understand.
Code:
#include <stdio.h>
#include <string.h>
void check(char *s, char *b)
{
int l, l1;
l = strlen(s);
l1 = strlen(b);
int i = 0, j = 0, count = 0;
while (i < l & j < l1)
{
if (s[i] == b[j])
{
j = j + 1;
count++;
}
i = i + 1;
}
if (count == l1)
{
printf("POSITIVE");
}
else
{
printf("NEGATIVE");
}
}
int main()
{
char s[100], b[100];
scanf("%s", s);
int a, i;
scanf("%d", &a);
for (i = 0; i < a; i++)
{
scanf("%d", &b[i]);
check(s, b);
}
}
Input:
CORONAVIRUS
3
abdce
ravus
onarous
Expected output:
NEGATIVE
POSITIVE
NEGATIVE
My output is like:
NEGATIVENEGATIVENEGATIVE
This is wrong.
scanf("%d", &b[i]);
You have asked the compiler to expect a int input by writing %d. However, you are entering a string. Change it to:
scanf("%s", b);
Also, you are making comparisons between lowercase and uppercase. In that case, change the lowercase character to uppercase character using the function toupper(). Or alternatively use tolower() to change it to lower case.
Your comparison should look like this to make case insensitive character comparison.
if (s[i] == b[j])
Change it to:
if (s[i] == b[j] || s[i]==toupper(b[j]) || tolower(s[i])==b[j])
Your complete code may look like this:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void check(char *s, char *b)
{
int l, l1;
l = strlen(s);
l1 = strlen(b);
int i = 0, j = 0, count = 0;
while (i < l & j < l1)
{
if (s[i] == b[j] || s[i]==toupper(b[j]) || tolower(s[i])==b[j])
{
j = j + 1;
count++;
}
i = i + 1;
}
if (count == l1)
{
printf("POSITIVE\n");
}
else
{
printf("NEGATIVE\n");
}
}
int main()
{
char s[100], b[100];
scanf("%s", s);
int a, i;
scanf("%d", &a);
for (i = 0; i < a; i++)
{
scanf("%s", b);
check(s, b);
}
return 0;
}
hii guys i need a serious help
i m trying to write a code for finding anagrams in input sentence
but when the if function is getting strcmp it stops and its not accepting the condition. any body know why is that happening
Basically my code supposed to do two things one is taking a sentence from the user and making the words appear in the Backwoods order two Its need to take the whole sentence and look for anagrams ( anagram means that there is the same letters but in a different order for example this and shit are anagrams) thank you very much for your help :)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int index_for_word_start, words_num = 1,amount_of_letters;
int i, j, k;
char inpot_Sentence[1001], temp_letters;
char **words,**sorting_words;
int counter = 0,counter_max_for_anegram=0;
printf_s("Please enter the sentence, and then press Enter:\n");
gets(inpot_Sentence);
/////////////////////////////makeing the sentence backwards///////////////////////
for (i = 0; inpot_Sentence[i] != '\0'; i++) //loop for counting how many words(it will be use to know how many pointer we need)
{
if (inpot_Sentence[i] == ' ')
{
words_num++;
}
}
words = (char **)malloc(sizeof(char *)*words_num); //malloc for pointers that point on the pointer of the word
index_for_word_start = 0;
for (j = 0; j<words_num; j++)
{
for (i = index_for_word_start; inpot_Sentence[i] != ' '; i++)
{
if (!inpot_Sentence[i]) //if the user didnt put any word(break)
{
break;
}
}
words[j] = (char*)malloc(sizeof(char)*(i - index_for_word_start + 1)); //malloc of pointers that point on each word
strncpy_s(words[j], i - index_for_word_start+1, &inpot_Sentence[index_for_word_start], i - index_for_word_start); //copy the words from inpot sentence to array
words[j][i - index_for_word_start] = 0; //puts '\0' after the word copy ends
index_for_word_start = i + 1;
}
printf_s("\nThe reverse sentence is:\n");
for (i = words_num - 1; i >= 0; i--) //print the words in backwards Sequence
{
printf("%s ", words[i]);
}
putchar('\n');
i = 0;
/////////////////////anegrams check///////////////////////
for (j = 0; j < words_num; j++) //loops that Arrange the array by haski value
{
amount_of_letters = strlen(words[j]);
for ( i = 0; i < amount_of_letters; i++)
{
for (k = 0; k < amount_of_letters; k++)
{
if (words[j][i]<words[j][k])
{
temp_letters = words[j][i];
words[j][i] = words[j][k];
words[j][k] = temp_letters;
}
}
}
printf_s("this is words %s\n", words[j]);
}i = 0;
for ( j = 0; j < words_num-1; j++)
{
for ( i = 0; i < words_num-1; i++)
{
if (!strcmp(words[j],words[i]) && (i!=j) && (strcmp(words[j],"\0")))
{
counter++;
words[i] = 0;
}
else
{
break;
}
}
if (counter>counter_max_for_anegram)
{
counter_max_for_anegram = counter;
}
counter = 0;
}
printf_s("%d\n", counter_max_for_anegram);
for ( j = 0; j < words_num; j++)
{
free(words[j]);
}
free(words);
}
#include <stdio.h>
#include <string.h>
int check_anagram(char[],char[]);
int main()
{
char a[100],b[100];
int flag;
puts("Enter the first string");
fgets(a,100,stdin);
a[strcspn(a, "\r\n")] = '\0';
puts("Enter the second string");
fgets(b,100,stdin);
b[strcspn(b, "\r\n")] = '\0';
flag=check_anagram(a,b);
if(flag)
printf("%s and %s are anagrams",a,b);
else
printf("%s and %s are not anagrams",a,b);
}
int check_anagram(char a[], char b[])
{
int first[26]={0},second[26]={0},c=0;
while(a[c]!='\0')
{
first[a[c]-'a']++;
c++;
}
c=0;
while(b[c]!='\0')
{
second[b[c]-'a']++;
c++;
}
for(c=0;c<26;c++)
{
if(first[c]!=second[c])
return 0;
}
return 1;
}
C program for removal of duplicate characters from the given string. It uses the O(n2) can we do it in O(n) order. Please comment on this program.
int main()
{
char a[100],b[100],temp='\0';
int i,n,j,count=0,p=0,k=0;
printf("ENTRE THE STRING \n");
scanf("%s",a);
n = strlen(a);
i=0;
while(i < n)
{
count=0;
temp = a[i];
for(j = i ; j < n ; j++ )
{
if(temp==a[j])
{
count++;
}
}
if(count<2)
{
b[k] = temp;
k++;
}
i++;
}
b[k]='\0';
printf("THE RESULTED STRING IS \n");
for(p = 0 ; p < k ; p++)
printf("%c ",b[p]);
printf("\n");
return 0;
}
You can create a O(n) algorithm for this.
Steps:
Create another array bucket[] with size 255. (Should adjust all the characters)
Initialise every element in bucket[] to 0.
Run a loop and increment the bucket[] at the index a[i].
Now, run another loop through the bucket[], if bucket[i] > 0, append the (char) i to the b[] array.
Code:
#include <stdio.h>
#include <string.h>
int main()
{
char a[100], b[100];
int bucket[256] = {0};
int i;
printf("Enter the string:");
scanf("%s",a);
int n = strlen(a);
for(i = 0; i < n; ++i)
{
//Incrementing the character count of each character.
bucket[a[i]]++;
}
//Keep track of the index where the next character is to be appended.
int b_pos = 0;
for (i = 0; i < 256; ++i)
{
//Character occurs in a[], we don't care if it occurs once
//or twice, we just need one instance of it.
if (bucket[i] > 0)
{
b[b_pos] = (char) i;
b_pos++;
}
}
b[b_pos] = '\0';
printf("Modified string : %s",b);
}
Take a look at this:
int main()
{
char a[100],b[100];
int i,n,j,count=0,k=0;
printf("ENTRE THE STRING \n");
scanf("%s",a);
n = strlen(a);
b[0] = a[0];
k = 1;
for(i=1;i<n;i++)
{
for(j=0;j<i;j++)
{
if(a[i] == b[j])
{
count = 1;
break;
}
}
if(count == 0)
{
b[k] = a[i];
k++;
}
else
{
count = 0;
}
}
b[k] = 0;
printf("RESULT %s",b);
return 0;
}
I've nearly finished my anagram solver program where I input two strings and get the result of whether they are anagrams of each other. For this example i'm using 'Payment received' and 'Every cent paid me'.
The problem i'm getting is when I output the letterCount arrays, letterCount1 is incorrect (it doesn't think there is a character 'd' but there is.) but letterCount2 is correct.
Can anyone see a problem with this because i'm completely baffled?
#include <stdio.h>
#include <string.h>
int checkAnagram(char string1[], char string2[])
{
int i;
int count = 0, count2 = 0;
int letterCount1[26] = {0};
int letterCount2[26] = {0};
for(i = 0; i < strlen(string1); i++)
{
if(!isspace(string1[i]))
{
string1[i] = tolower(string1[i]);
count++;
}
}
for(i = 0; i < strlen(string2); i++)
{
if(!isspace(string2[i]))
{
string2[i] = tolower(string2[i]);
count2++;
}
}
if(count == count2)
{
for(i = 0; i < count; i++)
{
if(string1[i] >='a' && string1[i] <= 'z')
{
letterCount1[string1[i] - 'a'] ++;
}
if(string2[i] >='a' && string2[i] <= 'z')
{
letterCount2[string2[i] - 'a'] ++;
}
}
printf("%s\n", string1);
for(i = 0; i < 26; i++)
{
printf("%d ", letterCount1[i]);
printf("%d ", letterCount2[i]);
}
}
}
main()
{
char string1[100];
char string2[100];
gets(string1);
gets(string2);
if(checkAnagram(string1, string2) == 1)
{
printf("%s", "Yes");
} else
{
printf("%s", "No");
}
}
That's because your count holds the count of non-space characters, but you keep the strings with the spaces.
For example, the string "hello world" has 11 characters, but if you run it through the loops your count will be 10 (you don't count the space). However, when you later go over the strings and count the appearance of each letter, you will go over the first 10 characters, therefore completely ignoring the last character - a 'd'.
To fix it, you need to go over all characters of the string, and only count the alphanumeric ones.
I fixed it for you:
#include <stdio.h>
#include <string.h>
int checkAnagram(char string1[], char string2[])
{
int i;
int count = 0, count2 = 0;
int letterCount1[26] = {0};
int letterCount2[26] = {0};
int len1 = strlen(string1);
int len2 = strlen(string2);
for(i = 0; i < len1; i++)
{
if(!isspace(string1[i]))
{
string1[i] = tolower(string1[i]);
count++;
}
}
for(i = 0; i < len2; i++)
{
if(!isspace(string2[i]))
{
string2[i] = tolower(string2[i]);
count2++;
}
}
if(count == count2)
{
for (i=0; i<len1; i++)
if (!isspace(string1[i]))
letterCount1[string1[i]-'a']++;
for (i=0; i<len2; i++)
if (!isspace(string2[i]))
letterCount2[string2[i]-'a']++;
int flag = 1;
for(i = 0; flag && i < 26; i++)
if (letterCount1[i] != letterCount2[i])
flag = 0;
return flag;
}
return 0;
}
main()
{
char string1[100];
char string2[100];
gets(string1);
gets(string2);
if(checkAnagram(string1, string2) == 1)
{
printf("%s", "Yes");
} else
{
printf("%s", "No");
}
}
First, don't calculate an string's length inside a loop. I extracted them into len1 and len2 variables.
Second, your loop was wrong! You shouldn't go up to count, you should go up to that string's length.
Third, you didn't return anything from checkAnagram function.