高级语言程序设计第五次作业
高级语言程序设计第五次作业
- 作业课程:2025高级语言程序设计(福州大学)
- 作业要求:高级语言程序设计第五次个人作业
- 学号:052406103
- 姓名:叶银珍
作业内容
程序设计
- 设计一个getchar和putchar联合使用的程序,使得程序遇到空格符时结束。
#include <stdio.h>
int main() {
char a;
while((a=getchar())!=' ') {
putchar(a);
}
return 0;
}

- 建立一个in.txt和out.txt,分别使用这两个文件进行重定位代替键盘输入和屏幕输出in.txt存放一些字符小写字符,大写字符,数字字符,程序将这些小写字符转换成大写字符,然后全部输出到out.txt。
#include <stdio.h>
int main() {
char a;
while((a=getchar())!=EOF) {
if(a>='a'&&a<='z')
putchar(a-32);
else{putchar(a);
}
}
return 0;
}
重定位输入输出

in.txt做输入

out.txt做输出

- 从键盘上输入数据并进行加、减、乘、除四则运算(以“a运算b”的形式输入),判断输入的数据是否可以进行计算,若能计算,则输出计算结果,保留小数点后2位,否则显示“wrong input”。另外,碰到除数为0是能提示“division by zero”。形式参考第八章PPT18页。
#include <stdio.h>
int main() {
float x1,x2;
char a;
while(scanf("%f %c %f",&x1,&a,&x2)==3){
if(a=='+'){
printf("%.2f\n",x1+x2);
}
else if(a=='-'){
printf("%.2f\n",x1-x2);
}
else if(a=='*'){
printf("%.2f\n",x1*x2);
}
else if(a=='/'&&x2!=0){
printf("%.2f\n",x1/x2);
}
else if(a=='/'&&x2==0){
printf("division by zero\n");
}
else{
printf("wrong input\n");
}
printf("\n");
}
return 0;
}

- 混合读入字符、数值,形式参考第八章PPT19页。
问题描述:
先读入一个字符,再读入一个整数,最后又读入一个字符;然后分别输出它们
输入格式:n个空格和/或<回车>,一个字符,m个空格和/或<回车>,一个整数,k个空格和/或<回车>,一个字符
输出格式:字符整数字符
#include <stdio.h>
int main() {
char x1,x2;
int a;
scanf("\n%c \n%d \n%c",&x1,&a,&x2);
printf("%c%d%c",x1,a,x2);
return 0;
}

- 设计一个多源代码文件程序的编译。例如,first.c源代码文件包含主函数和一些头文件(second.h),second.c源代码文件是一些自定义的函数功能实现,second.h文件是一些常量声明和second.c中自定义函数的函数原型声明。
//second.h 头文件
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#define basepay 10.00
#define overtime 40
#define overrate 1.5
#define taxes1 300
#define taxesrate1 0.15
#define taxes2 150
#define taxesrate2 0.2
#define taxesrate3 0.25
double wage(int time); //计算工资
double taxes(double wage); //计算税金
double income(double wage, double taxes); //计算净收入
//second.cpp 函数功能实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "second.h"
double wage(int time) {
double wage;
if (time > overtime) {
wage = ((time - overtime) * overrate + overtime) * basepay;
}
else {
wage = time * basepay;
}
return wage;
}
double taxes(double wage) {
double taxes;
if (wage <= taxes1) {
taxes = wage * taxesrate1;
}
else if (wage <= taxes2 + taxes1) {
taxes = taxes1 * taxesrate1 + (wage - taxes1) * taxesrate2;
}
else {
taxes = taxes1 * taxesrate1 + taxes2 * taxesrate2 + (wage - taxes2) * taxesrate3;
}
return taxes;
}
double income(double wage, double taxes) {
double income;
income = wage - taxes;
return income;
}
//first.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "second.h"
int main(void)
{
int time;
double w, t, in;
printf("请输入一周工作的小时数:");
scanf("%d", &time);
w = wage(time);
t = taxes(w);
in = income(w, t);
printf("工资总额:%f美元\n", w);
printf("税金:%f美元\n", t);
printf("净收入:%f美元\n", in);
return 0;
}

- 编写一个程序,在该程序中输出主函数中定义变量的地址,以及函数中定义的同名变量的地址。
#include <stdio.h>
void print(int n){
printf("&n=%p\n",&n);
}
int main() {
int n=27;
printf("&n=%p\n",&n); //主函数中定义变量的地址
print(n); //函数中定义的同名变量的地址
return 0;
}

编写并运行书本第8章8.11编程练习题目中的第3~7题。
- 设计一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告输入中的大写字母和小写字母个数。假设大小写字母数是连续的。或者使用ctype.h库中合适的分类函数更方便
#include <stdio.h>
#include <ctype.h>
int main() {
char ch;
int lower=0,upper=0;
printf("请输入字符流:\n");
while((ch=getchar()) != EOF){
if(islower(ch)){ //判断小写字母
lower++;
}
else if(isupper(ch)){ //判断大写字母
upper++;
}
}
printf("大写字母数:%d\n",upper);
printf("小写字母数:%d\n",lower);
return 0;
}

- 设计一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告平均每个单词的字母数。不要把空白统计为单词的字母。
#include <stdio.h>
#include <ctype.h>
int main() {
char ch;
int num=0,n=0;
printf("请输入字符流:\n");
while((ch=getchar()) != EOF){
if(isalpha(ch)){
n++; //计数总字母数
}
else if(isspace(ch)){
num++; //计数总单词数
}
}
printf("单词平均字母数:%d\n",n/num);
return 0;
}

- 修改程序清单8.4的猜数字程序,使用更智能的猜测策略。例如,程序最初猜50,询问用户是大了,小了还是猜对了。如果小了,那么下一次的猜测值应该是50和100中值,75;猜大了,同理。使用二分查找,很快就会猜到真确答案。
#include <stdio.h>
int main() {
char re;
int guess=50,upper=100,lower=1,result;
printf("Pick an integer from 1 to 100 .I will try to guess it.\n");
scanf("%d",&result);
printf("Respond with a y if my guess is right or b if my guess is bigger than it or l if my guess is litter.\n");
printf("is you number %d?\n",guess);
while((re=getchar())!='y'){
if(re=='b'){
upper=guess; //猜大了,改变上限为guess
guess=(upper+lower)/2; //计算中值
}
else if(re=='l'){
lower=guess; //猜小了,改变下限为guess
guess=(upper+lower)/2;
}
printf("is you number %d?\n",guess);
}
return 0;
}

- 修改程序清单8.8中的get_first()函数,让该函数返回读取的第一个非空白字符,并在一个简单程序中测试
#include <stdio.h>
char get_first(){
char ch;
while((ch=getchar())==' '){
}
return ch;
}
int main() {
char ch=get_first();
putchar(ch);
return 0;
}

- 修改第七章的练习八,用字符替代数字标记菜单的选项。用q代替5作为结束输入的标志
#include <stdio.h>
#define RATE_1 8.75
#define RATE_2 9.33
#define RATE_3 10.00
#define RATE_4 11.20
#define TAX_RATE_1 0.15
#define TAX_RATE_2 0.20
#define TAX_RATE_3 0.25
#define TAX_BREAK_1 300.0
#define TAX_BREAK_2 450.0
#define OVERTIME_HOURS 40
#define OVERTIME_RATE 1.5
void menu(void);
double calculate_wage(double hours, double pay_rate);
double calculate_taxes(double gross);
int main(void)
{
char choice;
double hours;
double rate;
double wage, taxes, income;
while (1)
{
menu();
scanf("%c", &choice) ;
switch (choice)
{
case 'a':
rate = RATE_1;
break;
case 'b':
rate = RATE_2;
break;
case 'c':
rate = RATE_3;
break;
case 'd':
rate = RATE_4;
break;
case 'q':
printf("程序结束。\n");
return 0;
default:
printf("请输入a-d之间或q的有效选项。\n");
continue;
}
printf("请输入工作小时数: ");
if (scanf("%lf", &hours) != 1 || hours < 0)
{
printf("无效的工作小时数。\n");
while (getchar() != '\n')
continue;
continue;
}
// 计算工资总额
wage = calculate_wage(hours, rate);
// 计算税金
taxes = calculate_taxes(wage);
// 计算净收入
income = wage - taxes;
// 输出结果
printf("\n工资总额: $%.2f\n", wage);
printf("税金: $%.2f\n", taxes);
printf("净收入: $%.2f\n\n", income);
}
return 0;
}
void menu(void)
{
printf("****************************************\n");
printf("请选择对应的工资等级或操作:\n");
printf("a) $%.2f/小时\tb) $%.2f/小时\n", RATE_1, RATE_2);
printf("c) $%.2f/小时\td) $%.2f/小时\n", RATE_3, RATE_4);
printf("q) 退出\n");
printf("****************************************\n");
printf("请选择(a-d or q): ");
}
double calculate_wage(double hours, double rate)
{
if (hours > OVERTIME_HOURS)
{
return OVERTIME_HOURS * rate + (hours - OVERTIME_HOURS) * rate * OVERTIME_RATE;
}
else
{
return hours * rate;
}
}
double calculate_taxes(double gross)
{
double taxes = 0.0;
if (gross <= TAX_BREAK_1){
taxes = gross * TAX_RATE_1;
}
else if (gross <= TAX_BREAK_2){
taxes = TAX_BREAK_1 * TAX_RATE_1 + (gross - TAX_BREAK_1) * TAX_RATE_2;
}
else{
taxes = TAX_BREAK_1 * TAX_RATE_1 + (TAX_BREAK_2 - TAX_BREAK_1) * TAX_RATE_2 + (gross - TAX_BREAK_2) * TAX_RATE_3;
}
return taxes;
}

编写并运行书本第9章9.11编程练习题目中的第1~4,8,9,11题。
- 设计一个函数min(x,y),返回两个double类型值的较小值
#include <stdio.h>
double min(double x,double y){
if(x<y){return x;
}
return y;
}
int main() {
double x=1.20,y=2.10;
printf("%f",min(x,y));
return 0;
}

- 设计一个函数chline(ch,i,j),打印指定的字符j行i列
#include <stdio.h>
void chline(char ch,int i,int j){
for(int m=0;m<j;m++){
for(int n=0;n<i;n++){
printf("%c",ch);
}
printf("\n");
}
}
int main() {
char ch;
int i,j;
printf("请输入要输出的字符和行列数:");
scanf("%c %d %d",&ch,&j,&i) ;
chline(ch,i,j);
return 0;
}

- 编写一个函数,接受三个参数:一个字符,两个整数。字符参数是待打印的字符,第一个整数指定一行中打印字符次数,第二个字符指定打印字符行数
#include <stdio.h>
void chline(char ch,int i,int j){
for(int m=0;m<j;m++){
for(int n=0;n<i;n++){
printf("%c",ch);
}
printf("\n");
}
}
int main() {
char ch;
int i,j;
printf("请输入要输出的字符和行列数:");
scanf("%c %d %d",&ch,&j,&i) ;
chline(ch,i,j);
return 0;
}

- 两数的调和平均数:先得到这两数的倒数,然后计算着两个倒数的平均值,最后计算结果的倒数。编写一个函数,接受两个double类型的参数,返回调和平均数
double ave(double x1,double x2){
double x3=1/x1;
double x4=1/x2;
return 1/((x3+x4)/2);
}
int main() {
double x1=1.0,x2=2.0;
printf("x1=%f \nx2=%f \n调和平均数为:%f",x1,x2,ave(x1,x2));
return 0;
}

- 改进第六章程序清单6.20中power()函数,使其能正确计算负幂,另外函数要处理0的任何次幂都是0,任何数的0次幂都是1,使用循环测试该函数
#include <stdio.h>
double power(double n,int p){
int p1=p;
if(n==0){return 0; //0的任何次幂都是0
}
else if(p==0){return 1; //任何数的0次幂都是1
}
else if(p<0){
p1=-p;
}
double pow=1;
for(int i=1;i<=p1;i++){ //先计算n^|P|,再判断p<0时,返回1/pow;p>0,返回,pow;
pow*=n;
}
if(p<0){return (1/pow);
}
return pow;
}
int main() {
double n;
int p;
printf("请输入底数和指数:");
while (scanf("%lf%d",&n,&p) == 2){
printf("%lf^%d=%lf\n",n,p,power(n,p));
printf("请再次输入(输入q时停止):") ;
}
return 0;
}

- 使用递归函数重新编写上题
#include <stdio.h>
double power(double n,int p){
if(n==0){return 0;
}
else if(p==0){return 1;
}
else if(p==1){
return n;
}
else if(p==-1){return 1/n;
}
if(p<-1){
return power(n,p+1)/n;
}
else if(p>1){
return power(n,p-1)*n;
}
}
int main() {
double n;
int p;
printf("请输入底数和指数:");
while (scanf("%lf%d",&n,&p) == 2){
printf("%lf^%d=%lf\n",n,p,power(n,p));
printf("请再次输入(输入q时停止):") ;
}
return 0;
}

- 编写并测试Fibonacci()函数,该函数用循环代替递归计算斐波那契数
#include <stdio.h>
int Fibonacci(int n){
if(n<=2){
return 1;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
int main() {
int n;
printf("请输入求n个斐波那契数:");
scanf("%d",&n);
int i=1;
while(i<=n){
printf("%d ",Fibonacci(i++));
}
return 0;
}

浙公网安备 33010602011771号