c语言第六次作业
- 格式:doc
- 大小:194.50 KB
- 文档页数:14
第六次作业:指针(以下题目如无特殊声明,请使用指针技术实现,尽量不要使用数组作为形参,也尽量避免使用数组下标引用数组元素)1.数组元素循环移位有n个整数,使前面的各整数顺序向后移动m个位置,后面的m个整数则变成最前面的m个数。
写一函数实现以上功能。
在主函数中输入n及n个整数,输入m (m<n),调用编写的上述函数,然后输出调整后的n个整数。
#include<stdio.h>void main(){void inv(int *p,int n,int m);int n,m,a[20],*p;printf("please input n=");scanf("%d",&n);printf("please input %d numbers:",n);p=a;while(p<a+n)scanf("%d",p++);printf("please input m=");scanf("%d",&m);p=a;inv(a,n,m);printf("the new array:\n");while(p<a+n)printf("%d ",*p++);putchar('\n');}void inv(int *p,int n,int m){int i;for(i=1;i<=n;i++)*(p+n-i+m)=*(p+n-i);for(i=0;i<m;i++)*(p+i)=*(p+n+i);}2. 矩阵元素的排序将一个5×5的整数型矩阵中各元素重新排序。
排序规则为,矩阵元素按照从左到右,从上到下的顺序依次递增,即4,41,10,14,03,02,01,00,0.......a a a a a a a a ≤≤≤≤≤≤≤。
1.t为int类型,进入下面的循环之前,t的值为0while( t=l ){ ……}则以下叙述中正确的是( B )(A) 循环控制表达式的值为0 (B) 循环控制表达式的值为1(C) 循环控制表达式不合法(D) 以上说法都不对2.有以下程序main( ){ int i,s=0;for(i=1;i<10;i+=2) s+=i+1;printf(“%d\n”,s);}程序执行后的输出结果是 ( D )。
(A) 自然数1~9的累加和 (B) 自然数1~10的累加和(C) 自然数1~9中的奇数之和 (D) 自然数1~10中的偶数之和3.以下程序段的输出结果是( C )。
int x=3;do{ printf("%3d",x-=2); }while(!(- -x));(A)1 (B)30 (C)1 -2 (D)死循环4.以下程序中,while循环的循环次数是( D)。
main(){ int i=0;while(i<10){ if(i<1) continue;if(i==5) break;i++;}......}(A) 1 (B) 10(C) 6 (D) 死循环,不能确定次数5.下面程序的输出是( B )。
(A)741 (B)852 (C)963 (D)875421main(){int y=9;for(;y>0;y--){if(y%3==0){printf("%d",--y);continue;}}}6.若i,j已定义为int类型,则以下程序段中内循环体的总的执行次数是( A)。
for (i=5;i;i--)for(j=0;j<4;j++){...}(A)20 (B)25 (C)24 (D)307.执行语句: for(i=l;i++<4;;);后,变量i的值是(C)。
(A) 3 (B) 4 (C) 5 (D) 不定8.假定a和b为int型变量,则执行以下语句后b的值为( D )。
6.1 用筛选法求100之内的素数. #include <stdio.h>#define N 101void main(){ int i,j,line,a[N];for(i=1;i<=100;i++)a[i]=i;a[1]=0;for(i=2;i<sqrt(100);i++)for(j=i+1;j<=100;j++){ if(a[i]!=0 && a[j]!=0) if(a[j]%a[i]==0)a[j]=0;}printf("n");for(i=2,line=0;i<=100;i++) { if(a[i]!=0){ printf("%5d",a[i]); line++;if(line==10){ printf("n");line=0;}}}}6.2 用选择法对10个数排序.#define N 10main(){int i,j,min,temp,a[N];printf("请输入十个数:n"); for (i=0;i<=10;i++){ printf("a[%d]=",i);scanf("%d",&a[i]);}printf("n");for(i=1;i<=10;i++)printf("%5d",a[i]);printf("n");for (i=1;i<=9;i++){ min=i;for(j=i+1;j<=10;j++)if(a[min]>a[j]) min=j; temp=a[i];a[i]=a[min];a[min]=temp;}printf("n排序结果如下:n");for(i=0;i<N;i++)printf("%5d",a[i]);}6.3 对角线和:main(){float a[3][3],sum=0;int i,j;printf("请输入矩阵元素:n");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%f",&a[i][j]);for(i=0;i<3;i++)sum=sum+a[i][i];printf("对角元素之和= 6.2f",sum); }6.4 插入数据到数组{ int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j;printf("初始数组如下:");for (i=0;i<10;i++)printf("%5d",a[i]);printf("n");printf("输入插入数据:");scanf("%d",&number);end=a[9];if(number>end)a[10]=number;else{ for(i=0;i<10;i++){ if(a[i]>number){ temp1=a[i];a[i]=number;}for(j=i+1;j<11;j++){ temp2=a[j];a[j]=temp1;temp1=temp2;}break;}}for(i=0;j<11;i++)printf("a%6d",a[i]);}6.5 将一个数组逆序存放。
c++第六章作业第六章6-1 数组A[10][5][15]一共有多少个元素?解:10×5×15 = 750 个元素6-2在数组a[20]中第一个元素和最后一个元素是哪一个?解:第一个元素是a[0],最后一个元素是a[19]。
6-3 用一条语句定义一个有五个元素的int型数组,并依次赋予1~5的初值。
解:源程序:int IntegerArray[5] = { 1,2,3,4,5 };或:int IntegerArray[] = { 1,2,3,4,5 };6-4 已知有一个数组名叫oneArray,用一条语句求出其元素的个数。
解:源程序:nArrayLength = sizeof(oneArray) / sizeof(oneArray[0]);6-5 用一条语句定义一个有5×3个元素的二维int型数组,并依次赋予1~15的初值。
解:源程序:int theArray[5][3] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };或:int theArray[5][3] = { {1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15} };6-6 运算符*和&的作用是什么?解:*称为指针运算符,是一个一元操作符,表示指针所指向的对象的值;&称为取地址运算符,也是一个一元操作符,是用来得到一个对象的地址。
6-7 什么叫做指针?指针中储存的地址和这个地址中的值有何区别?解:指针是一种数据类型,具有指针类型的变量称为指针变量。
指针变量存放的是另外一个对象的地址,这个地址中的值就是另一个对象的内容。
6-8 定义一个整型指针,用new语句为其分配包含10个整型元素的地址空间。
解:源程序:int *pInteger = new int[10];6-9 在字符串”Hello,world!”中结束符是什么?解:是NULL字符。
第六套1.树是结点的集合,它的根结点数目是( )A.有且只有1B.1或多于1C.0或1D.至少2分析:树是一个或多个结点组成的有限集合,其中一个特定的结点称为根,其余结点分为若干个不相交的集合。
每个集合同时又时一棵树。
树有且只有1个根结点。
2.在设计程序时,应采纳的原则之一是( )A.不限制goto语句的使用B.减少或取消注解行C.程序越短越好D.程序结构应有助于读者理解分析:滥用goto语句将使程序流程无规律,可读性差,因此A)不选;注解行有利于对程序的理解,不应减少或取消,B)也不选;程序的长短要依照实际情况而论,而不是越短越好,C)也不选。
3.下列叙述中,不属于软件需求规格说明书的作用的是( )A.便于用户、开发人员进行理解和交流B.反映出用户问题的结构,可以作为软件开发工作的基础和依据C.作为确认测试和验收的依据D.便于开发人员进行需求分析分析:软件需求规格说明书(SRS,Software Requirement Specification)是需求分析阶段的最后成果,是软件开发中的重要文档之一。
它有以下几个方面的作用:①便于用户、开发人员进行理解和交流;②反映出用户问题的结构,可以作为软件开发工作的基础和依据;③作为确认测试和验收的依据。
4.单个用户使用的数据视图的描述称为( )A.外模式B.概念模式C.内模式D.存储模式分析:选项A正确,外模式是用户的数据视图,也就是用户所见到的数据模式;选项B)不正确,全局数据视图的描述称为概念模式,即数据库中全部数据的整体逻辑结构的描述;选项C)不正确,物理存储数据视图的描述称为内模式,即数据库在物理存储方面的描述;选项D)不正确,存储模式为内模式。
5.SQL语言又称为( )A.结构化定义语言B.结构化控制语言C.结构化查询语言D.结构化操纵语言分析:结构化查询语言(Structured Query Language,简称SQL)是集数据定义、数据操纵和数据控制功能于一体的数据库语言。
C 语言程序设计习题解答(第六章)6.1 题目略[解答] (1) A (2) A (3) C (4) D6.2 略6.3 从键盘输入3个整数, 要求设3个指针变量p1, p2, p3, 使p1指向3个数中的最大者, p2指向次大者, p3指向最小者, 最后按由大到小的顺序输出这3个数.[解答]#include <stdio.h>void main(){int x1, x2, x3, *p1=&x1, *p2=&x2, *p3=&x3, *p;printf("请输入3 个整数: ");scanf("%d%d%d", &x1, &x2, &x3);if(*p1<*p2){p=p1; p1=p2; p2=p;}if(*p1<*p3){p=p1; p1=p3; p3=p;}if(*p2<*p3){p=p2; p2=p3; p3=p;}printf("从大到小: %d, %d, %d\n", *p1, *p2, *p3);}6.4 想使指针变量pt1指向a和b中的较大者, pt2指向a和b中的较小者, 请问以下程序能否达到此目的?#include <stdio.h>void swap(int *p1, int *p2){int *p;p=p1; p1=p2; p2=p;}int main(void){int a, b;int *pt1, *pt2;scanf("%d, %d", &a, &b);pt1=&a; pt2=&b;if(a<b) swap(pt1, pt2);printf("%d, %d\n", *pt1, *pt2);return 0;}请分析此程序的执行情况, 指出pt1和pt2的指向并修改程序, 使之能够实现题目要求. [解答]main函数调用swap函数时, 将指针pt1和pt2的值分别赋给形式参数p1和p2, pt1与p1虽然都指向变量a, 但它们是不同的指针变量, 同样, pt2与p2也是不同的指针变量, swap函数中虽然改变了p1和p2的指向, 但不影响main函数中pt1和pt2的指向. 为了实现题目的要求, 可以修改程序, 将pt1与pt2的地址传给函数swap, 同时将swap的形式参数改为二级指针. 正确的程序如下:#include <stdio.h>void swap(int **p1, int **p2){int *p;p=*p1; *p1=*p2; *p2=p;}int main(void){int a, b;int *pt1, *pt2;scanf("%d, %d", &a, &b);pt1=&a; pt2=&b;if(a<b) swap(&pt1, &pt2);printf("%d, %d\n", *pt1, *pt2);return 0;}6.5 略6.6(1) 想输出数组a的10个元素, 用以下程序行不行? 为什么?#include <stdio.h>void main(){int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, i;for(i=0; i<10; i++, a++)printf(“%d”, *a);}请修改程序使之能实现题目要求.(2) 想输出数组a的10个元素, 用以下程序行不行? 请与上题对比并进行分析, 得到必要的结论.#include <stdio.h>void print_arr(int a[], int n){int i;for(i=0; i<n; i++, a++)printf("%d", *a);}void main(){int arr[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};print_arr(arr, 10);}请修改程序使之能实现题目要求.[解答](1) 不行, 因为数组名a表示该数组的首地址, 是一个指针常量, 其值是不能改变的, 因此不能进行++ 运算. 正确的程序如下:void main(){int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, i;for(i=0; i<10; i++)printf("%d ", *(a+i));}(2) 可以, 因为形参数组本质上是一个指针变量, 其值可以改变, 可以进行++ 运算.6.7 有一个数列, 含有20个整数, 现要求编一个函数, 能够对从指定位置开始的几个数按相反顺序排列, 并在main函数中输出新的数列. 例如, 原数列为:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20若要求对从第5个数开始的10个数进行逆序处理, 则得到的新数列为1, 2, 3, 4, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 15, 16, 17, 18, 19, 20[解答]#include <stdio.h>#define N 20void reverse(int a[], int m, int k) /* 将数组a 从第m 个数开始的k 个数按相反顺序排列*/ {int temp, *p, *q;for(p=a+m-1, q=p+k-1; p<q; p++, q--) /* p, q 初始时分别指向要反序的起始与终止位置*/{temp=*p; *p=*q; *q=temp;}}void main(){int i, m, k, a[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};printf("请输入要反序的数列的起始位置和长度: ");scanf("%d%d", &m, &k);reverse(a, m, k);printf("反序后的数列为: ");for(i=0; i<N; i++)printf("%d ", a[i]);printf("\n");}6.8 有n个人围成一圈, 顺序排号, 从第1号开始报数, 从1报到m, 凡报到m的人退出圈子.问最后留下的是原来第几序号的人? 要求如下:(1) 用函数实现报数并退出;(2) n和m的值由main函数输入并通过实参传递给该函数, 最后结果由main函数输出;(3) 要求使用指针.[解答]#include <stdio.h>#define N 100int baoshu(int a[], int n, int m) /* n 个人围成一圈, 从1 到m 报数的函数*/{int i, cnt, num, *p, last;for(i=0; i<n; i++) /*给每一个人赋予一个初始位置号*/*(a+i)=i+1;cnt=0; /* cnt 用于从1 到m 记数, 模拟报数*/num=0; /* num 用于记录出圈人数*/while(num<n)for(p=a; p<a+n; p++) /* 报数*/if(*p) /* 若*p 在圈中*/{cnt++; /* 报数记数器加1 */if(cnt==m) /* 若报数记数器到达m */{/* 处理出圈事宜*/last=*p; /* 用last 记录当前出圈者的位置号*/*p=0; /* 位置号清零, 表示从圈中删除此人*/cnt=0; /* 报数记数器清零, 下一个人重新开始报数*/num++; /* 出圈人数加1 */}}return last;}void main(){int n, m;int a[N]; /* 用数组 a 记录每一个人在圈中的位置 */printf("输入人数 n (<%d) 和所报的最大数 m: ", N);scanf("%d%d", &n, &m);printf("最后留下的是原来第 %d 号的人.\n", baoshu(a, n, m));}6.9 有一个二维数组a, 大小为53⨯, 其元素为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=2927252321191715131197531a (1) 请说明以下各表达式的含义:a, a+2, &a[0], a[0]+3, *(a+1), *(a+2)+1, *(a[1]+2), &a[0][2], *(a[0][2]), *(*(a+2)+1), a[1][3].(2) 如果输出a+1和&a[1][0], 它们的值是否相等? 为什么? 它们各代表什么含义?[解答](1)a : 数组首地址, 等价于 &a[0]a+2 : 第 2 行的地址, 等价于 &a[2]&a[0] : a[0]的地址, 即第0行的地址, 也是整个数组的首地址, 等价于a a[0]+3 : 第 0 行第 3 列元素的地址, 即 &a[0][3]*(a+1) : 第 1 行第 0 列元素的地址, 等价于 a[1] 和 &a[1][0]*(a+2)+1 : 第 2 行第 1 列元素的地址, 即与 &a[2][1] 等价*(a[1]+2) : 第 1 行第 2 列元素的值, 即 a[1][2] = 15&a[0][2] : 第 0 行第 2 列元素的地址*(a[0][2]) : 无意义*(*(a+2)+1) : 第 2 行第 1 列元素的值, 即 a[2][1] = 23a[1][3] : 第 1 行第 3 列元素的值, 等于 17.(2) 如果输出a+1和&a[1][0], 它们的值相等, 但它们有着不同的含义, a+1 等价于 &a[1], 表示第1行的首地址, 是一个二级指针; &a[1][0] 表示第1行第0列的地址, 是一个一级指针. 由于a[1][0] 是第1行的首元素, 因此它的地址刚好就是第1行的首地址, 从而两者输出的值相等.6.10 有一个整型二维数组, 大小是n m ⨯, 要求找出最大值所在的行和列以及该最大值, 请编写一个程序max, 要求如下:(1) 以数组名和数组大小为该函数的形参;(2) 数组元素的值在main 函数中输入, 结果在max 函数中输出.[解答]#include <stdio.h>#define M 3#define N 4void max(int a[], int m, int n){int i, j, row=0, col=0, max=*a;for(i=0; i<m; i++)for(j=0; j<n; j++, a++)if(*a>max){max=*a;row=i;col=j;}printf("最大值是%d, 在第%d, 第%d 列.\n", max, row, col);}void main(){int i, j, a[M][N];printf("请输入%d * %d 个整数:\n", M, N);for(i=0; i<M; i++)for(j=0; j<N; j++)scanf("%d", &a[i][j]);max(*a, M, N);}6.11 有n个学生, 每个学生参加m门课程的考试, 要求编写一函数, 能检查n个学生有无不及格的课程, 如果某个学生有一门或一门以上课程不及格, 就输出该学生的学号(学号从0算起, 即0, 1, 2, …) 及其全部课程成绩.[解答]#include <stdio.h>#define M 5 /*学生数*/#define N 3 /*课程数*/void proc(float s[][N]){int i, j, k;for(i=0; i<M; i++){for(j=0; j<N; j++)if(s[i][j]<60.0) break;if(j<N){printf("第%d 个学生有不及格的课程, 其各门课的成绩为:\n", i);for(k=0; k<N; k++)printf("%7.2f", s[i][k]);printf("\n");}}}void main(){float score[M][N];int i, j;for(i=0;i<M;i++){printf("请输入第%d 个学生的成绩: ", i);for(j=0;j<N;j++)scanf("%f", &score[i][j]);}proc(score);}6.12 输入3行字符(每行60个字符以内), 要求统计出其中共有多少个大写字母, 小写字母, 空格及标点符号.[解答]#include <stdio.h>#include <string.h>#define M 3#define N 60void main(){int i, j, upper=0, lower=0, blank=0, punc=0; /* upper, lower, blank, punc 分别记录大写字母, 小写字母, 空格及标点符号的个数*/char str[M][N];printf("请输入%d 行字符, 每行不超过%d 个字符:\n", M, N);for(i=0; i<M; i++)gets(str[i]);for(i=0; i<M; i++)for(j=0; j<N && str[i][j]!='\0'; j++)if(str[i][j]>='A' && str[i][j]<='Z')upper++;else if(str[i][j]>='a' && str[i][j]<='z')lower++;else if(str[i][j]==' ')blank++;else if(str[i][j]>' ' && str[i][j]<'0' || str[i][j]>'9' && str[i][j]<127)punc++;printf("大写字母, 小写字母, 空格及标点符号的个数分别是%d, %d, %d, %d.\n", upper, lower, blank, punc);}6.13 指出下列程序的错误, 并分析出错的原因.#include <stdio.h>void Print(char *[], int len);int main(void){char *pArray[]={"Fred", "Barrey", "Wilma", "Betty"};int num=sizeof(pArray)/sizeof(char);printf("Total string numbers = %d\n", num);Print(pArray, num);return 0;}void Print(char *arr[], int len){int i;for(i=0; i<len; i++)printf("%s\n", arr[i]);}[解答]程序第6行试图计算指针数组pArray所含元素的个数, 但这是错误的, 一个数组所含元素个数应该等于数组大小除以数组元素类型的大小, 这个数组的元素是字符指针类型, 而不是字符类型, 正确的语句是:int num=sizeof(pArray)/sizeof(char *);6.14 建立一个动态二维数组, 用来存储1~10的1~4次幂.[解答]#include <stdio.h>#include <stdlib.h>#define M 10#define N 4void main(){int i, j, (*p)[N], pow;p=(int (*)[N])malloc(M*N);if(!p){printf("内存分配出错.\n");exit(1);}for(i=0; i<M; i++){pow=1;for(j=0; j<N; j++)p[i][j]=pow*=(i+1);}for(i=0; i<M; i++){for(j=0; j<N; j++)printf("%6d", p[i][j]);printf("\n");}// free(p);}6.15 略.6.16 题目略.[解答] (1) A (2) C.。
1. 输入两个正整数m和n,求其最大公约数和最小公倍数。
辗除法——辗转相除法,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。
它是已知最古老的算法,其可追溯至3000年前。
它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
它并不需要把二数作质因子分解。
证明:设两数为a、b(a>b),求它们最大公约数(a、b)的步骤如下:用a除以b,余数为r 1。
若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得r2 .若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2,……如此下去,直到能整除为止。
其最后一个非零余数即为(a,b)。
例如,和7890 的最大公因子是6, 这可由下列步骤看出:a b a mod b7890 51067890 5106 27845106 2784 23222784 2322 4622322 462 12462 12 612 6 0#include<stdio.h>#include<conio.h>main(){int a,b,num1,num2,temp;/*temp主要用来转换大小*/printf("please input two numbers:\n");scanf("%d,%d",num1,&num2);if(num1<num2) /*如果num2比num1大,则执行下面循环体,为调整num1要比num2大*/{temp=num1;num1=num2;num2=temp;}a=num1;b=num2;/*a比b大*/while(b!=0) /*只要b不等于0,就一直执行下面的循环体,直至整除完为止。
*/{temp=a%b;a=b;b=temp;/*以上3句调整了a,b大小,使其整除为止*/}printf("公约数:%d\n",a);printf("公倍数:%d\n",num1*num2/a); /*由公式知*/getch();}评析:关键是判断两数的大小,先排好位置,再大除小,一直除尽即可。
第五题#include <stdio.h>int main (){int a[10][10],i,j,n;printf("Input n:");scanf("%d",&n);printf("* ");for(j=1;j<=n;j++){a[0][j]=j;printf("%d ",a[0][j]);}printf("\n");for(i=1;i<=n;i++){a[i][0]=i;printf("%d ",a[i][0]);for(j=1;j<=i;j++){a[i][j]=a[i][0]*a[0][j];printf("%d ",a[i][j]);}printf("\n");}return 0;}第二题#include <stdio.h>int main(void){int a[12]={31,0,31,30,31,30,31,31,30,31,30,31};int year,month,day,sum=0,i;printf("Input year,month,day:");scanf("%d%d%d",&year,&month,&day);if(year%4==0&&year%100!=0||year%400==0) a[1]=29;elsea[1]=28;for(i=0;i<month-1;i++)sum=sum+a[i];sum=sum+day;printf("%d",sum);return 0;}第三题#include <stdio.h>int main (){int n,i,j,a[6][6],index1,index2,index3,max;printf("Input n:");scanf("%d",&n);printf("Input arry:");for(i=0;i<n;i++){for(j=0;j<n;j++)scanf("%d",&a[i][j]);}for(i=0;i<n;i++){max=a[i][0];for(j=0;j<n;j++){if(a[i][j]>=max){index1=j;max=a[i][index1];}}for(i=0;i<n;i++){if(a[i][index1]<=max){index2=i;max=a[index2][index1];}}for(j=0;j<n;j++){if(a[index2][j]>=max){index3=j;max=a[index2][index3];}}if(index3==index1)break;}if(index3==index1)printf("a[%d][%d]=%d\n",index2,index3,a[index2][index3]);elseprintf("No\n");return 0;}字符串2题#include <stdio.h>int main (){char a[80],b;int i,index=-1,c;printf("Input a character:");scanf("%c",&b);printf("Input a string:");scanf("%s",a); (不能用gets,不知道为什么)for(i=0;a[i]!='\0';i++){if(a[i]==b)index=i;}if(index==-1)printf("Not Found\n");elseprintf("index=%d\n",index);return 0;}C语言字符串第四题#include <stdio.h>int main(){char a[80];int i;printf("Input a string:");gets(a);printf("After replaced:");for(i=0;a[i]!='\0';i++){if('A'<=a[i]&&a[i]<='Z')a[i]='A'+'Z'-a[i];printf("%c",a[i]);}printf("\n");return 0;}第五题#include <math.h>#include <stdio.h>int main (){char a[80],d[80];int i,j=-1,sum=0,sum1;printf("Input a string:");gets(a);for(i=0;a[i]!='\0';i++){if((a[i]>='0'&&a[i]<='9')||(a[i]>='A'&&a[i]<='F')){j++;d[j]=a[i];}}i=j;for(j=j;j>=0;j--){if(d[j]>='A'&&d[j]<='F')d[j]=d[j]-55;if(d[j]>='0'&&d[j]<='9')d[j]=d[j]-48;sum1=d[j];sum=sum1*pow(16,i-j)+sum;}printf("Hex=%d\n",sum);return 0;}指针约瑟夫环问题(不会做,看的答案,还是不懂)#include<stdio.h>#include<malloc.h>#include <stdlib.h>int main(){int n,i,total,token,*a;printf("Input n:");scanf("%d",&n);if((a=(int*)malloc(n*sizeof(int)))==NULL)exit(1);for(i=0;i<n;i++)a[i]=i+1;total=n;i=0;while(total>1){token=0;while(token<3){if(a[i]!=0)token++;if(token<3)i=(i+1)%n;}a[i]=0;i=(i+1)%n;total--;}for(i=0;i<n;i++)if(a[i]!=0)break;printf("Last No. is: %d\n",a[i]);free(a);return 0;}30页第5题#include <math.h>#include <stdio.h>int main(){float loan,rate,money;int year;printf("Input loan:");scanf("%f",&loan);printf("Input rate:");scanf("%f",&rate);printf("还款年限——月还款额\n");for(year=5;year<=30;year++){money=(loan*rate*pow(1+rate,year*12))/(pow(1+rate,year*12)-1);printf("还款年限:%d\t",year);printf("月还款额:%10.0f\n",money);}return 0;}P42页第八题#include <stdio.h>int main (){int a,n,i,sum=0,j,b;printf("Input a:");scanf("%d",&a);printf("Input n:");scanf("%d",&n);b=a;for(j=1;j<=n;j++){a=b;for(i=1;i<=j-1;i++)a=b+a*10;sum=sum+a;}printf("s=%d\n",sum);return 0;}实验八第四题void delchar(char s[],char c){char *p=s,*q=s;for(;*p!='\0';p++){if(*p!=c)*q++=*p;}*q='\0';}#include <stdio.h>#define n 80int main (){char s[n],*p,a;printf("Input a string:");gets(s);p=s;printf("input a char:");scanf("%c",&a);delchar(p,a);printf("After delected,the string is:");printf("%s\n",s);return 0;}void strmcpy(char s[],char t[],int m){char *q=s,*p=t;for(p=p+m-1;*p!='\0';p++,q++)*q=*p;*q='\0';}#include <stdio.h>int main (){char s[80],*p,t[80],*q=s;int a;printf("Input a string:");gets(t);p=t;printf("input an interger:");scanf("%d",&a);strmcpy(q,p,a);printf("Output is:");printf("%s\n",s);return 0;}实验八第五题#include <stdio.h>#define n 80int main (){char s[n],a,*p,*q,t[n];q=t;int i=-1; (注意i的初值)printf("Input a string:");gets(s);p=s;for(;*p!='\0';p++)i++;for(i=i;i>=0;i--,q++){*q=s[i];}*q='\0';for(p=s,q=t;*p!='\0';p++,q++){if(*p!=*q)break;}if(*p=='\0')printf("YES\n");elseprintf("No\n");return 0;}89页第九题源程序:#include <stdio.h>int main (void){struct student{int number;char name[20];int score[3];int sum;};(学生不止一个,结构体变量定义不对)int i,j,k,n,max=0;printf("输入n:");scanf("%d",&n);for(i=0;i<n;i++){printf("输入第%d个学生的学号、姓名和三门课程成绩:",i+1);scanf("%d%s",&student[i].number,&student[i].name);for(j=0;j<3;j++){scanf("%d",&student[i].score[j]);student[i].sum+=student[i].score[j]; (如果这样成绩为随机数,应该在刚进入外循环时,定义stud[i].sum=0}}max=student[0].sum;for(i=0;i<n;i++)if(max<student[i].sum) (把小于改成小于或等于){max=student[i].sum; k=i;}printf("总分最高的学生是%s,%d分\n",student[k].name,student[k].sum);return 0;}改正后的程序#include <stdio.h>int main (void){struct student{int number;char name[20];int score[3];int sum;}stud[10];int i,j,k,n,max;printf("输入n:");scanf("%d",&n);for(i=0;i<n;i++){stud[i].sum=0;printf("输入第%d个学生的学号、姓名和三门课程成绩:",i+1);scanf("%d%s",&stud[i].number,stud[i].name);for(j=0;j<3;j++){scanf("%d",&stud[i].score[j]);stud[i].sum+=stud[i].score[j];}}max=stud[0].sum;for(i=0;i<n;i++)if(max>=stud[i].sum){max=stud[i].sum;k=i;}printf("总分最高的学生是%s,%d分\n",stud[k].name,stud[k].sum);return 0;}108页改错题源程序:#include <stdio.h>#include <stdlib.h>int main (void){FILE fp; (必须指针定义,fp前面加*)int n,sum;if((fp=fopen("a.txt","r"))==NULLl){ (文件为读\写文件)printf("Cant't open File!");exit(0);}while(fscanf(fp,"%d",&n)==EOF) (改为不等于)sum=sum+n;fprintf(fp,"%d",sum);fclose(fp);return 0; }。