While in a traditional blackjack game, you don't input your cards, but instead are dealt them, this exercise will still help calculate card values and can be modified into a full game of blackjack. It appears you set it up so that all cards are worth their face value, aside from higher cards such as J, Q, or K. With aces, you are merely counting them.
After you select to play again, it adds to the previous values because they were not re-initialized, so adding re-initialization to the beginning of your do/while loop solves that problem. With your switch statement set up as is, all values should be 2-10, although I don't see any value applied to aces there. The nAces loop only executes if an ace was one of the cards inputted, and applies 1 or 11 based on the total value (it seems logical). I'm unsure about the purpose of the -'0' on line 20, which subtracts from assigned values. There's probably a better way to set this up which would make it easier to debug. Maybe something like this?
using namespace std;
int total=0, nAces=0,value=0;
cout<<"Enter cards: ";
cin>>c;//takes input and applies to c
if (c=='j' || c=='q' || c=='k')
else if (c=='a')
else if (value==10)
cout<<"Enter more cards? (y/n): ";
} while (response=='y' || response=='Y');
I can see why you want to use chars in place of strings, but it brings other complications along with it, such as figuring out when to use "(char)" and when to work with the variable alone. That's why this code sample doesn't have the total calculations resolved. Perhaps I need to further educate myself about character/integer conversion to get this to work right, as (char) appears to achieve what is wanted on output, but does not appear to assign values to other variables correctly.