Here is the code building a table of contents which i felt correct from every sense but output is somewhat unsatisfactory.

#include<stdio.h>
#include<limits.h>
#include<stdlib.h>

int**buildtable(void);
  void filltable(int**table);
	void processtable(int**table);
	int smaller(int first,int second);
	int larger(int first,int second);
	int rowMinimum(int*rowPtr);
	int rowMaximum (int*rowPtr);
	float rowAvg(int*rowPtr);

int main()
{int**table;

table=buildtable();
filltable(table);
processtable(table);
return 0;
}

int**buildtable()
{int rowNum;
int colNum;
int**table;
int row;
printf("\nEnter the number of rows in the table:");
scanf("%d",&rowNum);
table=(int**) calloc(rowNum+1,sizeof(int*));
for(row=0;row<rowNum;row++)
{printf("Enter the no of integer in row%d",row+1);
scanf("%d",&colNum);
 table[row]=(int*)calloc(colNum+1,sizeof(int));
table[row][0]=colNum;
}
table[row]=NULL;
return table;
}
void filltable(int**table)
{
int row=0;
int column;
printf("\nNow we fill the table\n");
printf("\nFor each row enter the data");
printf("\nand press return:");
while(table[row]!=NULL)
{
printf("\n row %d(%d integers)===>",row+1,table[row][0]);
for ( column=1;column<=*table[row];column++);//goto OUTPUT PROBLEM
scanf("%d",table[row]+column);
row++;
}return;
}
void processtable(int** table)
{int row =0,rowMax,rowMin;
float ravg;
while(table[row]!=NULL)
{rowMin=rowMinimum(table[row]);
rowMax=rowMaximum(table[row]);
ravg=rowAvg(table[row]);
printf("\nThe statistics for row%d",row+1);
printf("\nThe minimum:%5d",rowMin);
printf("\nThe maximum:%5d",rowMax);
printf("\nThe avg.:%8.2f",ravg);
row++;
}
}
int rowMinimum (int*rowPtr)
{int rowMin =INT_MAX,column;
printf("\nINT_MAX:",rowMin);

for(column=1;column<=*rowPtr;column++)
{
rowMin=smaller(rowMin,*(rowPtr+column));
}return rowMin;
}
int rowMaximum(int*rowPtr)
{int rowMax=INT_MIN,column;
printf("\nINT_MIN:",rowMax);

for(column=1;column<=*rowPtr;column++)
rowMax=larger(rowMax,*(rowPtr+column));
return rowMax;
}
float rowAvg(int*rowPtr)
{float total=0;
float ravg; int column;
for(column=1;column<=*rowPtr;column++)
total+=(float)*(rowPtr+column);
ravg=total/ *rowPtr;
return ravg;
}

int smaller(int first,int second)
{return(first<second ? first:second);
}
int larger (int first,int second)
{return(first>second?first:second);
}

OUTPUT PROBLEM:
Here Minimum ,Maximum and Average Value are all zero.
Also where i commented in the code as "goto" here scanf() should take inputs according to the user but it is taking only one input per row.

Recommended Answers

All 2 Replies

Hi linkingeek, welcome to this forum.
Could you please post using code tags?
This makes the code much more readable.

#include<stdio.h>
#include<limits.h>
#include<stdlib.h>

int**buildtable(void);
void filltable(int**table);
void processtable(int**table);
int smaller(int first,int second);
int larger(int first,int second);
int rowMinimum(int*rowPtr);
int rowMaximum (int*rowPtr);
float rowAvg(int*rowPtr);

/*Function declaration*/

int main()
{
int**table;
table=buildtable();
filltable(table);
processtable(table);
return 0;
}

int**buildtable()
{int rowNum;
int colNum;
int**table;
int row;
printf("\nEnter the number of rows in the table:");
scanf("%d",&rowNum);
table=(int**) calloc(rowNum+1,sizeof(int*));
for(row=0;row<rowNum;row++)
{
printf("Enter the no of integer in row%d",row+1);
scanf("%d",&colNum);
table[row]=(int*)calloc(colNum+1,sizeof(int));
table[row][0]=colNum;
}
table[row]=NULL;
return table;
}


void filltable(int**table)
{
int row=0;
int column;
printf("\nNow we fill the table\n");
printf("\nFor each row enter the data");
printf("\nand press return:");

while(table[row]!=NULL)
{
printf("\n row %d(%d integers)===>",row+1,table[row][0]);
for ( column=1;column<=*table[row];column++);
scanf("%d",table[row]+column);
row++;
}

/*Here only one input is taken by the user but it should be according to the "*table[row]"*/

return;
}


void processtable(int** table)
{int row =0,rowMax,rowMin;
float ravg;
while(table[row]!=NULL)
{
rowMin=rowMinimum(table[row]);
rowMax=rowMaximum(table[row]);
ravg=rowAvg(table[row]);
printf("\nThe statistics for row%d",row+1);
printf("\nThe minimum:%5d",rowMin);
printf("\nThe maximum:%5d",rowMax);
printf("\nThe avg.:%8.2f",ravg);
row++;
}
}

int rowMinimum (int*rowPtr)
{
int rowMin =INT_MAX,column;

printf("\nINT_MAX:",rowMin);

Here no INT_MAX value is printed by the compiler instead of including<limits.h>

for(column=1;column<=*rowPtr;column++)
{
rowMin=smaller(rowMin,*(rowPtr+column));
}return rowMin;
}

int rowMaximum(int*rowPtr)
{
int rowMax=INT_MIN,column;

printf("\nINT_MIN:",rowMax);

/*Same here*/

for(column=1;column<=*rowPtr;column++)
rowMax=larger(rowMax,*(rowPtr+column));
return rowMax;
}

float rowAvg(int*rowPtr)
{
float total=0;
float ravg; int column;
for(column=1;column<=*rowPtr;column++)
total+=(float)*(rowPtr+column);
ravg=total/ *rowPtr;
return ravg;
}

/*Here this part recieves "*rowPtr" from table[row]
which seems to be correct:-O even than output is "0.00"

int smaller(int first,int second)
{
return(first<second ? first:second);
}
int larger (int first,int second)
{
return(first>second?first:second);
}

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.