|
|
So lazy you couldn't even put your homework into your own words? Just google it. But first, refer to the material your professor provided in class.
Social Media - A platform that makes it easier for the crazies to find each other.
Everyone is born right handed. Only the strongest overcome it.
Fight for left-handed rights and hand equality.
|
|
|
|
|
It sure may be homework, but then again: If different phrasings are both accepted by the compiler, it is legitimate to ask if they are identical, even if it is not homework .
If "const int *ptr" is identical to "int const *ptr", is it then identical to "int *const ptr" as well? If you can shift the "const" keyword one position, why not two? There are several cases (in various languages) of modifiers that can be written in any order (when there are more than one). Knowing when order/position is significant and when it isn't (and which orders/positions are illegal) can be quite confusing until you have built expertise in the language!
|
|
|
|
|
They are equivalent. The int value is constant, cannot be modified. Now that you decalre a pointer to this type, this pointer can be set to any constant int value, but the pointer itself may be moved around freely among several constant integer values.
The difference comes when you move 'const' to the right of the asterisk:
int *const ptr = &xxx;
Now the xxx value may change, but ptr will always point to xxx. You are not allowed to move ptr to &yyy. You can consider *ptr as another way of writing xxx. Or ptr is another way of writing &xxx. You can't move xxx to refer to another variable either, so *ptr and xxx, or ptr and &xxx work the same way. You rarely need constant pointers; the address it is initialized with will serve the same purpose. But if the address expression is complex, and it is used many times, setting up a constant pointer may save both typing and improve readability (as long as a more descriptive name than "ptr" is chosen ).
|
|
|
|
|
Member 7989122 wrote: They are equivalent. And nicely confusing.
|
|
|
|
|
Context: I have some applications that were originally written for Xp. This is important, because we're running into issues with security changes from Xp -> Windows 10. Some of the code in the application makes assumptions for Xp that are evil for Windows 10. So, I'm migrating these apps from VS 2008 to VS 2017 and maybe later.
So, firing up VS2017 and attempting to build some demo projects, I'm prompted to re-target the application. Visual Studio offers me 3 different SDKs. I've dealt with mfc over the years, but the mfc dlls seem to be always included everywhere.
Should I be concerned about which sdk I build for?
Charlie Gilley
<italic>Stuck in a dysfunctional matrix from which I must escape...
"Where liberty dwells, there is my country." B. Franklin, 1783
“They who can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.” BF, 1759
|
|
|
|
|
I have done this when moving from VS2015 to 2017, and recently when moving to 2019. I always choose the one with the highest number. Alternatively, create a quick minimal Windows app in VS 2017 and check its properties to see which version it sets as default.
|
|
|
|
|
You might want to consider moving directly to VS2019. Differences are quite small but one important factor that made me upgrade is that, in VS2019, you can set the target platform to "10.0 (latest installed version)". That saves you a lot of headaches when changing development machines or when you have different developers.
Again from my experience, you can safely assume that a Windows 10 machine will have the runtime already installed.
Mircea
|
|
|
|
|
Quote: you can safely assume that a Windows 10 machine will have the runtime already installed.
lol, did you really just say that? In fact, this is where I was going with my concern. A couple of these apps have very small user bases, but one of them happens to be my boss. For some reason, he seems cursed when trying to run these applications, but I do understand what you are saying.
Charlie Gilley
<italic>Stuck in a dysfunctional matrix from which I must escape...
"Where liberty dwells, there is my country." B. Franklin, 1783
“They who can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.” BF, 1759
|
|
|
|
|
|
Hello guys !
I just need a little help with this code, it's a recursion method to solve the 0-1 knapsack problem, but I want someone to re-write the code in a normal form (For loops, while loops, etc...) for me, here's the code:
#include <iostream>
#include <climits>
using namespace std;
int knapSack(int v[], int w[], int n, int W)
{
if (W < 0)
return INT_MIN;
if (n < 0 || W == 0)
return 0;
int include = v[n] + knapSack(v, w, n - 1, W - w[n]);
int exclude = knapSack(v, w, n - 1, W);
return max (include, exclude);
}
int main()
{
int n;
cout<<"Enter number of items:";
cin>n;
for (int i=0; i<n; i++) {
cout<<"Enter the value of item number "<< i <<"\n";
cin>>v[i];
cout<<"Enter the weight of item number "<< i <<"\n";
cin>>w[i];
}
int W;
cout<<"Enter the capacity of knapsack"<<"\n";
cin>>W;
cout << "Knapsack value is " << knapSack(v, w, n - 1, W);
return 0;
}
And I really appreciate all of your help
|
|
|
|
|
iNoor72 wrote: but I want someone to re-write the code in a normal form (For loops, while loops, etc...) for me, here's the code: It doesn't work that way here. You would be better off asking specific questions, with as much detail as possible, and posting the appropriate code.
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment
"Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst
"I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
|
|
|
|
|
I guess it's basically re-writing the code from this current way (the recursion method) to a for-loop way, I've nothing more to say tbh
If you can help me re-writing this code because I'm unfortunately not that good with programming at the moment, I'm still learning some basics.
|
|
|
|
|
iNoor72 wrote: I'm still learning some basics. And you'll be stuck there by continuing with this paradigm. Do the work yourself. Only ask for help after you have exhausted all other resources!
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
iNoor72 wrote: but I want someone to re-write the code in a normal form (For loops, while loops, etc...)
Good plan.
There are some different ways to do that:
- The "naive" way: iterate over all sets. That's easy, because sets can represented as integers, where bit
i being set means "item i is in the set" and bit i not being set meaning "item i is not in the set". Iterating over ranges of integers, well, that's just a normal loop. Slow but simple. Simple in terms of code at least. There is a certain leap of logic to it (set=integer) that is not obvious for beginners. - The "mechanical" way: traverse the same recursion-tree, but with iteration and an explicit stack. That's a straightforward refactoring, just tricky (for a human) to get right. Hypothetically this refactoring could be done by a computer, so I call it mechanical - it doesn't require any insight in the Knapsack problem.
- The "clever" way: fill an array iteratively, so that every result for a unique combination of
(n, W) is only computed once, starting with the bottom of the recursion-tree and working up. The original algorithm will often reach the same state through different paths and then recalculate the same thing, that wasted work is avoided this way. This is also known as "Dynamic Programming", which is a far too fancy term for what it is..
Any way you go with, you should be able to make some sort of progress. If you can't finish it then you would have a real question to ask - or to look up. Knapsack has been done to death, there are already too many introductory articles about it, there have to be some that will help you.
|
|
|
|
|
Could you implement any of these ways and show me how it's done? Because I understood some of the things you've said but the rest I couldn't tbh
|
|
|
|
|
As I wrote already, there are many articles about it. There are articles on this very website, for example Knapsack Bitwise. geeksforgeeks.org has articles about it. The wikipedia article is so complete that you can implement it straight from there. Medium.com is spammed full of Knapsack articles, just about any programmer transitioning from beginner to intermediate feels qualified to write them. You can read any of them, or any other articles about the subject, you don't need me - not yet. When you've tried it, and you still need help, then let's talk about it.
|
|
|
|
|
I've read a lot of articles believe me, I wouldn't ask for help re-writing the code if I didn't check every possible solution or article, that's why I'm asking for someone to re-write it to see how can I:
1- re-write recursion code to non-recursion code.
2- non-recursion solution for the knapsack problem.
|
|
|
|
|
iNoor72 wrote: I'm asking for someone to re-write it
You keep saying this but you refuse to understand that nobody is going to do your work for you. Do you have any idea how times a day people show up here and ask to have someone do their homework for them?
IT'S NOT GOING TO HAPPEN.
You cannot just "rewrite this code as a for loop". That doesn't work at all. Forget the code you have and start over using the resources you've been given.
|
|
|
|
|
Are you saying that you want the recursive solution rewritten into a non-recursive one?
Then you have two main alternatives: Either find a completely different algorithm for solving the same task.
Or do it by recursion, by maintaining your own recursion stack, e.g. in an array. The only reason for doing it that way would be because your programming language doesn't allow recursion - but I haven't seen that limitation since the days of Fortran
I'll admit you a secondary reason for being a little careful with recursion: If your estimate for maximum recursion depth is way off, you may experience a stack overflow. In principle, you have the same situation with your array-as-recursion stack, but as you explicitly move stack pointers (i.e. calculate array indexes), it will be far more visible to you, so that you can avoid a fatal crash. You may set up an exception handler for a "real" stack overflow as well, but usually you have a hard time getting back onto your feet with no loss of data or code flow.
|
|
|
|
|
I've read that any recursion program can be written in non-recursion manner unless there's dynamic allocation in that recursion method, and I want to apply that on this particular code because I tried doing it by myself but again, not having a good programming background made me stop and couldn't do it myself.
|
|
|
|
|
iNoor72 wrote: not having a good programming background made me stop So now would be a good time to learn programming properly, rather than trying to rewrite something that you do not understand.
|
|
|
|
|
Trying to evade the problem that you don't understand recursion by rewriting it to non-recursion is never going to work.
In my university days, a fellow student realized that he did not fully master recursion - termination in particular. So he defined a small programming problem for himself. After solving the task, he never had any problems with how to terminate a recursion. I think he made an excellent "programming etude", and have spread it out to a lot of people. It goes like this:
When you enter the recursive function, you write a line with the number of spaces given by the recursion depth, and then an asterisk. When you leave the recursive function, you do the same. The top level call gives parameters for (a) the maximum recursion depth, which you dive right into, (b) an intermediate recursion depth that you return to, before again recursing to the maximum depth, and (c) the number of times to recurse to the maximum depth and back to the intermediate level, before finally returning to the top level call (i.e. the number of "peaks").
For a call with arguments (5, 3, 3) the ouput should look something like
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* The problem statement seems very simple (and it is, for a seasoned recursionist). For an inexperienced programmer, you can usually hear a lot of cursing and re-cursing during the testing
|
|
|
|
|
I don't think that message was meant for me.
|
|
|
|
|
Pass it up the recursion stack!
Software rusts. Simon Stephenson, ca 1994. So does this signature. me, 2012
|
|
|
|
|