c语言课后习题代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章
1.编程实现:输入一个字母,假设为小写,则把它变成大写输出。

代码如下:
#include<stdio.h>
main()
{
char c;
printf("Please input a character:");
scanf("%c",&c);
if(c>='a'&&c<='z')
printf("The result is :%c\n",c-32);
}
2.由键盘输入3个数a、b、c,编程输出其中最小的数。

代码如下:
#include<stdio.h>
main()
{
int a,b,c,t;
printf("Please input three numbers:");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{
t=a;
a=b;
b=t;
}
if(a>c)
{
t=a;
a=c;
c=t;
}
printf("The minimum is :%d\n",a);
}
3.由键盘输入三个数a、b、c,用条件运算符求出最大值和最小值。

代码如下:
#include<stdio.h>
main()
{
int a,b,c,min,max;
printf("Please input three numbers:");
scanf("%d%d%d",&a,&b,&c);
max=min=a;//初始化最大值与最小值为a
//求出最大值
max=max>b ? max:b;
max=max>c ? max:c;
//求出最小值
min=min>b ? b:min;
min=min>c ? c:min;
printf("The maximum is :%d,the minimum is :%d\n",max,min);
}
4. 编写程序,实现功能:从键盘上输入1,2,3,4,分别显示
excellent ,good,pass,fail。

代码如下:
#include<stdio.h>
main()
{
int a;
printf("Please input a number:");
scanf("%d",&a);
switch(a)
{
case 1:
printf("Excellent\n");
break;
case 2:
printf("Good\n");
break;
case 3:
printf("Pass\n");
break;
case 4:
printf("Fail\n");
break;
default :
printf("You input a wrong number!\n");
}
}
5. 试编程判断输入的正整数是否既是5又是7的整数倍。

假设是,则输出yes;
则输出no。

代码如下:
#include<stdio.h>
main()
{
int a;
printf("Please input a number:");
scanf("%d",&a);
if(a%5==0&&a%7==0)
printf("Yes\n");
else printf("No\n");
}
6. 编写程序,要求:输入一个正整数,判断其能否被3、5整除,并输出一下信
息之一。

(1) 能被3、5整除。

(2) 能被3整除。

(3) 能被5整除。

(4) 不能被3、5整除。

代码如下:
#include<stdio.h>
main()
{
int a;
printf("Input a number:");
scanf("%d",&a);
if(a%3==0)
if(a%5==0)
printf("能被3、5整除\n");
else printf("能被3整除\n");
else
if(a%5==0) printf("能被5整除\n");
else printf("不能被3、5整除\n");
}
7. 对于给定的一百分制成绩,要求输出相应的五分制成绩,即90分及以上为A,
80~89分为B,70~79分为C,60~69分为D,60分以下为E。

代码如下:
#include<stdio.h>
main()
{
float a;
printf("Please input score:");
scanf("%f",&a);
if(a<60) printf("The class is :E\n");
else
if(a<70) printf("The class is :D\n");
else
if(a<80) printf("The class is : C\n");
else
if(a<90) printf("The class is : B\n");
else
if(a<=100) printf("The class is : A\n");
else printf("Error!\n");
}
第五章
1. 编一个程序,求1~100所有偶数和。

代码如下:
#include<stdio.h>
main()
{
int i, sum=0;//考虑到时空效率,此处可用short,节省空间,sum记录偶数//和,变量参加累加,必须赋初值
for(i=1;i<=100;i++)
if(i%2==0) sum+=i;
printf("The sum is :%d\n",sum);
}
2. 编一个程序,求s=1!+2!+3!+…+10!的值。

代码如下:
#include<stdio.h>
main()
{
int i,j,sum=0,t;
for(i=1;i<=10;i++)
{
for(j=1,t=1;j<=i;j++)
t*=j;
sum+=t;
}
printf("s=1!+2!+3!+…-+10!=%d\n",sum);
}
3. 计算1-3+5-7+9+…-99+ 101。

代码如下:
#include<stdio.h>
main()
{
int i,s=1,sum=0;
for(i=1;i<=101;i+=2)
{
sum+=s*i;
s*=-1;
}
printf("1-3+5-7+9…--99+101 = %d\n",sum);
}
4. 编程求1000以内〔包括1000〕能被5同时又能被11整除的数的和。

代码如下:
#include<stdio.h>
main()
{
int i,sum=0;
for(i=1;i<=1000;i++)
if(i%5==0&&i%11==0)
sum+=i;
printf("%d\n",sum);
}
5. 编程打印出所有的“水仙花数”。

所谓“水仙花数”是指一个三位数,其中
各位数字的立方和等于该数本身。

例如:153=1*1*1+5*5*5+3*3*3。

代码如下:
#include<stdio.h>
main()
{
int a,b,c,i;
for(i=100;i<1000;i++)
{
a=i%10;
b=(i/10)%10;
c=i/100;
if(i==a*a*a+b*b*b+c*c*c)
printf("%d ",i);
}
printf("\n");
}
6. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项和。

代码如下:
#include<stdio.h>
main()
{
int i;
float a=2,b=1,t,sum=0;//a为分子,b为分母
for(i=0;i<20;i++)
{
sum+=a/b;
t=a;
a+=b;
b=t;
}
printf("The sum is :%f\n",sum);
}
7. 有一个球从10m高度落下并反弹,且每次反弹的高度为下落高度的一半。


第4次落地时共经过多少米?第4次反弹的高度是多少?
代码如下:
#include<stdio.h>
main()
{
float h1=10,sum=0;
int i;
for(i=0;i<4;i++)
{
if(i==0) sum+=h1;
else sum+=2*h1;
h1/=2;
}
printf("第4次落地时共经过:%.3f 米,第4次反弹的高度为:%.3f 米
\n",sum,h1);
}
第六章
1. 求二维数组中全部元素的和。

假定二维数组为a[2][3]={1,2,3,4,5,6}
代码如下:
#include<stdio.h>
main()
{
int a[2][3]={1,2,3,4,5,6},i,j,sum=0;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
sum+=a[i][j];
printf("The sum is :%d\n",sum);
}
2. 有三个字符串,要求按照字母的顺序输出。

假定为:America,China,India; 代码如下:
#include<stdio.h>
main()
{
char a[]="China",b[]="America",c[]="India", t[]={"\0"};
int i,j;
if (strcmp(a,b)>0){strcpy(t,a);strcpy(a,b);strcpy(b,t);}
if (strcmp(a,c)>0){strcpy(t,a);strcpy(a,c);strcpy(c,t);}
if (strcmp(b,c)>0){strcpy(t,b);strcpy(b,c);strcpy(c,t);}
puts(a);puts(b);puts(c);
}
#include<stdio.h>
main()
{
int a[4][3],i,j,m=1,sum=0;
for(i=0;i<4;i++)
for(j=0;j<3;j++,m++)
a[i][j]=m;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
{
if(i==0||i==3)
sum+=a[i][j];
else
if(j==0||j==2)
sum+=a[i][j];
}
printf("The sum is: %d\n",sum);
}
4. 将一个数组中的值按逆序重新存放,例如原来的顺序为:8,6,5,4,1。

要求改
为:1,4,5,6,8。

代码如下:
#include<stdio.h>
int main()
{
int a[] = { 8, 6, 5, 4, 1 }, i, j, t;
for (i = 0;i<=2; i++)
{
t = a[i];
a[i] = a[4 - i];
a[4 - i] = t;
}
for (i = 0; i < 5; i++)
printf("%d ", a[i]);
printf("\n");
}
5. 已有一个排序好的数组,输入一个数,要求按原来的顺序将它插入数组中。

假定排序好的数组为:a[]={1 ,8,11,14,16,17,21}
代码如下:
#include<stdio.h>
int main()
{
int a[] = { 1, 8, 11, 14, 16, 17, 21 }, i, j, t, b[8];
printf("Please input a number:");
scanf("%d", &t);
for (i = 0; i < 7; i++)
{
if (a[i]>t)
{
j = i;
break;
}
}
for (i = 0; i < 8; i++)
{
if (i<j) b[i] = a[i];
else if (i == j) b[i] = t;
else b[i] = a[i - 1];
}
for (i = 0; i < 8; i++)
printf("%d ", b[i]);
printf("\n");
}
6. 求一维数组各元素的平均值。

假定数组为:a[]={1,2,3,4,5,6}
代码如下:
#include<stdio.h>
main()
{
int a[6],i,sum=0;
for(i=0;i<6;i++)
a[i]=i+1;
for(i=0;i<6;i++)
sum+=a[i];
printf("The sum is :%d\n",sum);
}
7. 编写一个程序,将两个字符串连接起来,不要用strcat函数。

代码如下:
#include<stdio.h>
int main()
{
char a[] = "China ", b[] = "stronger!";
char c[sizeof(a)+sizeof(b)];
int i, j;
for (i = 0; a[i] != 0; i++)
c[i] = a[i];
for (j = 0; b[j] != 0; j++)
c[i + j] = b[j];
c[i + j] = 0;
printf("连接后的字符串为:%s\n", c);
}
第七章
1.编写一个函数,使输入的一个字符串反序存放,在主函数中输入和输出字符串。

代码如下:
#include<stdio.h>
#include<string.h>
void sort(char[]);
int main()
{
char a[101];
printf("请输入一个字符串〔100个字符以内〕:");
scanf("%s", a);
sort(a);
printf("%s\n", a);
}
//参看函数原型声明,参数为字符数组,为传址调用,故对形参的操作会改变实参
void sort(char str[])
{
char t;
int i, j = strlen(str);//j获取串长
for (i = 0; i <= (j-1) / 2; i++)//实现倒序交换
{
t = str[i];
str[i] = str[j-i-1];
str[j-i-1] = t;
}
str[j] = 0;//在字符串末尾加上结束符
}
2. 已有变量定义和函数调用语句“int x=57;isprime〔x〕;”函数isprime〔〕
用来判断一个整数x是否为素数,假设是素数,函数返回1,否则返回0。

请编写isprime〔〕函数。

函数代码如下:
int isprime(int a)
{
int i, s = 1;
for (i = 2; i < a; i++)
{
if (a%i == 0)
{
s = 0;
break;
}
}
return s;
}
3. 已有变量定义和函数调用语句”int a=1,b=5;c=fun(a,b)”,fun〔〕函数的作用
是计算两个数之差的绝对值,并将差值返回调用函数,请编写fun〔〕函数。

函数代码如下:
int fun(int a, int b)
{
int s;
if (a < b)
s = b - a;
else s = a - b;
return s;
}
4. 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格
和其他字符的个数,在主函数中输入字符串以及输出统计结果。

代码如下:
#include<stdio.h>
void fun(char str[])
{
int i,num,ch,sp,other;
num = ch = sp = other = 0;
for (i = 0; str[i] != 0; i++)
{
if ((str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z'))
ch++;
else if (str[i] >= '0'&&str[i] <= '9')
num++;
else if (str[i] == ' ')
sp++;
else other++;
}
printf("字母个数:%d,数字个数:%d,空格个数:%d,其他字符:%d\n", ch, num, sp, other);
}
int main()
{
char a[11];
gets(a);
fun(a);
}
5. 输入一个只含数字字符的字符串,编写一函数,要求输出这个字符串,但每
个数字字符之间空一个空格,例如,输入:“123456”,应输出:“1 2 3 4 5 6”。

代码如下:
#include<stdio.h>
void print(char str[])
{
int i;
for (i = 0; str[i] != 0; i++)
{
if (str[i+1]==0)
printf("%c", str[i]);
else printf("%c ", str[i]);
}
printf("\n");
}
int main()
{
char a[11]="123456";
print(a);
}
6. 编写函数,把一个字符串连接到另一个字符串的后面,形成一个新的字符串。

代码如下:
#include<stdio.h>
#include<string.h>
void contact(char a[], char b[])
{
int i, j;
char c[20];
for (i = 0; a[i] != 0; i++)
c[i] = a[i];
for (j = 0; b[j] != 0; j++)
c[j + i] = b[j];
c[i + j] = 0;
printf("%s\n", c);
}
int main()
{
char a[] = "China ", b[] = "stronger!";
contact(a, b);
}
7. 用递归法求1+2+3+4+…n。

代码如下:
#include<stdio.h>
int sum(int a)
{
int s;
if (a > 0)
s =a+sum(a-1);
else s=0;
return s;
}
int main()
{
int n;
scanf("输入一个整数:%d", &n);
printf("%d\n", sum(n));
}
第八章
1. 输入2个整数,求它们相除的余数,用带参的宏实现。

代码如下:
#include<stdio.h>
#define m(i,j) ((i)%(j))
int main()
{
int i,j;
printf("请输入两个整数:");
scanf("%d%d", &i,&j);
printf("%d\n", m(i,j));
}
2. 给年份定义一个宏,以判断该年份是否为闰年。

代码如下:
#include<stdio.h>
#define FLAG(i) ((i)%400==0||((i)%4==0&&(i)%100==0))
int main()
{
int i,j;
printf("请输入一个年份:");
scanf("%d", &i);
if (FLAG(i)) printf("该年是闰年。

\n");
else printf("该年不是闰年。

\n");
}
第九章
1. 编写一个函数对输入的10个字符按由小到大排序,用指针作参数。

#include<stdio.h>
char* sort(char*);//形参为指针,传址调用,返回值类型可设为空
int main()
{
char a[11],*b;
int m;
for (m = 0; m < 10; m++)
scanf("%c", &a[m]);
b=sort(a);
for (m = 0; m < 10; m++)
printf("%c", b[m]);
}
char* sort(char* ch)
{
int i, j;
char t;
for (i = 0; i < 10; i++)
{
for (j = i; j < 10; j++)
{
if (ch[i]>ch[j])
{
t = ch[i];
ch[i] = ch[j];
ch[j] = t;
}
}
}
return ch;
}
2. 用指向指针的方法对6个字符串排序输出。

要求将排序单独编写成一个函数。

数据在主函数中输入,最后在主函数中输出排序结果。

代码如下:
#include<stdio.h>
#include<string.h>
char *sort(char**);
int main()
{
char *a[6],str[6][101];
int i;
printf("请输入6个字符串(100字符以内):");
for (i = 0; i < 6; i++)
{
scanf("%s", str[i]);
a[i] = str[i];
}
sort(a);
for (i = 0; i < 6; i++)
printf("%s\n", a[i]);
}
char *sort(char **s)
{
int i,j;
char *temp;
for (i = 0; i < 6; i++)
{
for (j = i; j < 6; j++)
{
if (strcmp(s[i], s[j])>0)
{
temp = s[j];
s[j] = s[i];
s[i] = temp;
}
}
}
return *s;
}
3. 输入5行文字,每行不超过40个字符。

统计各行大写字母、小写字母、空格、
数字以及其他字符各有多少,用二维字符数组指针实现。

代码如下:
#include<stdio.h>
int *kind(char**,int*);
int main()
{
char *str[5], s[5][41];
int i;
int result[3];
printf("请输入5行字符串(40字符以内):");
for (i = 0; i < 5; i++)
{
scanf("%s", s[i]);
str[i] = s[i];
}
kind(str, result);
printf("数字个数为:%d,小写字母个数为:%d,大写字母个数为:%d.\n",
result[0], result[1], result[2]);
}
int *kind(char **s,int* result)
{
int digit = 0, ch1 = 0, ch2 = 0, space = 0, i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; s[i][j] != 0; j++)
{
if (s[i][j] >= 'a'&&s[i][j] <= 'z')
ch1++;
else if (s[i][j] >= 'A'&&s[i][j] <= 'Z')
ch2++;
else if (s[i][j] >= '0'&&s[i][j] <= '9')
digit++;
else space++;
}
}
result[0] = digit;
result[1] = ch1;
result[2] = ch2;
return result;
}
4. 用指针编写求字符串长度的函数。

函数代码如下:
int slength(char* s)
{
int i, j = 0;
for (i = 0; s[i] != 0; i++)
j++;
return j;
}
5. 编写函数,对传送过来的3个数选出最大数和最小数,并通过形参返回调用
函数。

函数代码如下:
#include<stdio.h>
int main()
{
void compare(int, int, int, int&, int&);
int a, b, c, max, min;
scanf("%d%d%d", &a, &b, &c);
max = min = a;
compare(a, b, c, max, min);
printf("最大值:%d,最小值:%d.\n", max, min);
}
void compare(int a, int b, int c, int& x, int& y)
{
x = x > c ? (x > b ? x : b) : c;
y = y < c ? (y < b ? y : b) : c;
}
6. 编写程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。

要求在主函数中输入字符串及m的值并输出复制结果,在被调用函数中完成复制。

代码如下:
#include<stdio.h>
int main()
{
char* copy(char*, int);
char s[101];
char* r;
int m;
printf("请输入字符串:");
scanf("%s", &s);
printf("请输入复制的起始位置:");
scanf("%d", &m);
r=copy(s, m);
printf("复制后的函数为:%s", r);
}
char* copy(char* str, int site)
{
int i;
char *p;
p = &str[site - 1];
return p;
}
第十章
1.定义一个结构体类型,成员包括职工号、、性别、年龄、工资和地址。

定义结构体指针
和数组,数组含4个元素,用初始化方式赋值并输出。

代码如下:
#include<stdio.h>
int main()
{
struct worker
{
char number[5];//职工号
char name[20];
char sex;
int age,pay;
char address[100];
};
struct worker*p,workers[4] = {
{ "0001", "Zhousan", 'M', 23, 1300, "Nanchang Jiangxi" },
{ "0002", "Lisi", 'F', 25, 1300, "Poyang Jiangxi province" },
{ "0003", "Wangwu", 'F', 22, 1400, "Xinyu Jiangxi" },
{ "0004", "Maliu", 'M', 21, 1100, "Ganzhou Jiangxi" }
};
int i;
p = workers;
printf("Number\tName\tSex\tAge\tPay\tAdress\t\n");
for (i = 0; i < 4; i++)
printf("%s\t%s\t%c\t%d\t%d\t%s\n", p[i].number, p[i].name, p[i].sex,
p[i].age, p[i].pay, p[i].address);
}
2. 存储一个班学生,然后输入一个学生的,查找该人是否为该班的学生。

代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
struct student
{
char name[20];
};
struct student *p, stu[5] = { "Zhou chang", "Zhang long", "Zhao qing", "Hu wei", "Liu jian" };
char n[20]="Zhao qing";
int i;
p = stu;
printf("请输入以查找:");
gets(n);
for (i = 0; i < 5; i++)
{
if (strcmp(p++->name, n) == 0)
{
printf("是该班级学生。

\n");
break;
}
else if (i == 4)
printf("不是该班级学生。

\n");
}
}
3. 读入班级学生人数,每名学生学号和4门功课成绩,计算全班每名学生4门
功课的平均成绩。

代码如下:
#include<stdio.h>
#include<malloc.h>
#define len sizeof(struct student)
int main()
{
typedef struct student
{
char name[20];
char number[10];//学号
float score[4];
float aver;
struct student* next;//使用链表,假设不使用链表,可使用动态数组}stus;
//置空指针
stus* stu = NULL;
stus* p = NULL;
stus* head = NULL;
unsigned n, i, j;
float sum = 0;
printf("请输入学生人数:");
scanf("%d", &n);
head = (stus*)malloc(len);
//假设未正常开辟内存空间,报错
if (head == NULL)
{
printf("内存不足!");
return 0;
}
head->next = NULL;//下一节点置空
p = head;
for (i = 0; i < n; i++)
{
printf("请输入第%d位学生学号(9字符以内):", i + 1);
scanf("%s", p->number);
printf("请输入该学生(19字符以内):");
scanf("%s", p->name);
printf("请输入该学生四门功课成绩:");
for (j = 0; j < 4; j++)
scanf("%f", &p->score[j]);
stu = p;
stu->next = (stus*)malloc(len);//开辟新空间给下一节点
p = stu->next;
p->next = NULL;//尾部始终置空
}
for (i = 0, stu = head; i < n; i++)
{
for (j = 0; j < 4; j++)
sum += stu->score[j];
stu->aver = sum / 4.0;
sum = 0;
stu = stu->next;
}
printf("这些学生信息如下:\n");
printf("学号\t\t\t\t平均分\n\n");
for (i = 0, stu = head; i < n; i++, stu = stu->next)
printf("%s\t\t%s\t\t%.2f\t\t\n", stu->number, stu->name, stu->aver);
printf("\n");
free(head);//释放内存空间
}
4. 有4个学生,每个学生包括学号、、成绩。

要求找出成绩最高者的学号和。

代码如下:
#include<stdio.h>
int main()
{
typedef struct student
{
char number[10];
char name[20];
float grades;
}stus;
float max;
int i;
stus s[4];
for (i = 0; i < 4; i++)
{
printf("请输入第%d个学生学号(9字符以内):", i + 1);
scanf("%s", s[i].number);
printf("请输入第%d个学生(19字符以内):", i + 1);
scanf("%s", s[i].name);
printf("请输入第%d个学生成绩:", i + 1);
scanf("%f", &s[i].grades);
}
max = 0;
for (i = 0; i < 4; i++)
{
if (max < s[i].grades)
max = s[i].grades;
}
printf("拥有最高分的学生信息如下:\n");
printf("学号\t\t\t\t成绩\n");
for (i = 0; i < 4; i++)
{
if (max == s[i].grades)
printf("%s\t\t%s\t\t%f\n", s[i].number, s[i].name, s[i].grades);
}
}。

相关文档
最新文档