C语言第1次上机

C语言程序设计 实验报告班级 日期学生姓名 学号第 1 次上机实验1 表达式与标准输入输出1.1实验目的(1)熟练掌握各种运算符

C语言程序设计 实验报告

班级 日期

学生姓名 学号

第 1 次上机

实验1 表达式与标准输入输出

1.1实验目的

(1)熟练掌握各种运算符的运算功能,操作数的类型,运算结果的类型及运算过程中的类型转换,重点是C 语言特有的运算符,例如位运算符,问号运算符,逗号运算符等;熟记运算符的优先级和结核性。

(2)掌握getchar,putchar,scanf 和printf 函数的用法。

(3)掌握简单C 程序(顺序结构程序)的编写方法。

1.2 实验任务

编写并上机调试运行能实现以下功能的程序。

(1)编写一个程序,输入字符c,如果c是大写字母,则将c转换成对应的小写,否则c的值不变,最后输出c。

(2)编写一个程序,输入无符号短整数x ,m,n(0 ≤m≤ 15, 1 ≤ n≤ 16-m), 取出x 从第m位开始向左的n位(m从右至左编号为0~15),并使其向左端(第15位)靠齐。

(3)IP 地址通常是4个用句点分隔的小整数(即点分十进制),如32.55.1.102。这些地址在机器中用无符号长整形表示。编写一个程序,以机器存储的形式读入一个互联网IP 地址,对其译码,然后用常见的句点分隔的4部分的形式输出。例如,

整形676879571二进制表示就是:00101000 01011000 01011100 11010011,按照8位一组可表示为:40 88 92 211,由于CPU 处理数据的差异,它的顺序是颠倒的,所有最终格式为211.92.88.40。

1.3 实验步骤及结果

(要求给出源程序和程序运行结果。另外,根据实验内容,记录编辑、编译、链接、调试程序的操作过程和实验中出现的问题)

(1)分析:输入字符,判断是否为大写字母,转换时只需对字符C 作C-‘A ’ ’a ’处理。 #include

void main(void)

{

char c;

printf("Input c:n");

scanf("c",&c);

if(c>'A'&&c<'Z'){

,

}

c=c-'A' 'a'; printf("c",c); } else printf("c",c);

问题:当if 句后面缺{ }时

(2)分析:欲使其向左端靠齐,需要使无关项为零,可以先向左移再引入逻辑尺,也可以先移到最右端再移到最左端。这里用后者,对X 作X 》》M 《《(15—N 1)处理。

#include

void main()

{

unsigned short int x,m,n;

printf("Input x,m,n:n");

scanf("hu hu hu",&x,&m,&n);

x=x>>m<<(15-n 1);

printf("hun",x);

}

,

问题:当缺少分号时

(3)分析:把长整型数8位一组表示出来,需要先分别把这8位数移到最右端,再分别转换成十进制数字。这里还需注意四组数的顺序。

#include

main()

{

unsigned long x,a,b,c,d;

printf("Input x:n");

scanf("ul",&x);

a=(x&0xff000000)>>24;

b=(x&0x00ff0000)>>16;

c=(x&0x0000ff00)>>8;

d=(x&0x000000ff);

printf("d.d.d.d",d,c,b,a);

}

问题:当printf("d.d.d.d",a,b,c,d);时结果顺序颠倒

实验2 流程控制实验

2.1 实验目的

(1)掌握复合语句、if 语句、switch 语句的使用,熟练掌握for 、while 、do-while 三种基本的循环语句的使用,掌握重复循环技术,了解转移语句与标号语句。

(2)熟练运用for 、while 、do-while 语句来编写程序。

(3)练习转移语句与标号语句的使用。

(3)使用集成开发环境中的调试功能:单步执行,设置断点,观察变量值。

2.2 实验任务

,

编写并上机调试运行能实现以下功能的程序。

(1) 假设工资税金按以下方法计算:x < 1000元,不收取税金;1000 ≤ x < 2000,收取5的税金;2000 ≤ x < 3000,收取10的税金;3000 ≤ x < 4000,收取15的税金;4000 ≤ x < 5000,收取20的税金;x >5000,收取25的税金。编写一个程序, 输入工资金额,输出应收取税金额度,要求分别用if 语句和switch 语句来实现。

(2)编写一个程序, 将输入的一行字符复制到输出,复制过程中将一个以上的空格字符用一个空格代替。

(3)编写一个程序, 打印如下的杨辉三角形。

1 /* 第0行 */

1 1 /* 第1行 */

1 2 1 /* 第2行 */

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

1 7 21 35 35 21 7 1

1 8 28 56 70 56 28 8 1

1 9 36 84 126 126 84 36 9 1

j j C C i i 每个数据值可以由组合计算(表示第i 行第j 列位置的值),而的计算如下:

C i 0=1 (i=0,1,2,…)

C i j =C i j -1*(i-j 1) / j (j=0,1,2,3,…,i)

说明:本程序中为了打印出金字塔效果,要注意空格的数目。一位数之间是3个空格,两位数之间有2个空格,3位数之间只有一个空格,程序编制过程中要注意区分。

