Faits:
Faits:
A. A._ est propriétaire d'un immeuble, à Peseux. En automne 1995, elle a décidé d'y aménager un appartement indépendant au rez-de-chaussée. Par l'intermédiaire de E._, qui était chargé de la direction des travaux, elle a conclu avec B._ un contrat d'entreprise portant sur l'installation d'un chauffage et de sanitaires. L'entrepreneur a établi deux devis, l'un de 24 370 fr.40 pour le chauffage et l'autre de 26 884 fr.20 pour les sanitaires.
Les travaux ont débuté le 23 septembre 1996. B._ a tout d'abord démonté l'ancienne chaudière, puis mis en place la nouvelle. Le 17 octobre 1996, A._ a payé un premier acompte de 19 400 fr. Le 29 octobre 1996, l'entrepreneur a exigé un deuxième acompte de 25 000 fr.; A._ a refusé de le régler. A la suite de divergences, les parties ont échangé une correspondance abondante. Par télécopie du 31 mars 1997 adressée au mandataire de l'entrepreneur, A._ a mis un terme aux relations contractuelles.
Les travaux ont débuté le 23 septembre 1996. B._ a tout d'abord démonté l'ancienne chaudière, puis mis en place la nouvelle. Le 17 octobre 1996, A._ a payé un premier acompte de 19 400 fr. Le 29 octobre 1996, l'entrepreneur a exigé un deuxième acompte de 25 000 fr.; A._ a refusé de le régler. A la suite de divergences, les parties ont échangé une correspondance abondante. Par télécopie du 31 mars 1997 adressée au mandataire de l'entrepreneur, A._ a mis un terme aux relations contractuelles.
B. B.a Le 2 juin 1997, B._ a adressé au Président du Tribunal du district de Boudry une requête de preuve à futur, qui tendait à la mise en oeuvre d'une expertise destinée à déterminer la nature et la qualité des travaux exécutés par l'entrepreneur, ainsi que le solde dû par A._. L'expertise a été confiée à C._, du Bureau C._ Ingénieurs-Conseils SA. Dans son rapport du 18 décembre 1997, l'expert est arrivé à la conclusion que les travaux réalisés représentaient 20 863 fr. pour le chauffage et 9485 fr. pour les sanitaires, soit 30 348 fr. au total, indépendamment d'éventuels rabais et escompte.
B.b Le 3 mars 1998, B._ a introduit contre A._ une action en paiement de 15 948 fr., plus intérêts, soit 10 948 fr. - correspondant à la valeur des travaux exécutés à dire d'expert après déduction de l'acompte de 19 400 fr. - et 5000 fr. à titre de dommages-intérêts.
Une nouvelle expertise judiciaire a été ordonnée. Elle a été confiée à D._, du Bureau d'études Chauffage - Ventilation - Climatisation. L'expert a estimé la valeur des travaux sanitaires à 3580 fr.; il n'a pas évalué les travaux de chauffage, soulignant toutefois que l'acompte de 19 400 fr. couvrait largement les prestations fournies par l'entrepreneur.
Par jugement du 8 janvier 2003, le Tribunal civil du district de Boudry a condamné A._ à payer à B._ 12 423 fr. avec intérêts à 5% dès le 3 mars 1998; ce montant correspond à 28 848 fr. pour les travaux exécutés et 2975 fr. à titre de dommages-intérêts, moins 19 400 fr. d'acompte.
Par arrêt du 20 juin 2003, la Cour de cassation civile du Tribunal cantonal du canton de Neuchâtel a rejeté le recours déposé par la défenderesse.
Par arrêt du 20 juin 2003, la Cour de cassation civile du Tribunal cantonal du canton de Neuchâtel a rejeté le recours déposé par la défenderesse.
C. A._ interjette un recours en réforme au Tribunal fédéral. A titre principal, elle conclut à la réforme de l'arrêt attaqué en ce sens que la demande est rejetée. Elle demande subsidiairement le renvoi de la cause à l'autorité cantonale.
B._ propose le rejet du recours.
Par arrêt de ce jour, le recours de droit public formé parallèlement par A._ a été rejeté dans la mesure où il était recevable.

