|
By "loops" do you mean "collections"? Or "arrays"? Or something like that?
Can you do something like if ( ( collection1.count == 0 ) && ( collection2.count == 0 ) ) ...
|
|
|
|
|
Hey thank you for answer, I shared question originally and also how can identify your collection1.count and 2. yes should be like this.
Thank you
Voltage readings are obtained from an electrical substation once every hour for six hours (so there are six
readings). Write a C program to perform the following checks on the substation:
a) display all voltages that differ from the average by more than 10% of the average.
b) display all pairs of consecutive hours where the change from the voltage at one hour
to the next is greater than 15% of the average.
Example 1
Enter 6 voltages: 210.1 223.2 189.6 206.2 235.1 215.0
The average is 213.2 volts.
10% = 21.3 volts.
15% = 32.0 volts.
The following problems occurred:
1. Voltage at hour 3 was 189.6 volts (difference of 23.6 volts).
2. Voltage at hour 5 was 235.1 volts (difference of 21.9 volts).
3. Voltage change from hour 2 to hour 3 was 33.6 volts.
Example 2
Enter 6 voltages: 233.1 201.0 221.5 240.2 222.7 208.1
The average is 221.1 volts.
10% = 22.1 volts.
15% = 33.2 volts.
No problems were encountered.
I created project but when I put any think in for loops coming 11 "No problems were encountered"
or put under for loops this result coming sometimes with voltage results.
|
|
|
|
|
We cannot help unless you show the code that is causing the problems.
|
|
|
|
|
#include <stdio.h>
#include <math.h>
#include <string.h>
int i;
float volt[6];
float avg, avg10, avg15, total, a, b;
int main () {
total= 0 ;
avg = 0;
printf("Enter 6 Volts of Machine\n");
for ( i=0; i<6; i++) {
printf("Type %d. volt", i+1);
scanf("%f",&volt[i]);
total = total + volt[i];
}
avg = total/6;
avg10 = (avg * 10) / 100;
avg15 = (avg * 15) / 100;
printf("------------------------------------------\n");
printf("The machine Avarage Voltage is %.2f\n", avg);
printf("The Machine Avarage is%.2f\n", avg10);
printf("The Machine 15 Avarage is%.2f\n\n\n", avg15);
for (i=0;i<6;i++) {
a = fabs(volt[i] - avg);
if( a > avg10 ) {
printf("\nVoltage at hour %d was %.2f volts (diffrence of %.2f volts)\n\n", i+1, volt[i], a);
}
}
for (i=0; i<5; i++) {
b = fabs(volt[i+1] - volt[i]);
if( b > avg15) {
printf("\nVoltage change from hour %d to hour %d was %.2f\n\n", i+1, i+2, b);
}
}
}
|
|
|
|
|
I did not see any issue in above code. But what condition you are checking to show the comment - No Issues in voltage?
|
|
|
|
|
I need if not any voltage problem to print
"No problems were encountered.
but just one result. How can I do? Code is right not any problem in code just I need information how can add this print?
|
|
|
|
|
You just need to add a boolean value to indicate whether any problems were found in either of the loops. So your code would have the following additions:
int voltageProblem = 0;
for (i=0;i<6;i++) {
a = fabs(volt[i] - avg);
if( a > avg10 ) {
printf("\nVoltage at hour %d was %.2f volts (diffrence of %.2f volts)\n\n", i+1, volt[i], a);
voltageProblem = 1;
}
}
if (voltageProblem == 0) {
printf("No problems were encountered.\n");
}
|
|
|
|
|
Richard MacCutchan Thank you so much, you are amazing! I tried but wrong first under curly brackets and second I tried
voltageproblem++
.
.
if (voltageproblem==0)
.
.
anyway Just thank you so much. Happy coding
|
|
|
|
|
Happy to help. Good luck in the future.
|
|
|
|
|
And you have some code ?
Patrice
“Everything should be made as simple as possible, but no simpler.” Albert Einstein
|
|
|
|
|
Read the thread messages.
|
|
|
|
|
you should have used "Edit" in first message.
Everyone will read your first message, but it is unlikely that everyone will read discussion when not involved.
Patrice
“Everything should be made as simple as possible, but no simpler.” Albert Einstein
|
|
|
|
|
Reading the messages first helps to decide whether there is any point in posting a response. Something that I generally do, especially when it is obvious that the thread has a conversation going between OP and another CP member.
|
|
|
|
|
Hi Freinds,
I have combobox control in my mfc application. Here I am adding an item with an empty string and 2 more item with some txt.
if i am navigating through the items, if empty string get selected, it draws a dotted boundary, but when other item is getting selected, dotted boundary of empty string is not getting cleared. So basically I can see 2 items selected at the same time.
please help me out.
Regards,
Amrit
|
|
|
|
|
You could just intercept the DrawItem call and for any empty string simply clear the lpDrawItemStruct->rcRect manually and then pass all the calls thru to the normal drawitem. lpDrawItemStruct has everything you need to know what to draw
lpDrawItemStruct->itemID it the string number
lpDrawItemStruct->itemState & ODS_SELECTED will tell give you if it is selected or not.
lpDrawItemStruct->rcRect is the area to draw in
In vino veritas
|
|
|
|
|
Hi
If have a class member say CFont cf; which is a member of My CDialig derived class which I create on the heap via new
Does storage for cf get allocated when I do the new for the CDialog derived class
Thanks
|
|
|
|
|
Yes, storage for class members will be allocated when the object is created. In the case of class objects (such as your CFont object) their constructor will be called to create them. You can see this happen by stepping through the code in the debugger.
|
|
|
|
|
Code source de FIFO,LIFO,SJF,Round Robin en langage C?
|
|
|
|
|
Hi,
Is it that time of year again? Sorry, we have past our own exams, and are not going to sit yours. I suggest you read a few books on the subject.
Regards and Success
Bram van Kampen
|
|
|
|
|
What about a little study ?
and a little work by yourself ?
Patrice
“Everything should be made as simple as possible, but no simpler.” Albert Einstein
|
|
|
|
|
|
Is the first method correct for all the platforms?
I describe the three methods in the following code:
#include <stdio.h>
#include <iostream>
using namespace std;
#define YMAX 6
#define XMAX 4
void print_data2d(float *matriz[XMAX],int max1,char *method);
void print_data2d(float (*matriz)[XMAX],int max1,char *method);
void print_adress(float (*matriz)[XMAX],int ymax,char *method);
void print_adress(float *matriz[XMAX],int ymax,char *method);
void print_data2d(float *matriz,int ymax,int xmax,char *method);
void print_data2d(float **matriz,int ymax,int xmax,char *method);
int main()
{
int x,y;
float *matriz1_m=new float[XMAX*YMAX];
float (*matriz1)[XMAX]=(float (*)[XMAX]) &matriz1_m[0];
float (*matriz2)[XMAX]=new float[YMAX][XMAX];
float *matriz3[YMAX];
for (y=0;y<YMAX;y++)
matriz3[y]=new float[XMAX];
float **matriz4 = new (float*[YMAX]);
for (int y = 0; y < YMAX; y++)
matriz4[y] = new float[XMAX];;
for (y=0;y<YMAX;y++)
for (x=0;x<XMAX;x++)
{
matriz1[y][x]=matriz2[y][x]=matriz3[y][x]=matriz4[y][x]=(y+1)*1000.0f+x;
}
print_data2d(&matriz1[0][0],YMAX,XMAX,"Values 1st method");
print_data2d(matriz3,YMAX,XMAX,"Values 3rd method");
print_data2d(matriz4,YMAX,XMAX,"Values 4th method");
print_data2d(matriz1,YMAX,"Values 1st method");
print_data2d(matriz2,YMAX,"Values 2nd method");
print_data2d(matriz3,YMAX,"Values 3rd method");
print_data2d(matriz4,YMAX,"Values 4rd method");
print_adress( matriz1,XMAX,"Adress 1st method");
print_adress( matriz2,XMAX,"Adress 2nd method");
print_adress( matriz3,XMAX,"Adress 3rd method");
print_adress( matriz4,XMAX,"Adress 3rd method");
long size=sizeof(float)*XMAX*YMAX;
printf("\nMinimum =%li",size);
size= (sizeof(float) + (long) (&matriz1[YMAX-1][XMAX-1]) ) - (long) &matriz1[0][0];
printf("\nArray 1 =%li",size);
size= (sizeof(float) + (long) (&matriz2[YMAX-1][XMAX-1]) ) - (long) &matriz2[0][0];
printf("\nArray 2 =%li",size);
size= (sizeof(float) + (long) (&matriz3[YMAX-1][XMAX-1]) ) - (long) &matriz3[0][0];
printf("\nArray 3 =%li",size);
size= (sizeof(float) + (long) (&matriz4[YMAX-1][XMAX-1]) ) - (long) &matriz4[0][0];
printf("\nArray 4 =%li",size);
delete matriz1_m;
delete[] matriz2;
for (int y=0;y<YMAX;y++)
delete matriz3[y];
for (int y=0;y<YMAX;y++)
delete matriz4[y];
printf("\n\n=== END ===");getchar();getchar();
return 1;
}
void print_adress(float (*matriz)[XMAX],int xmax,char *method)
{
cout << "\n============= INI DIR "<< method << "=============\n";
int x,y;
for (y=0;y<YMAX;y++)
{
for (x=0;x<xmax;x++)
cout << ((long) (&matriz[y][x]) - (long) (&matriz[0][0])) << '\t';
cout <<endl;
}
cout << "\n============= END DIR "<< method << "=============\n";
}
void print_adress(float *matriz[XMAX],int xmax,char *method)
{
cout << "\n============= INI DIR "<< method << "=============\n";
int x,y;
for (y=0;y<YMAX;y++)
{
for (x=0;x<xmax;x++)
cout << ((long) (&matriz[y][x]) - (long) (&matriz[0][0])) << '\t';
cout <<endl;
}
cout << "\n============= END DIR "<< method << "=============\n";
}
void print_data2d(float *matriz[XMAX],int maxy,char *method)
{
cout << "\n============= INI VAL "<< method << "=============\n";
long y,x;
for (y=0;y<maxy;y++)
{
for (x=0;x<XMAX;x++)
{
cout << matriz[y][x] <<'\t';
}
cout <<endl;
}
cout << "============= FIN VAL "<< method << "=============\n";
}
void print_data2d(float (*matriz)[XMAX],int maxy,char *method)
{
cout << "\n============= INI VAL "<< method << "=============\n";
long y,x;
for (y=0;y<maxy;y++)
{
for (x=0;x<XMAX;x++)
{
cout << matriz[y][x] <<'\t';
}
cout <<endl;
}
cout << "============= FIN VAL "<< method << "=============\n";
}
void print_data2d(float **matriz3,int ymax,int xmax,char *method)
{
cout << "\n============= INI VAL "<< method << "=============\n";
long y,x;
for (y=0;y<ymax;y++)
{
for (x=0;x<xmax;x++)
{
cout << matriz3[y][x] <<'\t';
}
cout <<endl;
}
cout << "============= FIN VAL "<< method << "=============\n";
}
void print_data2d(float *matriz1,int ymax,int xmax,char *method)
{
cout << "\n============= INI VAL "<< method << "=============\n";
long y,x;
for (y=0;y<ymax;y++)
{
for (x=0;x<xmax;x++)
{
cout << matriz1[y*xmax+x] <<'\t';
}
cout <<endl;
}
cout << "============= FIN VAL "<< method << "=============\n";
}
modified 30-Apr-16 5:09am.
|
|
|
|
|
Hi,
Four Questions:
1st: What do you mean by 'Different Platforms' It's all standard CPP, Standard Libraries, etc. Should work on any machine that supports a CPP Compiler to ISO Standards.
2nd: Does it Work! (I Don't see any obvious errors at a Glance, but a First Glance can be deceiving in this game, which is the reason we do debugging. I am not willing to do that for you, but I'll offer Help if you encounter a Difficulty.)
3rd: What are you trying to prove, apart from that there is more than one way to skin a Cat (or in this case, write a piece of Code) Otherwise, Did you provide a Crude Example of a Bigger Problem, but you are trying to touch the basics, by simplifying the problem, (and sometimes by Abstracting the problem, hiding the real issues that you try to discuss). For Instance, did you abstract the concept of MFC Classes down to Floating Point Variables.
4th: If it all works, Why pose the question in the first place. (In other words, What was the real question!)
Kind Regards
Bram van Kampen
modified 29-Apr-16 21:35pm.
|
|
|
|
|
You are right, the second method of course works and is my preferred method as long as I do not need a loop to create and delete it, but I have to be careful when sending the array to a function.
Thank you to advise that the first one fits with iso standard.
|
|
|
|
|
You seem to have yourself very confused on pointer dereferencing and memory allocation. You are trying to assign "right way" to something that has nothing to do with the language but what is essentially about memory ownership.
Your version 3 is mongrel of a thing and NOT CLASSICAL AT ALL. Look carefully at what it is which is an array of pointers on the stack if within a function or on the heap if globally assigned and into which you place allocated memory. YUCK writing any function via pointer reference to access that abomination would be fun and dangerous it's not necessarily a persistent structure unless defined globally.
So how about I give you 4 WHICH IS ACTUALLY THE CLASSICAL VERSION
float **matriz3 = new (float*[YMAX]);
for (int y = 0; y < YMAX; y++)
matriz3[y] = new float[XMAX];;
float **matriz3 = (float**)malloc(YMAX * sizeof(float*));
for (int y = 0; y < YMAX; y++)
*matriz3[y] = (float*)malloc(XMAX *sizeof(float));
So now you have another one and all of them are perfectly fine within the contexts of what they were designed to do although 3 is of very limited use locally. You would need to take care passing a reference to your version 3. Method 4 is usable anywhere and someone needs to take responsibility to delete/free the allocated memory blocks.
Whats different is 1 and I think 2 allocate all the memory together in one big contiguous block, 3 & 4 don't do that they have a pointer block which points to memory blocks for each row array and those blocks can be all over the place in physical memory. Structurally they are both 2D float arrays but there is differences in there internal memory layout. Versions 3 & 4 will never produce anything that looks like version 1 without a lot of luck with memory allocation.
I won't comment on 2 because I have a feeling it may be compiler dependent C++11 seems to say it will be a contiguous block but I am not sure all compilers will do it if they are not C++11 compliant.
The two structures also do no use the same amount of memory take a 2x2 matrix. Version 1 simply allocates memory for 4 floats. Version 3 & 4 allocate 2 pointers and then 2 floats allocated into each pointer. So if your floats are 4 bytes and your pointers are 4 bytes, version 1 allocates 16 bytes of memory and version 3&4 allocate 8+16=24bytes.
Technically the access to version 1 is faster but it has the considerable downside that as the structure gets larger the chances of finding that amount of contiguous memory block size becomes difficult. Version 3 & 4 can go to much larger size and are more likely to still work at larger sizes that version 1.
So you asked:
Is the first method correct for all the platforms? Yes but that is only one way to make a 2D float array don't expect that to work for other methods on any platform.
Your overloaded functions are correct for 1, 3 & 4 ... I am still wary of 2 you might need to do some checking
void print_data2d(float *matriz,int ymax,int xmax,char *method);
void print_data2d(float **matriz,int ymax,int xmax,char *method);
There is some danger in that overloading that the use of an "&" will give you the wrong one. Consider a version 1 array and I went to print it.
float *matriz; print_data2d (&matriz, .... );
See what happens there .... matriz is a float* .. &matriz is a float** .. so the call takes the second form and probably crashes and burns.
I think for safety you need to do a bit of typecasting
In vino veritas
modified 30-Apr-16 1:42am.
|
|
|
|
|