今日夜猫:今日夜猫尚未产生,快去抢签吧!
.广播: ------------
论坛.新帖.热帖.精帖.发帖
返回 发贴 设置 管理
查看贴子

适合菜鸟——选择结构程序设计

2014/7/4 10:16:00  (176)    C4论坛  
选择结构程序设计

所谓选择结构程序,是指程序中的语句完全按照它们的排列次序执行。
顺序结构程序一般由四个部分组成:
定义变量部分;
已知变量赋值或输入部分;
未知变量求值部分;
输出结果部分。
顺序结构程序的编写方法,与求解物理题很相似。
变量相当于物理量,有几个物理量就定义几个变量。并明确哪些变量是已知的,哪些变量是未知的。
给出已知变量的值。若已知变量有明确的值,则用赋值语句给出;否则用输入语句获得。
根据已知变量与未知变量的关系,用赋值语句求得未知变量的值。
输出求得的未知变量的值。
选择结构程序设计
1、从键盘输入两个整数,求出最大数并输出。
解:
解法1:
⑴编程思路:
①首先定义变量,x,y存储两个整数,max存储求出的最大数。
②用输入语句输入变量x,y的值。
③若x>y,则变量max取x的值,否则取y的值。
④输出求得的变量max的值。
⑵源程序:
main()
{int x,y,max;
 scanf(“%d%d“,&x,&y);
 if(x>y)
max=x;
 else
max=y;
 printf(“max=%d\n“,max);
}
注意:
①else之后不能直接写条件,如不能写作else(x<=y),但可以写作else if(x<=y)。
解法2:
⑴编程思路:
同解法1。
⑵源程序:
main()
{int x,y,max;
 scanf(“%d%d“,&x,&y);
 max=x>y?x:y; /*使用条件表达式判断求值*/
 printf(“max=%d\n“,max);
}
2、从键盘输入一个实数,求其绝对值并输出。
解:
解法1:
⑴编程思路:
①首先定义变量,x存储该实数,y存储其绝对值。
②用输入语句输入变量x的值。
③若x>0,则变量y取x的值,否则取-x的值。
④输出求得的变量y的值。
⑵源程序:
main()
{float x,y;
 scanf(“%f“,&x);
 if(x>=0)
y=x;
 else /*否定x>=0,即x<0*/
y=-x;
 printf(“y=%f\n“,y);
}
解法2:
⑴编程思路:
①首先定义变量x,先存储该实数,后存储其绝对值。
②用输入语句输入变量x的值。
③若x<0,则将变量x取负之后再存入x;否则x保持不变。
④输出求得的变量x的值。
⑵源程序:
main()
{float x;
 scanf(“%f“,&x);
 if(x<0)
x=-x;
 printf(“y=%f\n“,x);
}
3、从键盘输入x的值,求y的值并输出。

解:
解法1:
采用三条平行的if语句分别求值,每条if语句对应于一种情况(一个分支)。
⑴编程思路:
①首先定义变量x, y。
②用输入语句输入变量x的值。
③若x>0,则变量y取1; 若x=0,则变量y取0; 若x<0,则变量y取-1。
④输出求得的变量y的值。
⑵源程序:
main()
{float x,y;
 scanf(“%f“,&x);
 if(x>0)
y=1;
 if(x==0) /*等号不能写作=*/
y=0;
 if(x<0)
y=-1;
 printf(“y=%f\n“,y);
}
注意:
①if(x==0)不能写作if(x=0),因为后者表示赋值,x的值总为0,即条件总为假。
②在一组平行的if语句中,不管前边的if语句条件是真是假,后边的if语句总要执行。
解法2:
采用嵌套的if语句分别求值,共分为三种情况(三个分支)。
⑴编程思路:
①首先定义变量x, y。
②用输入语句输入变量x的值。
③若x>0,则变量y取1; 否则若x=0,则变量y取0; 否则若x<0,则变量y取-1。
④输出求得的变量y的值。
⑵源程序:
main()
{float x,y;
 scanf(“%f“,&x);
 if(x>0) /*若满足x>0*/
y=1;
 else if(x==0) /*否定x>0,同时满足x=0*/
y=0;
 else /*再否定x=0,必然是x<0*/
y=-1;
 printf(“y=%f\n“,y);
}
注意:
①在两个嵌套的if语句中,只有前边的if语句条件是假(或者是真),后边的if语句才会执行。
4、从键盘输入三个整数,求出最大数并输出。
解:
解法1:
⑴编程思路:
①首先定义变量,a,b,c存储三个整数,max存储求出的最大数。
②用输入语句输入变量a,b,c的值。
③先求出前两个数中的最大数,并存入变量max中。若a>b,则max取a的值,否则取b的值。
④再用第三个数与前两个数中的最大数比较,求出三个数中的最大数,并存入变量max中。若c>max,则max取c的值,否则max保持不变。
⑤输出求得的变量max的值。
⑵源程序:
main()
{int a,b,c,max;
 scanf(“%d%d%d“,&a,&b,&c);
 if(a>b)
max=a;
 else
max=b;
 if(c>max) /*该if语句与第一个if语句平行*/
max=c;
 printf(“max=%d\n“,max);
}
解法2:
利用条件运算符求出三个数中的最大数。
⑴编程思路:
同解法1。
⑵源程序:
main()
{int a,b,c,max;
 scanf(“%d%d%d“,&a,&b,&c);
 max=a>b?a:b;
 max=c>max?c:max;
 printf(“max=%d\n“,max);
}
解法3:
⑴编程思路:
①首先定义变量,a,b,c存储三个整数,max存储求出的最大数。
②用输入语句输入变量a,b,c的值。
③若a>b同时a>c,则max取a的值。若b>a同时b>c,则max取b的值。若c>a同时c>b,则max取c的值。
④输出求得的变量max的值。
⑵源程序:
main()
{int a,b,c,max;
 scanf(“%d%d%d“,&a,&b,&c);
 if(a>b&&a>c)
max=a;
 if(b>a&&b>c) /*或else if(b>a&&b>c)*/
max=b;
 if(c>a&&c>b) /*或else if(c>a&&c>b)*/
max=c;
 printf(“max=%d\n“,max);
}
注意:
①因为该程序中的三个条件是互相排斥的,即只有第一个条件为假时,才需要判断第二个条件;只有前两个条件均为假时,才需要判断第三个条件,故可以用三个嵌套的if语句进行判断。
②同时因为三个条件是相互独立、互不依赖的,故也可以用三个平行的if语句进行判断。
5、从键盘输入两个数,然后按升序输出。
解:
解法1:
⑴编程思路:
①首先定义变量,a,b存储两个数,t作为交换a,b的中间变量。
②用输入语句输入变量a,b的值。
③若a>b,则将变量a,b的值相交换,以保证a的值较小,b的值较大。
④按照先a后b顺序输出两个变量的值。
⑵源程序:
main()
{float a,b,t;
 scanf(“%f%f“,&a,&b);
 if(a>b)
 {t=a;a=b;b=t;}
 printf(“%f,%f\n“,a,b);
}
注意:
①用于交换变量a,b值的三条赋值语句,必须括起来作为一条复合语句。即当条件为真时,三条赋值语句都执行;当条件为假时,三条赋值语句都不执行。
解法2:
⑴编程思路:
①首先定义变量a,b,用于存储两个数。
②用输入语句输入变量a,b的值。
③若a<b,按照先a后b顺序输出两个变量的值;否则按照先b后a顺序输出两个变量的值。
⑵源程序:
main()
{float a,b;
 scanf(“%f%f“,&a,&b);
if(a<b)
printf(“%f,%f\n“,a,b);
else
printf(“%f,%f\n“,b,a);
}
6、从键盘输入三个整数,按升序排序后输出。
解:
⑴编程思路:
①首先定义变量,a,b,c存储两个数,t作为交换a,b,c的中间变量。
②用输入语句输入变量a,b,c的值。
③若a>b,则将变量a,b的值相交换,以保证a的值较小,b的值较大。
④若a>c,则将变量a,c的值相交换,以保证a的值较小,c的值较大。此时变量a的值最小。
⑤若b>c,则将变量b,c的值相交换,以保证b的值较小,c的值较大。此时变量a的值最小,变量b的值次之,变量c的值最大。即a,b,c已按升序排序。
⑥输出变量a,b,c的值。
⑵源程序:
main()
  {int a,b,c,t;
   scanf(“%d%d%d“,&a,&b,&c);
   if(a>b)
    {t=a;a=b;b=t;} /*三条赋值语句必须括起来*/
   if(a>c) /*三条if语句相互平行*/
    {t=a;a=c;c=t;}
   if(b>c)
    {t=b;b=c;c=t;}
   printf(“a=%d,b=%d,c=%d\n“,a,b,c); }
注意:
①用于交换两个变量值的三条赋值语句,必须括起来作为一条复合语句。即当条件为真时,三条赋值语句都执行;当条件为假时,三条赋值语句都不执行。
②因为后面的两个判断不应依赖于其前边判断,故必须用三个平行的if语句进行判断。
6、从键盘输入一个字符,若为小写字母,则转化为相应的大写字母,否则保持不变。
解:
解法1:
⑴编程思路:
①首先定义变量,ch1用于存储输入的字符,ch2用于存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch1。
③若ch1>=‘a‘&&ch1<=‘z‘(即ch1的值为小写字母),则将ch1-32(即转化为相应的大写字母)赋给ch2;否则直接将ch1赋给ch2。
④最后输出ch2的值。
⑵源程序:
#include <stdio.h>
main()
{* ch1,ch2;
 ch1=get*(); /*或scanf(“%c“,&ch1);*/
 if(ch1>=‘a‘&&ch1<=‘z‘) /*不能写作if(‘a‘<=ch1<=‘z‘)*/
ch2=ch1-32;
 else
ch2=ch1;
 put*(ch2); /*或printf(“ch2=%c\n“,ch2);*/
}
注意:
①if(ch1>=‘a‘&&ch1<=‘z‘)不能写作if(‘a‘<=ch1<=‘z‘)。
解法2:
⑴编程思路:
①首先定义变量ch,先存储输入的字符,后存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch。
③若ch>=‘a‘&&ch<=‘z‘(即ch的值为小写字母),则将ch-32(即转化为相应的大写字母)再赋给ch;否则ch保持不变。
④最后输出ch的值。
⑵源程序:
#include <stdio.h>
main()
{* ch;
 ch=get*(); /*或scanf(“%c“,&ch);*/
 if(ch>=‘a‘&&ch<=‘z‘) /*不能写作if(‘a‘<=ch<=‘z‘)*/
ch=ch-32;
 put*(ch); /*或printf(“ch=%c\n“,ch);*/
}
7、从键盘输入一个字符,若为小写字母,则转化为相应的大写字母;若为大写字母,则转化为相应的小写字母,否则保持不变。
解:
解法1:
⑴编程思路:
①首先定义变量,ch1用于存储输入的字符,ch2用于存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch1。
③若ch1>=‘a‘&&ch1<=‘z‘(即ch1的值为小写字母),则将ch1-32(即转化为相应的大写字母)赋给ch2;否则,若ch1>=‘A‘&&ch1<=‘Z‘(即ch1的值为大写字母),则将ch1+32(即转化为相应的小写字母)赋给ch2;否则直接将ch1赋给ch2。
④最后输出ch2的值。
⑵源程序:
#include <stdio.h>
main()
{* ch1,ch2;
 ch1=get*();
 if(ch1>=‘a‘&&ch1<=‘z‘) 
ch2=ch1-32;
 else  if(ch1>=‘A‘&&ch1<=‘Z‘) /*此处else不能缺省*/
ch2=ch1+32;
 else
ch2=ch1;    
 put*(ch2); 
}
注意:
①因为只有ch1不是小写字母时,才需要判断ch1是不是大写字母,故第二个if语句应嵌套在第一个if语句的else子句中。
②若第二个if语句与第一个if语句平行(即第二个if语句之前无else),则第二个if语句中的else仅否定第二个条件ch1>=‘A‘&&ch1<=‘Z‘,即只要不是大写字母,ch2=ch1;都要执行。显然与题目要求不符。
解法2:
⑴编程思路:
①首先定义变量ch,先存储输入的字符,后存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch。
③若ch>=‘a‘&&ch<=‘z‘(即ch的值为小写字母),则将ch-32(即转化为相应的大写字母)再赋给ch;否则,若ch>=‘A‘&&ch<=‘Z‘(即ch的值为大写字母),则将ch+32(即转化为相应的小写字母)再赋给ch;否则ch保持不变。
④最后输出ch的值。
⑵源程序:
#include <stdio.h>
main()
{* ch;
 ch=get*();
 if(ch>=‘a‘&&ch<=‘z‘) 
ch=ch-32;
 else if(ch>=‘A‘&&ch<=‘Z‘) /*此处else不能缺省*/
ch=ch+32;    
 put*(ch); 
}
注意:
①因为只有ch不是小写字母时,才需要判断ch是不是大写字母,故第二个if语句应嵌套在第一个if语句的else子句中。
②若第二个if语句与第一个if语句平行(即第二个if语句之前无else),则当输入一个小写字母(如’f’)时,先执行第一个if语句,因ch1>=‘a‘&&ch1<=‘z‘为真,故转化为相应的大写字母(如’F’);接着执行第二个if语句,又因此时ch1>=‘A‘&&ch1<=‘Z‘为真,故再转化为相应的小写字母(如’f’)。显然与题目要求不符。
8、从键盘输入一个字符,若为小写字母,则转化为相应的大写字母;若为大写字母,则转化为相应的小写字母;否则转化为*码表中的下一个字符。
解:
解法1:
⑴编程思路:
①首先定义变量,ch1用于存储输入的字符,ch2用于存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch1。
③若ch1>=‘a‘&&ch1<=‘z‘(即ch1的值为小写字母),则将ch1-32(即转化为相应的大写字母)赋给ch2;否则,若ch1>=‘A‘&&ch1<=‘Z‘(即ch1的值为大写字母),则将ch1+32(即转化为相应的小写字母)赋给ch2;否则将ch1+1(即转化为*码表中的下一个字符)赋给ch2。
④最后输出ch2的值。
⑵源程序:
#include <stdio.h>
main()
{* ch1,ch2;
 ch1=get*();
 if(ch1>=‘a‘&&ch1<=‘z‘) 
ch2=ch1-32;
 else  if(ch1>=‘A‘&&ch1<=‘Z‘) /*此处else不能缺省*/
ch2=ch1+32;
else  ch2=ch1+1;
 put*(ch2); 
}
注意:
①第二个if语句应嵌套在第一个if语句的else子句中,而不能与第一个if语句平行。
解法2:
⑴编程思路:
①首先定义变量ch,先存储输入的字符,后存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch。
③若ch>=‘a‘&&ch<=‘z‘(即ch的值为小写字母),则将ch-32(即转化为相应的大写字母)再赋给ch;否则,若ch>=‘A‘&&ch<=‘Z‘(即ch的值为大写字母),则将ch+32(即转化为相应的小写字母)再赋给ch;否则将ch+1(即转化为*码表中的下一个字符)再赋给ch。
④最后输出ch的值。
⑵源程序:
#include <stdio.h>
main()
{* ch;
 ch=get*();
 if(ch>=‘a‘&&ch<=‘z‘) 
ch=ch-32;
 else if(ch>=‘A‘&&ch<=‘Z‘) /*此处else不能缺省*/
ch=ch+32;
else  ch=ch+1;
 put*(ch); 
}
注意:
①第二个if语句应嵌套在第一个if语句的else子句中,而不能与第一个if语句平行。
9、从键盘输入两个整数及一个运算符,分别求出其和差积商并输出。
(其中运算符在两个整数之间输入)
解法1:
⑴编程思路:
①首先定义变量,a,b存储两个整数,s存储两个整数的运算结果,ch存储运算符。
②用输入语句输入变量a,b,ch的值。
③若ch为加号,则s=a+b;若ch为减号,则s=a-b;若ch为乘号,则s=a*b;若ch为除号,则s=a/b。
④最后输出变量s的值。
⑵源程序:
main()
{int a,b,s;
 * ch;
 scanf(“%d%c%d“,&a,&ch,&b); /*运算符在两个整数之间输入*/
 if(ch==‘+‘) s=a+b; /*单引号不可少*/
 else if(ch==‘-‘) s=a-b;
 else if(ch==‘*‘) s=a*b;
 else if(ch==‘/‘) s=a/b;
 printf(“s=%d\n“,s);
}
注意:
①因为四个判断相互排斥、互不依赖,故既可以采用嵌套的if语句进行判断,也可以采用平行的if语句进行判断。
解法2:
⑴编程思路:
同解法1。
⑵源程序:
main()
{int a,b,s;
 * ch;
 scanf(“%d%c%d“,&a,&ch,&b); /*运算符在两个整数之间输入*/
 if(ch==‘+‘) s=a+b; /*单引号不可少*/
 if(ch==‘-‘) s=a-b;
 if(ch==‘*‘) s=a*b;
 if(ch==‘/‘) s=a/b;
 printf(“s=%d\n“,s);
}
解法3:
⑴编程思路:
同解法1。
⑵源程序:
main()
{int a,b,s;
 * ch;
 scanf(“%d%c%d“,&a,&ch,&b); /*运算符在两个整数之间输入*/
 switch(ch)
 {case ‘+‘:s=a+b;break; /*case之后要有空格,单引号不可少*/
case ‘-‘:s=a-b;break;
case ‘*‘:s=a*b;break;
case ‘/‘:s=a/b;
 }
 printf(“s=%d\n“,s);
}
10、从键盘输入一个百分制分数,将其转化为等级分输出。
解法1:
利用嵌套的if语句进行判断选择。
⑴编程思路:
①首先定义变量,score存储输入的百分制分数, ch存储转化后的等级分。
②用输入语句输入变量score的值。
③若score<=100同时score>=90,则ch赋值为‘A‘;否则,若score>=80,则ch赋值为‘B‘;否则,若score>=70,则ch赋值为‘C‘;否则,若score>=60,则ch赋值为‘D‘;否则,若score>=0,则ch赋值为‘E‘。
④最后输出变量ch的值。
⑵源程序:
main()
{int score;
* ch;
scanf(“%d“,&score);
if(score<=100 &&score>=90)
 ch=‘A‘;
else if(score>=80) /*此处else不能缺省*/
 ch=‘B‘;
else if(score>=70) /*此处else不能缺省*/
 ch=‘C‘;
else if(score>=60) /*此处else不能缺省*/
 ch=‘D‘;
else if(score>=0) /*此处else不能缺省*/
 ch=‘E‘;
printf(“Grade is %c\n“,ch);
}
注意:
①因为后面的判断依赖于前面的判断,故必须采用嵌套的if语句进行判断。
解法2:
利用平行的if语句进行判断选择。
⑴编程思路:
①首先定义变量,score存储输入的百分制分数, ch存储转化后的等级分。
②用输入语句输入变量score的值。
③若score<=100同时score>=90,则ch赋值为‘A‘;若score<90同时score>=80,则ch赋值为‘B‘;若score<80同时score>=70,则ch赋值为‘C‘;否则,若score<70同时score>=60,则ch赋值为‘D‘;score<60同时score>=0则ch赋值为‘E‘。
④最后输出变量ch的值。
⑵源程序:
main()
{int score;
* ch;
scanf(“%d“,&score);
if(score<=100 &&score>=90)
 ch=‘A‘;
if(score<90 &&score>=80)
 ch=‘B‘;
if(score<80 &&score>=70)
 ch=‘C‘;
if(score<70 &&score>=60)
 ch=‘D‘;
if(score<60 &&score>=0)
 ch=‘E‘;
printf(“Grade is %c\n“,ch);
}
注意:
①因为后面的判断不依赖于前面的判断,故可以采用平行的if语句进行判断。同时由于后面的判断条件与前面的判断条件相互排斥,故也可以采用嵌套的if语句进行判断。
解法3:
利用switch语句进行判断选择。
⑴编程思路:
①首先定义变量,整型变量g存储输入的百分制分数, ch存储转化后的等级分。
②用输入语句输入变量g的值。
③通过g除以10(整除),将一个百分制分数转化为一个0到10之间的整数。而且同一个分数段将转化为同一个整数,如90到99均转化为9。
④利用switch语句根据表达式g/10的值,跳转到相应的分支执行,求出变量ch的值。
⑤最后输出变量ch的值。
⑵源程序:
main()
{int g; /*g为整型变量*/
 * ch;
 scanf(“%d“,&g); 
 switch(g/10) 
{ case 10:  /*当g=100时,转到此处*/
case 9:ch=‘A‘;break; /*当g>=90且g<100时,转到此处*/
   case 8:ch=‘B‘;break; /*当g>=80且g<90时,转到此处*/
case 7:ch=‘C‘;break; /*当g>=70且g<80时,转到此处*/
case 6:ch=‘D‘;break; /*当g>=60且g<70时,转到此处*/
default:ch=‘E‘;break; /*当g<60时,转到此处*/
 }
printf(“Grade is %c\n“,ch);
}
注意:
①当g=100时,跳转到case 10。但因此处无break语句,故继续向下执行case 9之后的语句。
解法4:
利用switch语句进行判断选择。
⑴编程思路:
①首先定义变量,实型变量g存储输入的百分制分数, ch存储转化后的等级分。
②用输入语句输入变量g的值。
③通过将实型变量g强制取整再除以10(整除),将一个百分制分数,转化为一个0到10之间的整数。而且同一个分数段将转化为同一个整数,如90到99均转化为9。
④利用switch语句根据表达式(int)g/10的值,跳转到相应的分支执行,求出变量ch的值。
⑤最后输出变量ch的值。
⑵源程序:
main()
{float g; /*g为实型变量*/
 * ch;
 scanf(“%f“,&g); 
 switch((int)g/10) 
{ case 10:  /*当g=100时,转到此处*/
case 9:ch=‘A‘;break; /*当g>=90且g<100时,转到此处*/
   case 8:ch=‘B‘;break; /*当g>=80且g<90时,转到此处*/
case 7:ch=‘C‘;break; /*当g>=70且g<80时,转到此处*/
case 6:ch=‘D‘;break; /*当g>=60且g<70时,转到此处*/
default:ch=‘E‘;break; /*当g<60时,转到此处*/
 }
printf(“Grade is %c\n“,ch);
}
注意:
①因为此程序中g为实型变量,故必须将g强制取整之后再除以10,以保证相除的商为0到10之间的整数。
11、已知方程ax2+bx+c=0的系数值(设a≠0),求方程的根。
解:
⑴编程思路:
①首先定义变量,其中a,b,c存储方程的三个系数值,d,p,q存储中间结果,x1,x2存储方程的两个根。
②用输入语句输入变量a,b,c的值。
③若b2-4ac>=0,则根据求根公式求得两个实根x1,x2的值,并输出x1,x2的值。否则,分别求得两个共轭复根的实部和虚部,并输出两个共轭复根。
⑵源程序:
#include <math.h>
main()
{float a,b,c,d,p,q,x1,x2;
 scanf(“%f%f%f“,&a,&b,&c);
 d=b*b-4*a*c;
 if(d>=0)
 {x1=(-b+sqrt(d))/(2*a); /*根据求根公式求两个实根*/
x2=(-b-sqrt(d))/(2*a);
printf(“x1=%f\n“,x1);
printf(“x2=%f\n“,x2);
 }
 else
 {p=-b/(2*a); /*求两个共轭复根的实部*/
q=sqrt(-d))/(2*a); /*求两个共轭复根的虚部*/
printf(“x1=%f+%fi\n“,p,q); /*i为虚数单位*/
printf(“x2=%f-%fi\n“,p,q);
 }
}
注意:
①当b2-4ac<0,求两个共轭复根的虚部时,必须先对b2-4ac求绝对值(取负),然后再求平方根。
楼主信息
 潇儿(16142) OFFLINE
 E界诸侯 亲王 .
 普通会员 来自:交友
 .....更多...
[楼主]:博客 相册 贴子 回复
[操作]:管理 举报 下载 收藏
[分享]:空间 微博 家族 更多
[签名]:
赞 (2) 倒 (1)
发表回复


[沙发]

ヾ凉生っ(3850) OFFLINE 07-04 11:25
E界国公. 丞相.普通会员
专回处女帖(没回复的)
 

 回复 只看TA

更多回贴(1) 楼主回复

【E友的最新回帖动态】
[软件]青云空挂优化版!魁儡娃娃!!
美化QQ-海贼王版
[软件]qq for pad1.93
mythroad_mst是??
新的免流看电子书不改bid

返回上级 返回首页
首页合作客服留言QQ群简版
E界,引领视界
mrpej.com @CopyRight