I need to pass and integer array and number of values in the array to the sort(array[], count) function. It should return the number of swaps, not comparisons, made by the bubble sort. This code compiles and runs but I do not get the right output. Sometimes it has me continuously entering values despite the while(i < counter).
#include <stdio.h>
int sort(int array[], int count);
int main(void){
int numArray[100];
int counter, value;
printf("Enter array length \n");
scanf("%d", &counter);
int i = 0;
while(i < counter){
scanf("%d", &numArray[i]);
i++;
}
i = 0;
while(i < counter){
sort(numArray, counter);
i++;
}
i = 0;
while(i < counter){
printf("Values: %d\n", numArray[i]);
i++;
}
return 0;
}
int sort(int array[], int count){
int i, j, temp;
int swaps = 0;
for(i = 0; i < count-1; ++i){
for(j=0; j<count-1-i; ++j){
if(array[j] > array[j+1]){
temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
swaps++;
}
}
}
return swaps;
}
As your code is now, you only need to call sort(numArray, counter) once and "catch" the returned value:
int totalSwaps = sort(numArray, counter);
And print the result once:
printf("the number of swaps in bubblesort is: %d", totalSwaps);
Related
The C program(main function)asks the user for the number of elements in an array(which this function works). The C function findSecondSmallest finds the second smallest element of an array(points toward the first index). The C function sortAscending arranges the array elements in ascending order (does not display the inputted elements, just garbage values) and the C function displayArray should display the arranged array in ascending order.
#include<stdio.h>
#include<limits.h>
int initializeArray(int num,int arr[]);
int findSecondSmallest(int num,int arr[]);
int *sortAscending(int num,int arr[]);
void displayArray(int num,int arr[]);
void main(){
int array[50],*arr;
int n = sizeof(array) / sizeof(array[0]);
initializeArray(n,array);
findSecondSmallest(n,array);
arr = sortAscending(n,array);
displayArray(n,arr);
}
int initializeArray(int num,int arr[]){
int i;
printf("Input the number of elements in an array: ");
scanf("%d", &num);
printf("\nEnter %d elements: ", num);
for(i = 0;i < num;i++){
scanf("%d", &arr[i]);
}
}
int findSecondSmallest(int num,int arr[]){
int i,secondSmall,small;
small = secondSmall = INT_MAX;
for(i = 1;i < num;i++){
if(arr[i] < small){
secondSmall = small;
small = arr[i];
}else if(arr[i] < secondSmall && arr[i] > small){
secondSmall = arr[i];
}
}
printf("The second smallest element is %d", secondSmall);
}
int *sortAscending(int num,int arr[]){
int i,j,temp;
for(i = 0;i < num;i++){
for(j = i + 1;j < num;j++){
if(arr[i] > arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
void displayArray(int num,int arr[]){
int i;
for(i = 0;i < num;i++){
printf("Element at Array[%d] = %d ", i, arr[i]);
}
}
In need of help
You need to process only the elements that the user input, not the entire array, since the rest of the array is uninitialized.
Change initializeArray() to return the number of elements that the user input. Then use that instead of n when calling the other functions.
initializeArray() wasn't using the parameter num. It should use that to check that the user doesn't enter more elements than the array can hold. So you need to use a different variable for the parameter and the user's input, so you can compare them.
findSecondSmallest() doesn't return anything, so it should be declared void, not int.
sortAscending() is supposed to return a pointer to the array, but it was missing the return statement.
In findSecondSmallest() you can initialize the variables to the first element of the array rather than INT_MAX. Then it makes sense to start your loop from i = 1, since you've already used element 0.
#include<stdio.h>
#include<limits.h>
#include <stdlib.h>
int initializeArray(int num,int arr[]);
void findSecondSmallest(int num,int arr[]);
int *sortAscending(int num,int arr[]);
void displayArray(int num,int arr[]);
int main(void){
int array[50],*arr;
int n = sizeof(array) / sizeof(array[0]);
int num = initializeArray(n,array);
findSecondSmallest(num,array);
arr = sortAscending(num,array);
displayArray(num,arr);
}
int initializeArray(int n,int arr[]){
int i, num;
printf("Input the number of elements in an array: ");
scanf("%d", &num);
if (num > n) {
printf("That's too many elements\n");
exit(1);
}
printf("\nEnter %d elements: ", num);
for(i = 0;i < num;i++){
scanf("%d", &arr[i]);
}
return num;
}
void findSecondSmallest(int num,int arr[]){
int i,secondSmall,small;
small = secondSmall = arr[0];
for(i = 1;i < num;i++){
if(arr[i] < small){
secondSmall = small;
small = arr[i];
}else if(arr[i] < secondSmall && arr[i] > small){
secondSmall = arr[i];
}
}
printf("The second smallest element is %d\n", secondSmall);
}
int *sortAscending(int num,int arr[]){
int i,j,temp;
for(i = 0;i < num;i++){
for(j = i + 1;j < num;j++){
if(arr[i] > arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
void displayArray(int num,int arr[]){
int i;
for(i = 0;i < num;i++){
printf("Element at Array[%d] = %d\n", i, arr[i]);
}
}
I wrote a code for finding the sum of array elements using functions. I have written like this(mentioned below). I am getting a garbage value as output.
#include<stdio.h>
int fact(int n, int i) {
int sum = 0, arr[100];
for (i = 0; i < n; i++) {
sum = sum + arr[i];
}
return sum;
}
int main() {
int n, arr[100], i;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int sum = fact(n, i);
printf("%d", sum);
return 0;
}
Pass the array arr to your function instead of re-declaring it inside fact
PS: Change the name of your function to something meaningful like arrSum.
Code:
#include<stdio.h>
int arrSum (int arr[], int n) {
int i, sum = 0;
for (i = 0; i < n; i++) {
sum = sum + arr[i];
}
return sum;
}
int main() {
int n, arr[100], i;
scanf("%d", &n);
if(n < 0 || n > 100)
return -1;
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int sum = arrSum(arr, n);
printf("%d ", sum);
return 0;
}
I want to write a program that reads 10 int values from the user and swaps the largest and smallest numbers on the first and second values, then the rest of the numbers should be in the order.
Please check the code and help me what the wrong is.
For instance:
1
9
4
5
6
7
8
2
4
5
New order should be 9 1 4 5 6 7 8 2 4 5
#include <stdio.h>
int main() {
int a[10],i,min,max=0,pos=0;
printf("Please enter 10 int values :\n");
do{
scanf("%d", &a[pos++]);
} while (pos<10);
for (i=0; i<10;i++) {
printf("%i\n",a[i]);
if (max<a[i])
{
max=a[i];
}
if (min>a[i])
{
min=a[i];
}
for (i=0;i<10;i++) {
if (a[i]==max)
a[i]=max;
if (a[i] == min) a[i] = min;
}
printf("The new order is : %d %d %d ", max, min, ...);
return 0;
}
EDIT:
It is the new form
#include <stdio.h>
int main() {
int a[10],i,pos,temp,min = 0,max = 0;
printf("Please enter 10 int values :\n");
do {
scanf("%d", &a[pos++]);
} while (pos < 10);
for ( =1; i<10;i++) {
if (a[i]>a[max])
{
max=i;
}
if (a[i]<a[min])
{
min=i;
}
}
temp=a[max];
a[max]=a[min];
a[min]=temp;
printf("%d %d",a[max],a[min]);
for (i=0;i<10;i++){
if ((i != min) && (i != max)) {
printf("%d ", a[i]);
}
}
printf("\n");
return 0;
}
As others have noted, your code does not properly identify the maximum and minimum values in the array because you are writing min and max back into the array instead of the other way around.
Since you want to swap these values, what you actually want are the indices of the min and max values of the array, and swap those.
It is best to break this code into functions instead of having everything in main. Here is a solution that will do what you want:
#include <stdio.h>
int indexofmax(int *data, int len)
{
int max = 0;
int i;
for(i = 0; i < len; i++)
{
if(data[i]>data[max]) max = i;
}
return max;
}
int indexofmin(int *data, int len)
{
int min = 0;
int i;
for(i = 0; i < len; i++)
{
if(data[i]<data[min]) min = i;
}
return min;
}
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
// user enters in 10 ints...
int max = indexofmax(a, 10);
int min = indexofmin(a, 10);
int i;
swap(&a[min], &a[max]);
for(i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
This initialization min=0,max=0 is not right.
Instead have min = INT_MAX and max = INT_MIN.
By setting min=0, you would never get the lowest number in the array if it is greater than 0.
Similarly by setting max=0, you would never get the greatest number in the array if it is lower than 0.
You are gaining nothing by this code:
for(i=0;i<10;i++)
{ if(a[i]==max) a[i]=max;
if(a[i]==min) a[i]=min; }
It is evident that this loop
for(i=0;i<10;i++)
{ if(a[i]==max) a[i]=max;
if(a[i]==min) a[i]=min; }
does not make sense.
Moreover variable min is not initialized while variable max is initialized incorrectly.
int a[10],i,min,max=0,pos=0;
For example the array can contain all negative elements. In this case you will get incorrect value of the maximum equal to 0.
And I do not see where the elements are moved to the right to place the maximum and the minimum to the first two positions of the array.
If I have understood correctly then what you need is something like the following. To move the elements you could use standard function memmove declared in header <string.h>. However it seems you are learning loops.
#include <stdio.h>
#define N 10
int main( void )
{
int a[N] = { 4, 5, 9, 6, 7, 1, 8, 2, 4, 5 };
for (size_t i = 0; i < N; i++) printf("%d ", a[i]);
printf("\n");
size_t min = 0;
size_t max = 0;
for (size_t i = 1; i < N; i++)
{
if (a[max] < a[i])
{
max = i;
}
else if (a[i] < a[min])
{
min = i;
}
}
if (max != min)
{
int min_value = a[min];
int max_value = a[max];
size_t j = N;
for (size_t i = N; i != 0; --i)
{
if (i - 1 != min && i - 1 != max)
{
if (i != j)
{
a[j - 1] = a[i - 1];
}
--j;
}
}
a[--j] = min_value;
a[--j] = max_value;
}
for (size_t i = 0; i < N; i++) printf("%d ", a[i]);
printf("\n");
}
The program output is
4 5 9 6 7 1 8 2 4 5
9 1 4 5 6 7 8 2 4 5
You're not actually altering the array.
In the second loop, you say "if the current element is the max, set it to the max". In other words, set it to its current value. Similarly for the min.
What you want is to swap those assignments.
if(a[i]==max) a[i]=min;
if(a[i]==min) a[i]=max;
Also, your initial values for min and max are no good. min is unitialized, so its initial value is undefined. You should initialize min to a very large value, and similarly max should be initialized to a very small (i.e. large negative) value.
A better way to do this would be to keep track of the index of the largest and smallest values. These you can initialize to 0. Then you can check a[i] > a[max] and a[i] < a[min]. Then you print the values at indexes min and max, then loop through the list and print the others.
int i, temp, min=0, max=0;
for (i=1; i<10; i++) {
if (a[i] > a[max]) max = i;
if (a[i] < a[min]) min = i;
}
printf("%d %d ", a[max], a[min]);
for (i=0; i<10; i++) {
if ((i != min) && (i != max)) {
printf("%d ", a[i]);
}
}
printf("\n");
Just keep it nice and simple, like this:
#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 10
int find_biggest(int A[], size_t n);
int find_smallest(int A[], size_t n);
void print_array(int A[], size_t n);
void int_swap(int *a, int *b);
int
main(void) {
int array[MAXNUM], i, smallest, biggest;
printf("Please enter 10 int values:\n");
for (i = 0; i < MAXNUM; i++) {
if (scanf("%d", &array[i]) != 1) {
printf("invalid input\n");
exit(EXIT_FAILURE);
}
}
printf("Before: ");
print_array(array, MAXNUM);
smallest = find_smallest(array, MAXNUM);
biggest = find_biggest(array, MAXNUM);
int_swap(&array[smallest], &array[biggest]);
printf("After: ");
print_array(array, MAXNUM);
return 0;
}
int
find_biggest(int A[], size_t n) {
int biggest, i, idx_loc;
biggest = A[0];
idx_loc = 0;
for (i = 1; i < n; i++) {
if (A[i] > biggest) {
biggest = A[i];
idx_loc = i;
}
}
return idx_loc;
}
int
find_smallest(int A[], size_t n) {
int smallest, i, idx_loc;
smallest = A[0];
idx_loc = 0;
for (i = 1; i < n; i++) {
if (A[i] < smallest) {
smallest = A[i];
idx_loc = i;
}
}
return idx_loc;
}
void
print_array(int A[], size_t n) {
int i;
for (i = 0; i < n; i++) {
printf("%d ", A[i]);
}
printf("\n");
}
void
int_swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
My code doesn't sort more than ten words and I need it to sort about 2000 strings of alfabet. and string length is less than 20 characters. I made sure that the file read and write is correct. the file have a list of words less than 20 characters and each line contains one word.
the problem is that the quick sort function is not sorting for large amount of strings.
#include <stdio.h>
#include <string.h>
void quickSortMain(char items[][20], int count);
void quickSort(char items[][20], int left, int right);
int main(void)
{
int i=0, n=0;
char str[2000][20];
memset(str, 0 , sizeof(str[0][0])*20*1000);
FILE *fil;
fil=fopen("text.txt","r");
if (fil!=NULL)
{
while (!feof(fil))
{
fgets(str[i], 20, fil);
i++;
}
fclose(fil);
}
else
{
printf("can not open");
scanf("\n");
}
fil=fopen("text.txt","w");
if (fil!=NULL)
{
fclose(fil);
}
else
{
printf("can not open");
scanf("\n");
}
quickSortMain(str, i);
fil=fopen("text.txt","a");
if (fil!=NULL)
{
while(n<i)
{
fprintf(fil,"%s", str[n]);
n++;
}
fclose(fil);
}
else
{
printf("can not open");
scanf("\n");
}
return 0;
}
void quickSortMain(char items[][20], int count)
{
quickSort(items, 0, count-1);
}
void quickSort(char items[][20], int left, int right)
{
int i=left;
int j=right;
char *x=items[(left+right)/2];
char temp[right+1];
while(i <= j)
{
while((strcmp(items[i],x) < 0) && (i < right)) {
i++;
}
while((strcmp(items[j],x) > 0) && (j > left)) {
j--;
}
if(i <= j) {
strcpy(temp, items[i]);
strcpy(items[i], items[j]);
strcpy(items[j], temp);
i++;
j--;
}
}
if(left < j) {
quickSort(items, left, j);
}
if(i < right) {
quickSort(items, i, right);
}
}
The problem is the pivot. When you swap the two elements in the innermost loop:
if(i <= j) {
strcpy(temp, items[i]);
strcpy(items[i], items[j]);
strcpy(items[j], temp);
i++;
j--;
}
one of those two elements, items[i], items[j], might be the pivot. In other words x might be pointing to one of them. After the swap, x isn't pointing to the correct pivot anymore, because the values in the elements to which x is pointing to were changed.
The simplest solution is to allocate additional space for the pivot:
...
char *x=items[(left+right)/2];
char pivot[20];
strcpy(pivot, x);
x = pivot;
...
I have other things to add to 2501's answer.
You should exit program when you detect you cannot read or write the file.
I would use strcpy() rather than memset() to initialize:
for (int n = 0; n < 2000; n++)
{
strcpy(str[n], "");
}
You poorly process newline characters. You should remove them from read lines in your array, and if you don't have one, you should write a warning and skip end of line, and after that add a newline after each word when you write your file. I tested your program and having 20 length lines or a last line with no newline at the end gives bad surprises.
your Quick sort implementation is wrong !!!
Here is a Quicksort for array in C-Programme
#include <stdio.h>
#include <stdlib.h>
int * quickSort(int *A,int pivotIndex, int N);
int partition(int *A, int pivotIndex, int N);
int main(){
int N;
printf("Enter Number of Elements : ");
scanf("%d",&N);
int A[N];
printf("\nEnter Data : ");
int i=0;
for(i=0; i<N; i++)
scanf("%d",&A[i]);
int *p;
p = quickSort(A,0,(N-1));
printf("\nSorted Data : ");
for(i=0; i<N; i++)
printf("%d ",p[i]);
return 0;
}
int * quickSort(int *A, int pivotIndex, int N){
if(pivotIndex < 0 || pivotIndex > N)
return ;
int q = partition(A,pivotIndex, N);
quickSort(A, 0, (q-1));
quickSort(A, (q+1), N);
return A;
}
int partition(int *A, int pivotIndex, int N){
int i = pivotIndex;
int flag = 0;
while(flag == 0){
flag = 1;
int j = N;
int rightFlag = 0, leftFlag = 0;
while(j > i && rightFlag == 0){
if(A[i]>A[j]){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
i = j;
rightFlag = 1;
flag = 0;
}
j--;
}
if(flag == 1)
break;
flag = 1;
j = pivotIndex;
while(j < i && leftFlag == 0){
if(A[i]<A[j]){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
leftFlag = 1;
flag = 0;
i = j;
}
j++;
}
}
return i;
}
How to return array of elements from a void function in another c file. My assignment is to reverse the array in lab8.c and then use main.c to show the results I have no idea how to reverse the elements or print the results in main. Functions outside of my main cannot use printf or scanf
main.c
#include <stdio.h>
#include "lab8.h"
int main(void) {
int x[100];
int y[100];
int n = 0;
int count, i, product;
printf("Enter the length of both arrays\n");
scanf("%d", &count);
printf("Enter the %i elements of the first array\n", count);
for(i=0; i<count; i++){
scanf("%i", &x[i]);
}
printf("Enter the %i elements of the second array\n", count);
for(i=0; i<count; i++){
scanf("%i", &y[i]);
}
product = inner_product(x, y, count);
printf("Inner product of first array and second: %i\n", product);
printf("Enter the %i elements of the array\n", count);
for(i=0; i<count; i++){
scanf("%i", &n[i]);
}
reverse(n, count);
printf("Reverse of array 1: %i\n", n);
return(0);
}
lab8.c
#include <stdio.h>
#include "lab8.h"
int inner_product(int a[], int b[], int count){
int i;
int result = 0;
for( i=0; i<count; i++){
result = result + (a[i] * b[i]);
}
return result;
}
void reverse(int a[], int count){
int i, r, end = count - 1;
for(i=0; i<count/2; i++)
r = a[i];
a[i] = a[end];
a[end] = r;
end--;
}
There is one mistake in your code, the for loop in the reverse() function has no braces and hence it's just executing r = a[i] count / 2 times.
void reverse(int a[], int count) {
int i, r, end = count - 1;
for (i = 0 ; i < count / 2 ; i++) {
r = a[i];
a[i] = a[end];
a[end] = r;
end--;
}
}
and to print the result in main() just
reverse(x, count);
printf("Reverse of array 1: %i\n", n);
for (i = 0 ; i < count ; ++i)
printf("%d ", x[i]);
printf("\n");
also, do not ignore the return value of scanf() if it doesn't succeed at reading the values your program will invoke UNDEFINED BEHAVIOR, you should learn good practices right from the beginning.