Le Tribunal fédéral considère en droit:
Le Tribunal fédéral considère en droit:
1. 1.1 Interjeté par la partie qui a succombé dans ses conclusions libératoires et dirigé contre un jugement final rendu en dernière instance cantonale par un tribunal supérieur (art. 48 al. 1 OJ) sur une contestation civile dont la valeur litigieuse atteint le seuil de 8000 fr. (art. 46 OJ), le recours est en principe recevable puisqu'il a été déposé en temps utile (art. 54 al. 1 OJ) et dans les formes requises (art. 55 OJ).
1.2 Le recours en réforme est ouvert pour violation du droit fédéral (art. 43 al. 1 OJ). En revanche, il ne permet pas de se plaindre de la violation directe d'un droit de rang constitutionnel (art. 43 al. 1, 2e phrase OJ) ni de la violation du droit cantonal (<ref-ruling> consid. 2c).
Saisi d'un tel recours, le Tribunal fédéral conduit son raisonnement juridique sur la base des faits contenus dans la décision attaquée, à moins que des dispositions fédérales en matière de preuve n'aient été violées, qu'il faille rectifier des constatations reposant sur une inadvertance manifeste (art. 63 al. 2 OJ) ou compléter les constatations de l'autorité cantonale parce que celle-ci n'a pas tenu compte de faits pertinents, régulièrement allégués et clairement établis (art. 64 OJ; <ref-ruling> consid. 2c; <ref-ruling> consid. 2a).
Dans la mesure où la partie recourante se fonde sur un état de fait qui s'écarte de celui contenu dans la décision attaquée, sans se prévaloir avec précision de l'une des exceptions qui viennent d'être rappelées, il n'est pas possible d'en tenir compte (<ref-ruling> consid. 2c). Il ne peut être présenté de griefs contre les constatations de fait, ni de faits ou de moyens de preuve nouveaux (art. 55 al. 1 let. c OJ). Le recours en réforme n'est donc pas ouvert pour remettre en cause l'appréciation des preuves et les constatations de fait qui en découlent (<ref-ruling> consid. 2b/aa p. 277; <ref-ruling> consid. 2c p. 252; <ref-ruling> consid. 2a; <ref-ruling> consid. 3a).
Au surplus, la juridiction de réforme ne peut aller au-delà des conclusions des parties; en revanche, elle n'est liée ni par les motifs développés par les parties (art. 63 al. 1 OJ; <ref-ruling> consid. 3.2.2 p. 415), ni par l'argumentation juridique retenue par la cour cantonale (art. 63 al. 3 OJ; <ref-ruling> consid. 2e/cc; <ref-ruling> consid. 2c; <ref-ruling> consid. 2a).
Au surplus, la juridiction de réforme ne peut aller au-delà des conclusions des parties; en revanche, elle n'est liée ni par les motifs développés par les parties (art. 63 al. 1 OJ; <ref-ruling> consid. 3.2.2 p. 415), ni par l'argumentation juridique retenue par la cour cantonale (art. 63 al. 3 OJ; <ref-ruling> consid. 2e/cc; <ref-ruling> consid. 2c; <ref-ruling> consid. 2a).
2. 2.1 La cour cantonale a réglé le litige entre les parties sur la base de l'<ref-law>, régissant la résiliation anticipée du contrat d'entreprise par le maître. A l'instar du juge de première instance, elle a considéré en effet que la défenderesse avait mis un terme au contrat par la télécopie du 31 mars 1997. Plus précisément, elle a jugé nouvelle et, partant, irrecevable la thèse développée en cassation par la défenderesse, selon laquelle les parties avaient rompu leurs relations contractuelles d'un commun accord; pour la même raison, elle n'est pas entrée en matière sur la thèse alternative d'une résiliation du contrat par la défenderesse pour justes motifs, pour cause de demeure de l'entrepreneur ou de dépassement prévisible du devis.
2.2 Sur ce point, la défenderesse se plaint tout d'abord d'une violation de l'art. 63 OJ. Les juges précédents auraient restreint leur pouvoir d'examen au point de violer le principe «jura novit curia»; il leur appartenait en effet de qualifier juridiquement les faits prouvés.
Au surplus, la défenderesse reproche à la cour de cassation civile une fausse application de l'<ref-law>. A son sens, le contrat a pris fin avec l'accord de toutes les parties; une résiliation unilatérale du contrat par le maître ne pouvait être déduite des faits établis. A cet égard, la défenderesse invoque notamment le courrier du demandeur du 17 février 1997, qui démontrerait que les parties ne se trouvaient alors plus dans l'hypothèse d'une continuation du contrat.
2.3 Pour les causes qui peuvent faire l'objet d'un recours en réforme, le principe de l'application du droit d'office relève du droit fédéral (<ref-ruling> consid. 3b p. 596/597; Fabienne Hohl, Procédure civile, tome I, n. 865, p. 167; Vogel/Spühler, Grundriss des Zivilprozessrechts, 7e éd., n. 60 et 61, p. 174). Comme le Tribunal fédéral, le juge cantonal est tenu d'appliquer d'office le droit fédéral, sans être lié par l'argumentation des parties, car son pouvoir d'examen ne saurait être plus restreint que celui de la juridiction de réforme. Le moyen tiré de la violation du principe «jura novit curia» peut donc être soulevé dans une cause où le recours en réforme est ouvert, par exemple si la juridiction cantonale a refusé d'entrer en matière sur une argumentation juridique nouvelle (Poudret, COJ II, n. 1.3.2.9 ad art. 43, n. 3.8 ad art. 63).
2.4 En l'espèce, il n'est pas déterminant que la cour cantonale ne se soit pas prononcée sur la thèse d'un accord mettant fin au contrat. En effet, le moyen tiré d'une mauvaise application de l'<ref-law> est de toute manière mal fondé.
Dans le courrier du 17 février 1997 adressé à la défenderesse, le mandataire du demandeur faisait état des interrogations de son client; ce dernier se posait «sérieusement la question de savoir s'il entend[ait] continuer ce chantier». Le premier juge n'a nullement dénaturé le contenu de cette lettre en refusant d'y voir une résiliation du contrat. Dans ledit courrier, l'entrepreneur réclamait le montant de 13 813 fr.35 qu'il estimait correspondre au prix des travaux déjà effectués, et non pas l'acompte de 25 000 fr. à ses yeux nécessaire à la poursuite des travaux; cela ne signifie pas qu'il entendait déjà, à ce moment-là, mettre fin au contrat. La mise en demeure est en effet assortie de l'expression «en tous les cas», ce qui montre bien que l'entrepreneur cherchait au moins à être payé pour les parties de l'ouvrage exécutées, mais qu'il n'excluait pas de continuer le chantier. Au surplus, on ne saurait interpréter la lettre du 17 février 1997 comme une offre de mettre fin au contrat.
En réponse à une demande de son cocontractant de clarifier sa position, la défenderesse répond, par la lettre télécopiée du 31 mars 1997, qu'elle n'entend pas poursuivre sa collaboration avec le demandeur; selon le principe de la confiance, une telle déclaration s'interprète comme une manifestation de volonté claire et univoque de se départir du contrat, suffisante pour entraîner l'application de l'<ref-law> (cf. François Chaix, Commentaire romand, n. 7 ad <ref-law>).
Comme le moyen fondé sur violation de l'<ref-law> n'est pas pertinent, il n'y a pas lieu d'annuler l'arrêt entrepris sur ce point et de renvoyer la cause à la cour cantonale en application de l'art. 64 al. 1 OJ (cf. Poudret, op. cit., n. 2.1.4 ad art. 64).
Comme le moyen fondé sur violation de l'<ref-law> n'est pas pertinent, il n'y a pas lieu d'annuler l'arrêt entrepris sur ce point et de renvoyer la cause à la cour cantonale en application de l'art. 64 al. 1 OJ (cf. Poudret, op. cit., n. 2.1.4 ad art. 64).
3. 3.1 Devant les instances cantonales, la défenderesse invoquait en compensation une prétention liée aux défauts de l'ouvrage. Selon l'arrêt attaqué, la situation au 19 décembre 1996, communiquée par la défenderesse au demandeur en annexe de sa lettre du 31 janvier 1997, ne constitue pas un avis des défauts suffisamment clair; la cour cantonale ajoute que l'avis des défauts ne peut, au demeurant, pas intervenir avant la réception de l'ouvrage.
3.2 A ce sujet, la défenderesse se plaint d'une fausse application de l'<ref-law> et des <ref-law>. Elle considère avoir adressé à temps un avis des défauts circonstancié à son partenaire contractuel. A la suivre, les défauts ainsi signalés résultent d'une inexécution des obligations de l'entrepreneur, influant sur le prix des prestations du demandeur.
3.3 Dans le cas particulier, la livraison de l'ouvrage achevé n'a pas eu lieu, car le contrat a été résilié de façon anticipée, avec effet «ex nunc». En pareille hypothèse, il n'est toutefois pas exclu que l'ouvrage inachevé soit défectueux, s'il lui manque une qualité qu'il devrait avoir à ce stade de l'exécution (Gauch, Le contrat d'entreprise, adaptation française par Benoît Carron, n. 2432 et n. 2433, p. 668). Il convient alors de procéder par analogie: l'entrepreneur répondra du défaut selon les règles qui, dans le cas d'espèce, seraient applicables à la garantie pour les défauts de l'ouvrage achevé (cf. <ref-ruling> consid. 2b/aa; Gauch, op. cit., n. 2434, p. 668). Il s'agit ici des règles légales, soit en particulier l'<ref-law> sur le devoir de vérification et d'avis.
L'état des lieux au 19 décembre 1996, annexé à la lettre de la défenderesse du 31 janvier 1997, consiste en une liste de travaux exécutés et à exécuter, dressée par la direction du chantier; il contient divers reproches concernant la conception de la tuyauterie, la pose de radiateurs, les particularités de boilers et la livraison anticipée d'appareils sanitaires. Il n'est pas nécessaire d'examiner si ce document constitue un avis des défauts en bonne et due forme. En effet, la critique de la défenderesse consiste en réalité à s'en prendre à l'appréciation de la qualité des travaux par l'expert C._, dont les juridictions cantonales ont suivi les conclusions. Or, l'expert a relevé que les travaux dans le domaine des sanitaires «correspond[aient] à une exécution standard de qualité normale pour un artisan local», sous réserve d'une question de «sécurité gaz», non pertinente en l'espèce. De plus, pour l'installation de chauffage, l'expert a observé que la solution choisie était «simple et conventionnelle». Il a également déduit les moins-values idoines, comme le juge de première instance l'a relevé.
En conclusion, la défenderesse ne saurait invoquer une inexécution ou des défauts de l'ouvrage inachevé sans remettre en cause l'appréciation des preuves d'une manière inadmissible en procédure de réforme. Il sera rappelé à ce propos que, dans l'arrêt sur recours de droit public, la cour de céans a jugé que l'appréciation des preuves reprise dans la décision cantonale résistait au grief d'arbitraire, notamment en ce qui concerne la prise en considération du rapport d'expertise C._. Dans ces conditions, le moyen fondé sur une violation des art. 367 et 97ss CO doit être écarté.
En conclusion, la défenderesse ne saurait invoquer une inexécution ou des défauts de l'ouvrage inachevé sans remettre en cause l'appréciation des preuves d'une manière inadmissible en procédure de réforme. Il sera rappelé à ce propos que, dans l'arrêt sur recours de droit public, la cour de céans a jugé que l'appréciation des preuves reprise dans la décision cantonale résistait au grief d'arbitraire, notamment en ce qui concerne la prise en considération du rapport d'expertise C._. Dans ces conditions, le moyen fondé sur une violation des art. 367 et 97ss CO doit être écarté.
4. 4.1 La défenderesse reproche par ailleurs à la cour cantonale d'avoir mis à sa charge une somme de 1282 fr. (hors taxes), représentant la part des frais d'étude dans les travaux réalisés. Elle fait valoir que l'étude technique a été effectuée par un tiers et facturée à l'entrepreneur, qui devait en rendre compte au maître. Comme le demandeur est en demeure de lui fournir ladite étude, la défenderesse refuse de s'acquitter de ces frais, invoquant l'exception d'inexécution (<ref-law>).
4.2 Les travaux liés à l'installation de chauffage impliquaient qu'une étude soit menée par un ingénieur en génie thermique. Cette étude a été réalisée et les frais ont été facturés à l'entrepreneur. Le devis du 15 mars 1996 prévoyait un montant global pour «main d'oeuvre et étude technique». Pour sa part, l'expert C._ a constaté que le décompte présenté par le demandeur se fondait sur des interventions en régie. Il a donc déduit les frais d'étude - correspondant à 7% du coût de l'ouvrage selon le prix du marché - du montant des travaux adjugés, puis il a rectifié le calcul pour tenir compte des plus-values et des moins-values, avant de déduire du total ainsi obtenu (18 308 fr.) la part des frais d'étude dans les travaux réalisés, soit 1282 fr. (7% de 18 308 fr.). Selon l'expert, dont les conclusions ont été reprises par les instances cantonales, l'étude technique fait partie des prestations exécutées par l'entrepreneur. Il s'ensuit que la défenderesse ne saurait se plaindre d'une inexécution du contrat sans remettre en cause l'expertise et l'appréciation des preuves à laquelle les juridictions cantonales ont successivement procédé.
Au demeurant, la non remise des documents de l'étude technique ne ressort pas de l'état de fait cantonal, qui lie la juridiction de réforme. Et les pièces que la défenderesse invoque à ce sujet sont de toute manière imprécises, peu explicites et guère motivées. Le moyen tiré de la violation de l'<ref-law> tombe dès lors à faux.
Au demeurant, la non remise des documents de l'étude technique ne ressort pas de l'état de fait cantonal, qui lie la juridiction de réforme. Et les pièces que la défenderesse invoque à ce sujet sont de toute manière imprécises, peu explicites et guère motivées. Le moyen tiré de la violation de l'<ref-law> tombe dès lors à faux.
5. 5.1 En rapport avec la livraison des appareils sanitaires, la défenderesse reproche aux juges neuchâtelois une «fausse application de l'<ref-law>».
5.2 Selon le principe posé par l'<ref-law>, le prix de l'ouvrage est payable au moment de la livraison. Cette règle prend son sens dans le cas normal, c'est-à-dire lorsque la livraison porte sur un ouvrage achevé. En revanche, l'<ref-law> n'est d'aucun secours dans les cas où, comme en l'espèce, le contrat prend fin de manière anticipée avec effet «ex nunc» et où l'entrepreneur peut prétendre à une rémunération partielle et à des dommages-intérêts, conformément à l'<ref-law>; la créance de l'entrepreneur devient alors exigible au moment de la résiliation du contrat d'entreprise (Gauch, op. cit., n. 1156, p. 332).
Dans le cas particulier, comme les droits du demandeur sont régis par l'<ref-law>, la question de l'application de l'<ref-law> ne se pose pas, ce qui entraîne le rejet du grief.
Dans le cas particulier, comme les droits du demandeur sont régis par l'<ref-law>, la question de l'application de l'<ref-law> ne se pose pas, ce qui entraîne le rejet du grief.
6. 6.1 En dernier lieu, la défenderesse se plaint d'une violation de l'<ref-law>. Elle dresse ainsi la liste des nombreux faits que l'expert C._ et, à sa suite, les juges cantonaux auraient retenus en méconnaissant les règles sur la preuve.
6.2 Selon l'<ref-law>, chaque partie doit, si la loi ne prescrit le contraire, prouver les faits qu'elle allègue pour en déduire son droit. Sous réserve d'une règle spéciale, cette disposition répartit le fardeau de la preuve (<ref-ruling> consid. 3c p. 223) pour toutes les prétentions fondées sur le droit privé fédéral (<ref-ruling> consid. 2a p. 522; <ref-ruling> consid. 3b p. 79) et détermine ainsi la partie qui doit assumer les conséquences d'une absence de preuve (<ref-ruling> consid. 2a p. 522; <ref-ruling> consid. 2b, 315 consid. 4a; <ref-ruling> consid. 3b p. 79).
L'<ref-law> ne prescrit toutefois pas quelles sont les mesures probatoires à ordonner (<ref-ruling> consid. 2a), ni ne dicte au juge comment il doit forger sa conviction (<ref-ruling> consid. 2d p. 25; <ref-ruling> consid. 3a, 519 consid. 2b p. 522). Ainsi, lorsque l'appréciation des preuves convainc le juge qu'un fait est établi à satisfaction de droit ou réfuté, la question de la répartition du fardeau de la preuve ne se pose plus et le grief tiré de la violation de l'<ref-law> devient sans objet (<ref-ruling> consid. 2a p. 291; <ref-ruling> consid. 1; <ref-ruling> consid. 3a p. 147). L'<ref-law> ne saurait être invoqué pour faire corriger l'appréciation des preuves, qui ressortit au juge du fait et ne peut être revue que dans le cadre d'un recours de droit public pour arbitraire (<ref-ruling> consid. 2a p. 522; <ref-ruling> consid. 3c).
6.3 En l'espèce, la Cour de cassation civile, confirmant en cela le premier juge, a fixé la prétention du demandeur en se livrant à une appréciation des preuves que la cour de céans a jugée soutenable dans l'arrêt sur recours de droit public. Dans ces conditions, la question de la répartition du fardeau de la preuve n'est plus d'actualité et le moyen fondé sur la violation de l'<ref-law> est sans objet.
7. Sur le vu de ce qui précède, la Cour de cassation civile n'a pas violé le droit fédéral. Le recours ne peut être que rejeté.
La défenderesse, qui succombe, prendra à sa charge les frais judiciaires (art. 156 al. 1 OJ) et versera au demandeur une indemnité à titre de dépens (art. 159 al. 1 OJ).

Par ces motifs, le Tribunal fédéral prononce:
Par ces motifs, le Tribunal fédéral prononce:
1. Le recours est rejeté.
1. Le recours est rejeté.
2. Un émolument judiciaire de 2000 fr. est mis à la charge de la défenderesse.
2. Un émolument judiciaire de 2000 fr. est mis à la charge de la défenderesse.
3. La défenderesse versera au demandeur une indemnité de 2500 fr. à titre de dépens.
3. La défenderesse versera au demandeur une indemnité de 2500 fr. à titre de dépens.
4. Le présent arrêt est communiqué en copie aux mandataires des parties et à la Cour de cassation civile du Tribunal cantonal du canton de Neuchâtel.
Lausanne, le 11 novembre 2003
Au nom de la Ire Cour civile
du Tribunal fédéral suisse
Le Président: La Greffière: