【Angular】——无限级下拉列表框

  前言


  前段时间换了新框架,将前后端分离,对Angular2有点感兴趣,所以参与一起封装组件。在小5的帮助下,学会了

好多东西,这里总结下封装的无限级下拉列表框。


 dropdownlist.ts

 

import { Component,OnInit,Output,EventEmitter,Input } from '@angular/core';
import { URLSearchParams }                            from '@angular/http';

import {DataService}                                  from "./dataservice";

@Component({
    selector:'dropdownlist',
    templateUrl:'./dropdownlist.component.html',  
    styleUrls:['./dropdownlist.component.css'],    
})

export class DropDownListComponent{  
    @Input() urls:String[][] = new Array();//保存传递过来的url
    datas:String[][] = new Array(); //保存查询结果
    @Input() titles:String[][] = new Array();//保存提示语句
    condition:string = "";//查询条件
    index:number = 0;

    constructor(public dataService : DataService ){}
   
    ngOnInit(){        
        this.getData(this.condition,this.index);           
    }
    getData(condition : string,index : number ):void{              
        var condition = (condition == "" ? "" : condition);               
        if(index < this.urls.length){         
            let url = this.urls[index].toString() + condition;  
            this.dataService.getData(url).then( res=>
            {             
                this.datas[index] = res;                               
            });        
        }       
    }
    dataChange(condition:string,i:number){               
        this.getData(condition,i+1);
    }

}

  dropdownlist.component.html

 

<div>
  <select name="data" class="combobox form-control"  *ngFor="let url of urls,let i = index" (change)="dataChange($event.target.value,i)">
    <option value="-1">--{{titles[i]}}--</option>
    <option *ngFor="let item of datas[i]" value="{{item.id}}" >{{item.name}}</option>
  </select>
</div>


  组件应用


  上边就是我封装无限级下拉列表框所用的关键代码,将上述的组件发布之后,将组件down下来并引用,下拉列表

框的组件就可以投入使用了。代码部分:

  app.module.ts代码:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { DropDownListModule } from 'ng-itoo-dropdownlist';

import { AppComponent } from './app.component';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,   
    DropDownListModule 
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

  app.component.html代码:

<dropdownlist [titles]='titles' [urls]='urls' ></dropdownlist >

  app.component.ts代码:

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  titles = ['请选择省份','请选择市','请选择区县'];
  urls=['http://localhost:8081/rest/item/countries','http://localhost:8081/rest/item/provinces/','http://localhost:8081/rest/item/cities/'];
  // titles = ['请选择省份'];
  // urls=['http://localhost:8081/rest/item/countries'];
}

  页面效果:


<think>嗯,用户让我用C语言求100的阶乘,还要画流程图。首先,我得想想怎么处理这么大的数。普通的整数类型肯定不行,C语言里的int或者long long最多只能存到20!左右,100!远远超过了这个范围。那应该用数组来模拟大数运算,对吧? 然后,我需要确定数组的大小。100!有多少位呢?可以用对数来估算。log10(100!)=∑log10(i)从1到100,加起来大概是多少?或者用斯特林公式近似计算。斯特林公式是n!≈sqrt(2πn)(n/e)^n。算一下的话,100!的自然对数大概是ln(100!) = 100*ln(100) - 100 + 0.5*ln(200π),然后转成log10的话,除以ln(10)。或者直接找资料,已知100!有158位,所以数组长度需要至少158位,加上进位可能需要更多,比如200个元素的数组。 接下来,用数组的每个元素存一位数字,比如arr[0]是个位,arr[1]是十位,依此类推。初始化数组为1,因为阶乘从1开始乘。然后循环从1到100,每次乘以当前的数,处理进位。 比如,当计算到5!的时候,数组里存的是120,但需要处理每一位的乘积和进位。比如当前数字是4,数组里的数是[0,2,1](即120),乘以4的时候,每一位都要乘,然后处理进位。 那么具体步骤应该是这样的:初始化数组,长度设为200,全部初始化为0,然后arr[0] = 1。然后从2循环到100,每次乘法后处理进位。比如,外层循环是乘数i(从2到100),内层循环处理数组的每一位乘以i,并处理进位。 比如,当i=2时,数组是[1],乘2后变成[2],没有进位。然后i=3,乘后是6。i=4,6*4=24,数组变成[4],进位是2,所以数组变为[4,2],即24。以此类推,直到i=100。 在这个过程中,需要记录当前数组的有效长度,避免每次都遍历整个数组。比如,每次进位可能增加数组的长度,所以需要维护一个变量,比如length,表示当前有效位数。 接下来,编写代码的大致结构应该是: 定义一个足够大的数组,比如int result[200] = {0}; result[0] = 1; int length = 1; 然后循环i从2到100: int carry = 0; for (int j = 0; j < length; j++) { int product = result[j] * i + carry; result[j] = product % 10; carry = product / 10; } 处理剩余的carry,比如当carry大于0时,需要将carry的每一位依次加到数组后面,增加length。 比如,当carry是12,那么循环处理,将12分解为2和1,依次添加到数组的后面,同时length增加2。 这样,每次乘法后,都能正确更新数组中的每一位,并处理进位。 测试这个逻辑是否正确。比如,计算4!的时候: 初始数组是[1], length=1. i=2: j=0: product=1*2+0=2, result[0]=2, carry=0. 循环结束,carry=0,不处理。length仍为1. i=3: j=0: product=2*3+0=6, result[0]=6, carry=0. length=1. i=4: j=0: product=6*4 +0=24. result[0]=24%10=4, carry=24/10=2. 循环结束,carry=2>0,进入处理carry的循环: 此时,j从length=1开始,但需要将carry分解。比如,carry=2,添加到result[1]=2,length变为2. 此时数组是[4,2],即24,正确。 继续这个过程直到i=100,就能得到正确的结果。 接下来是流程图。流程图的大致步骤应该是: 开始 -> 初始化数组,设置result[0]=1,length=1 -> 进入循环i从2到100 -> 对于每个i,初始化carry=0,遍历数组的每一位进行乘法并处理进位 -> 处理完所有位后,处理剩余的carry,扩展数组长度 -> 循环结束?否的话继续下一个i -> 循环结束后,逆序输出数组中的数字 -> 结束。 流程图的各个部分需要用对应的图形表示,比如开始/结束用椭圆,处理操作用矩形,判断用菱形,流程线连接。 可能需要注意的细节是,处理carry的时候可能需要多次循环,比如当carry大于等于10的时候,需要分解成多个位数。例如,carry=123,需要分解为3,2,1,依次存入数组,并将length增加3。所以在代码中,处理carry的部分应该是一个循环,直到carry为0。 另外,输出的时候需要逆序输出数组,因为数组的第0位是个位,而输出应该从最高位开始。 现在,我需要将这个过程转化为C代码,并确保数组大小足够,处理进位正确。测试一下,比如计算5!是否正确。当i=5时,之前的数组是[4,2](即24),乘以5的话: j=0: 4*5=20 + carry 0 → 0,carry=20/10=2 → result[0]=0, carry=2. j=1: 2*5=10 + carry 2=12 → result[1]=2, carry=1. 循环结束后,carry=1,所以处理carry,result[2]=1,length变为3。数组是[0,2,1],即120,正确。 看来逻辑是对的。那这样代码应该没问题。现在,编写代码的大致结构: #include <stdio.h> int main() { int result[200] = {0}; result[0] = 1; int length = 1; for (int i = 2; i <= 100; i++) { int carry = 0; for (int j = 0; j < length; j++) { int product = result[j] * i + carry; result[j] = product % 10; carry = product / 10; } while (carry > 0) { result[length] = carry % 10; carry /= 10; length++; } } printf("100! = "); for (int i = length - 1; i >= 0; i--) { printf("%d", result[i]); } printf("\n"); return 0; } 这样应该可以正确计算100!。然后流程图部分需要画出来,不过用户要求用文字描述。流程图的主要步骤: 1. 开始 2. 初始化数组,设置result[0]=1,length=1 3. 循环i从2到100: a. 初始化carry=0 b. 遍历数组的每一位j,计算乘积和进位 c. 处理剩余的carry,扩展数组长度 4. 循环结束后,逆序输出数组 5. 结束 这样分步骤描述流程图,用户应该可以理解。</think>### C语言求100!的步骤说明 100!(100的阶乘)是一个极大的整数,远超C语言基本数据类型的范围。需使用**数组模拟大数运算**。步骤如下: --- #### 1. 核心思路 - **数组存储**:用数组的每一位存储结果的一个数字,例如`arr[0]`存个位,`arr[1]`存十位,依此类推。 - **逐位计算**:从1开始,依次乘以2、3、...、100,每次乘法后处理进位。 --- #### 2. 代码实现 ```c #include <stdio.h> int main() { int result[200] = {0}; // 初始化数组,足够存储158位 result[0] = 1; // 初始值为1(0! = 1) int length = 1; // 当前有效位数 // 计算阶乘 for (int i = 2; i <= 100; i++) { int carry = 0; // 进位值 // 逐位乘法 for (int j = 0; j < length; j++) { int product = result[j] * i + carry; result[j] = product % 10; // 当前位结果 carry = product / 10; // 新的进位 } // 处理剩余进位 while (carry > 0) { result[length] = carry % 10; carry /= 10; length++; } } // 输出结果(逆序打印) printf("100! = "); for (int i = length - 1; i >= 0; i--) { printf("%d", result[i]); } printf("\n"); return 0; } ``` --- #### 3. 流程图 ```plaintext 开始 ↓ 初始化数组:result[0]=1,length=1 ↓ 循环i从2到100: ├─→ 初始化carry=0 ↓ │ 循环j从0到length-1: │ ├─→ 计算product = result[j] * i + carry │ ├─→ result[j] = product % 10 │ └─→ carry = product / 10 ↓ │ 处理剩余carry: │ ├─→ 若carry>0: │ │ ├─→ result[length] = carry % 10 │ │ ├─→ carry /= 10 │ │ └─→ length++ ↓ 循环结束 ↓ 逆序输出数组内容 ↓ 结束 ``` --- #### 4. 关键点说明 - **数组大小**:100!有158位,需预分配足够空间(如200位)。 - **进位处理**:每次乘法后,进位可能跨越多位(如999×2=1998,进位需分多次处理)。 - **效率优化**:通过`length`变量避免遍历整个数组。 --- #### 5. 结果验证 - **输出示例**:程序会输出完整的158位数字,例如以`933262154439...000000`结尾。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值