實踐項目一——使用鏈表完成復數計算器(先儲存,再計算)

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
//【1】預編譯部分
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<windows.h>
//【2】宏定義部分
#define bool char
#define true 1
#define faulse 0
//【3】定義鏈表結構體
typedef struct LNode {
double a;//實部
double b;//虛部
struct LNode* next;
}LNode, * LinkList;//LinkList是頭指針
//【4】單鏈表的初始化(即頭節點的初始化)
void InitLinkList(LinkList &L) {
L->a = 0;//頭節點的a域用來存儲表長
L->b = 0;
L->next = NULL;//頭節點的next域用來指向鏈表第一個節點
}
//【5】單鏈表的頭插法創建鏈表
bool TailInsertLinkList(LinkList &L) {
LNode* NewNode;//新結點
LNode* TailNode = L;//指向尾結點的指針
double NewNode_a;//新結點的數據域
double NewNode_b;
while (TailNode->next != NULL) {
TailNode = TailNode->next;
}//使尾指針指向鏈表尾部
printf("請輸入要儲存的復數的實部和虛部,用空格分隔(實部=9999意味著停止輸入):");
scanf("%lf %lf", &NewNode_a, &NewNode_b);
while (NewNode_a != 9999)
{
//進行插入操作
NewNode = (LNode*)malloc(sizeof(LNode));
if (!NewNode)
return faulse;
NewNode->a = NewNode_a;
NewNode->b = NewNode_b;
NewNode->next = NULL;
TailNode->next = NewNode;
TailNode = NewNode;
L->a++;//用L->a來記錄來儲存個數
printf("請輸入要儲存的復數的實部和虛部,用空格分隔(實部=9999意味著停止輸入):");
scanf("%lf %lf", &NewNode_a, &NewNode_b);
}
return true;
}
//【6】按位查找(找到用戶需要位置的實部和虛部)
LNode* Find(LinkList L,int e ) {
LinkList p=L;
int count = 0;
while (p->next) {
p = p->next;
count++;
if (count == e)
return p;
}
printf("The LinkList's element you are looking for is not exist! n");
return NULL;
}
//【7】加法
LNode* Plus(LNode* p, LNode* q) {
LNode* r = (LNode*)malloc(sizeof(LNode));
if (!r) exit(1);
r->a = p->a + q->a;
r->b = p->b + q->b;
return r;
}
//【8】減法
LNode* Minus(LNode* p, LNode* q) {
LNode* r = (LNode*)malloc(sizeof(LNode));
if (!r) exit(1);
r->a = p->a - q->a;
r->b = p->b - q->b;
return r;
}
//【9】乘法
LNode* Multi(LNode* p, LNode* q) {
LNode* r = (LNode*)malloc(sizeof(LNode));
if (!r) exit(1);
r->a = (p->a * q->a - p->b * q->b);
r->b = (p->a * q->b + p->b * q->a);
return r;
}
//【10】除法
LNode* Devision(LNode* p, LNode* q) {
LNode* r = (LNode*)malloc(sizeof(LNode));
if (!r) exit(1);
r->a = (p->a * q->a + p->b * q->b)/ pow(q->a, 2) + pow(q->b, 2);
r->b = (p->b * q->a - p->a * q->b) / pow(q->a, 2) + pow(q->b, 2);
return r;
}

//【11】打印鏈表
bool PrintLinkList(LinkList L) {
LNode* p;
p = L;
while (p->next != NULL) {
p = p->next;
if (p->a == 0 && p->b != 0)
printf("%fin", p->b);
if (p->a == 0 && p->b == 0)
printf("0n");
if (p->a != 0 && p->b < 0)
printf("%f%fin", p->a, p->b);
if (p->a != 0 && p->b > 0)
printf("%f+%fin", p->a, p->b);
if (p->a != 0 && p->b == 0)
printf("%fn", p->a);
}
return true;
}
//【12】打印結果
void Print(LinkList r) {
if (r->a == 0 && r->b != 0)
printf("運算結果為%fin", r->b);
if (r->a == 0 && r->b == 0)
printf("運算結果為0n");
if (r->a != 0 && r->b < 0)
printf("運算結果為%f%fin", r->a, r->b);
if (r->a != 0 && r->b > 0)
printf("運算結果為%f+%fin", r->a, r->b);
if (r->a != 0 && r->b == 0)
printf("運算結果為%fn", r->a);
}
void calculate(LinkList L) {
printf("您要進行四則運算選1,進行分離運算選2,增加新的復數選3:n");
int choice;
scanf("%d", &choice);
double t = 0;
int m = 0;
switch (choice) {
case 1:
printf("您要選擇存儲的第幾個和第幾個復數參與四則運算:");
int i, j;
scanf("%d %d", &i, &j);
LNode* p, * q;//定義多個指針變量時每個前面都要加*
p = Find(L, i);
q = Find(L, j);
printf("請選擇你想進行的四則運算n(1:+ 2:- 3:* 4:/):n");
int choice1;
scanf("%d", &choice1);
switch (choice1) {
case 1:Print(Plus(p, q)); break;
case 2:Print(Minus(p, q)); break;
case 3:Print(Multi(p, q)); break;
case 4:Print(Devision(p, q)); break;
default:break;
}
break;
case 2:
printf("您要選擇存儲的第幾個復數參與分離運算:");
scanf("%d", &m);
LNode* p1;
p1 = Find(L, m);
printf("請選擇你想進行的分離運算n(5:分離實部 6:分離虛部) :n");
int choice2;
scanf("%d", &choice2);
switch (choice2) {
case 5:
t = p1->a;
printf("%fn", t); break;
case 6:
t = p1->b;
printf("%fn", t); break;
default:break;
}
break;
case 3:
TailInsertLinkList(L);
default:break;
}
}
//【13】主函數
int main()
{
system("color F0");//用 system("color 0A");來調控UI界面顏色(詳情見備註)
LinkList L;
L = (LNode*)malloc(sizeof(LNode));//分配空間後強制轉化為LNode類型
InitLinkList(L);
TailInsertLinkList(L);
system("cls");
PrintLinkList(L);
printf(" ***********************************************n");
printf(" ____________________________________________ n");
printf("┃ ┃n");
printf("┃ 復數計算器 ┃n");
printf("┃____________________________________________┃n");
printf("***********************************************n");
calculate(L);
int go_on = 1;
while (go_on) {
printf("是否要繼續計算,若是輸入1,否則輸入0:n");
scanf("%d", &go_on);
if (!go_on)
printf("謝謝使用!");
else
calculate(L);
}
return 0;
}

//【UI界面顏色】
//用 system("color 0A");
//其中color後面的0是背景色代號,
//A是前景色代號。各顏色代碼如下:
//0 = 黑色
//1 = 藍色
//2 = 綠色
//3 = 湖藍色
//4 = 紅色
//5 = 紫色
//6 = 黃色
//7 = 白色
//8 = 灰色
//9 = 淡藍色
//A = 淡綠色
//B = 淡淺綠色
//C = 淡紅色
//D = 淡紫色
//E = 淡黃色
//F = 亮白色

发表回复

相关推荐

(十三)83集团军部队历史介绍

一转眼本系列已经来到最后一期,中间经历了种种波折,总算能够完成,不留遗憾。83集团军(包括以前的54集团军)的驻地是在我 ...

· 2分钟前

关于imatest Colorcheck模块的测试及结果分析(imatest版本 5.2.11)

“本文整理了一下,关于imatest 软件colorcheck模块的测试过程及结果分析,主要是参考了imatest官网及自己的一些使用理解,目 ...

· 3分钟前

2021四川達州中考語文真題及答案

試卷滿分120分,考試時間150分鐘一、語言積累與運用(15分)1.下列詞語書寫和加點字註音全正確的一項是( ) (3分)A.陽奉...

· 5分钟前

健康順遂,平安喜樂

從七月初單位組織體檢到八月初做完手術出院,近一個月的時間,讓我深深地體會到瞭生命的珍貴。7.8 單位組織體檢顯示甲狀腺雙...

· 5分钟前

斯大林:“將米夫同志從中國召回”——神秘的任務

斯大林:“將米夫同志從中國召回”——神秘的任務孫果達(知乎專欄《史苑踏石》)在中國的大革命時期,“喘息”政策遣華執行秘密任...

· 7分钟前

Copyright 2015-2025 www.icpchaxun.com ©All Rights Reserved.