(4)编写一个程序,将用户输入的任意正整数逆转,例如,输入1234,输出4321。 在此基础上添加代码找出5000以内的所有回文数,要求一屏显示20行每行5个回文数,用户输入ESC 键退出,其它键继续显示。

2.3 实验步骤及结果

(要求给出源程序和程序运行结果。另外,根据实验内容,记录编辑、编译、链接、调试程序的操作过程和实验中出现的问题)

(1)

i>分析:if 句需要列出所有表达式,除按要求的范围分别输出外,还需考虑X 《0的情况。注意if 语句的格式和输出数据的形式。

#include

int main()

{

float x;

printf("input the salary:n");

scanf("f",&x);

if(x<0)printf("wrongn");

else if(x>=0 && x<1000)printf("0n");

else if(x<2000)printf("fn",x*0.05);

,

else if(x<3000)printf("fn",x*0.1);

else if(x<4000)printf("fn",x*0.15);

else if(x<5000)printf("fn",x*0.2);

else

printf("fn",x*0.25);

return 0;

}

问题:当if 句后面多加了分号时

ii>分析:switch 语句重在定义case 为(int )(x/1000.0),就列举了0,1,2,3,4和default 几种情况,注意switch 的格式。

#include

int main()

{

float x ;int Case = 0;

printf("input the salary:n");

scanf("f",&x);

Case = (int)(x/1000.0);

switch(Case)

{

case 0:printf("0n");break;

case 1:printf("fn",x*0.05);break;

case 2:printf("fn",x*0.1);break;

case 3:printf("fn",x*0.15);break;

case 4:printf("fn",x*0.2);break;

default:printf("fn",x*0.25);

}

return 0;

}

,

问题:当未定义case 为int 类型时

(2)分析:引入while 语句循环处理字符,引入switch 语句处理空格。注意这两种语句的格式。

#include

#define COPY 0

#define START 1

void main(void)

{

char c;

int state;

state=COPY;

printf("Input chars end with ctrl z:n");

while((c=getchar())!=EOF)

switch(state){

case COPY:

if(c==' ')state=START;

else putchar(c);

break;

case START:

if(c==' ')state=START;

else{

printf(" ");

putchar(c);

state=COPY;

}

}

}

问题:当if(c=='')时

,

(3)分析:用a[i][j]表示i 行j 列的数有a[i][j]=a[i-1][j] a[i-1][j-1]这个关系式,用for 语句处理循环和空格问题,用域宽说明解决数字间隔宽度问题。

#include

#define M 10

void main()

{

int a[M][M] , i , j ;

int m,k=33,t;

char b[100];

for(t=0;t<100;t )

b[t]=32;

for(i=0;i

for(m=k;m>=0;m--)

printf("c",b[m]);

for(j=0;j<=i;j )

{

if(i==j||j==0)

a[i][j]=1;

else

a[i][j]=a[i-1][j] a[i-1][j-1];

printf("M",a[i][j]);

if(i==j)

printf("n");

}

k=k-2;

}

}

,

问题:当没考虑空格时

。 。 。 。 。

(4)

i>分析:把数字连续除以10就可以从余数得到反方向的数字,引入do-while 语句循环处理。 #include

main()

{

int x,digit;

printf("Input x:n");

scanf("d",&x);

do

{

digit=x;

printf("d",digit);

x/=10;

}while(x!=0);

printf("n");

}

,

说明:参照课本设计

ii>分析:由于5000较小,可直接判断是否为回文数引入if 句。用while 句处理逐个循环直到考虑了所有数。并用if 句处理换行和固定行问题。

#include

main()

{

int i=0,j=0,line=0;

char m;

while(i<=5000){

i ;

if( (( i>=10&&i<100 ) && ( ( i/10 i*10 ) == i ) ) ||( ( i>=100&&i<1000 ) && ( (i/100 (i/10)*10 i*100) == i ) )||( (i>=1000&&i<5000 ) && ( (i/1000 (i/100)*10 (i/10)*100 i*1000)==i)))

{

printf("dt",i);

j ;

if(j5==0){

printf("n");

line ;

if(line==20){

scanf("c",&m);

line=0;

}

}

}

}

printf("n");

}

,

问题:当没有设计好if 中表达式时

实验心得与体会

经过本次实验,我不但熟悉了c 语言语法,而且明白了程序设计不单单需要对代码熟练,更重要的是要有好的设计思路,其中算法非常重要。一个好的设计思路不仅能处理一些实用的问题,还能节约设计程序所用的时间和运行程序所花的时间。所以我应该尝试多设计一些简捷实用的程序,尽量多想一些简单可行的方法。总之,本次实验锻炼了我c 语言上机动手能力。

选做题

一个世纪的100个年号均为合数的世纪称谓合数世纪。编程序找出最早的合数世纪。例如16719世纪(1671801~1671899)和26379世纪(2637801~2637899)都是合数世纪。 分析:引入for 语句处理逐个循环,从2世纪开始排除,直到找到合数世纪才停止。 #include

#include

标签: