C语言题库2015

更新时间:2024-06-10 14:02:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Q257.(10分)输入一行字符,用函数编程统计其中有多少单词。假设单词之间以空格分开。 **输入格式要求:提示信息:\**输出格式要求:\参考答案

#include

int CountWords(char str[]); int main() {

char str[20];

printf(\ gets(str);

printf(\ return 0; }

int CountWords(char str[]) {

int i, num;

num = (str[0] != ' ') ? 1 : 0; for (i = 1; str[i] != '\\0'; i++) {

if (str[i] != ' ' && str[i - 1] == ' ') {

num++; } }

return num; }

Q1683.(10分)用二维数组作为函数参数,实现矩阵转置。按如下函数原型编程计算并输出m×n阶矩阵的转置矩阵。其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。

void Transpose(int a[][N], int at[][M], int m, int n); void InputMatrix(int a[][N], int m, int n); void PrintMatrix(int at[][M], int n, int m); 输入提示信息:\输入格式:\

输出提示信息和格式:\参考答案

#include #define M 10 #define N 10

void Transpose(int a[][N], int at[][M], int m, int n); void InputMatrix(int a[][N], int m, int n); void PrintMatrix(int at[][M], int n, int m);

int main() {

int s[M][N], st[N][M], m, n; printf(\ scanf(\ InputMatrix(s, m, n); Transpose(s, st, m, n);

printf(\ PrintMatrix(st, n, m); return 0; }

/* 函数功能:计算m*n矩阵a的转置矩阵at */ void Transpose(int a[][N], int at[][M], int m, int n) {

int i, j;

for (i = 0; i < m; i++) {

for (j = 0; j < n; j++) {

at[j][i] = a[i][j]; } } }

/* 函数功能:输入m*n矩阵a的值 */ void InputMatrix(int a[][N], int m, int n) {

int i, j;

printf(\ for (i = 0; i < m; i++) {

for (j = 0; j < n; j++) {

scanf(\ } } }

/* 函数功能:输出n*m矩阵at的值 */ void PrintMatrix(int at[][M], int n, int m) {

int i, j;

for (i = 0; i < n; i++) {

for (j = 0; j < m; j++) {

printf(\ }

printf(\ } }

Q552.(10分)如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则A和B称为亲密数。求10000以内的亲密数。

**输出格式要求:\ 程序运行示例如下: ( 220, 284) (1184,1210) (2620,2924) (5020,5564) (6232,6368)

参考答案

#include int main() {

int a, b, i, n;

for (a = 1; a < 10000; a++) {

b = 0;

for (i = 1; i <= a / 2; i++) {

if (a % i == 0) b += i; }

n = 0;

for (i = 1; i <= b / 2; i++) {

if (b % i == 0) n += i; }

if (n == a && a < b)

printf(\ }

return 0; }

Q381.(10分)*验证卡布列克运算。即:任意一个四位数,只要它们各个位上的数字是不全相

同的,就有这样的规律:

(1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数; (2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数字中含有0,则得到的数不足四位);

(3)求两个数的差,得到一个新的四位数(高位零保留)。

重复以上过程,最后得到的结果总是6174。这个数被称为卡布列克常数。请编写一个递归函数,完成以上的卡布列克运算。

**输入格式要求:\提示信息:\**输出格式要求:\程序运行示例如下: Enter number: 1234 [1]:4321-1234=3087 [2]:8730-378=8352 [3]:8532-2358=6174 参考答案

#include int count=0; main() {

int n;

printf(\ scanf(\ vr6174(n); }

vr6174(int num) {

int each[4],max,min; if(num!=6174&&num) {

parse_sort(num,each);

max_min(each,&max,&min); num=max-min;

printf(\ vr6174(num); } }

parse_sort(int num,int *each) {

int i,*j,*k,temp; for(i=0;i<=4;i++) {

j=each+3-i; *j=num;

num/=10; }

for(i=0;i<3;i++)

for(j=each,k=each+1;j*k)

{ temp=*j; *j=*k; *k=temp;} return; }

max_min(int *each,int *max,int *min) {

int *i; *min=0;

for(i=each;i

for(i=each+3;i>=each;i--) *max=*max*10+*i; return; }

Q457.(10分)从键盘输入一个长度为N(比如10)的整型数组,而后将数组中小于零的元素移动到数组的前端,大于零的元素移动到数组的后端,等于零的元素留在数组中间。比如原始数组为:2 -5 -89 75 0 -89 0 93 48 0,经过处理后的数组为:-5 -89 -89 0 0 0 75 93 48 2。由于不要求数组有序,所以不允许用排序方法。

**输入格式要求:\提示信息:\**输出格式要求:\程序运行示例如下:

Please input 10 interger number 2 -5 -89 75 0 -89 0 93 48 0

-5 -89 -89 0 0 0 75 93 48 2 参考答案

#include

#define N 10

int main() {

int a[N];

int i, p1 = 0, p2 = 9, p, temp;

printf(\ for (i = 0; i <= N - 1; i++) {

scanf(\ }

for (; p1 < p2 ; ) {

if (a[p1] == 0) {

p = p1;

while (a[p1 + 1] == 0) {

p1++; }

if (p1 + 1 < p2) {

temp = a[p1 + 1]; a[p1 + 1] = a[p]; a[p] = temp; p1 = p; continue; } else {

break; } }

if (a[p1] > 0) {

temp = a[p1]; a[p1] = a[p2]; a[p2] = temp; p2--; } else {

p1++; }

if (a[p2] == 0) {

p = p2;

while (a[p2 - 1] == 0) {

p2--; }

if (p1 < p2 - 1) {

temp = a[p2 - 1]; a[p2 - 1] = a[p];

a[p] = temp; p2 = p; continue; } else {

break; } }

if (a[p2] < 0) {

temp = a[p2]; a[p2] = a[p1]; a[p1] = temp; p1++; } else {

p2--; } }

for (i = 0; i <= N - 1; i++) {

printf(\ }

printf(\}

Q305.(10分)用100元人民币兑换10元,5元和1元的纸币(每一种都要有)共50张,请用穷举法编程计算共有几种兑换方案,每种方案各兑换多少张纸币. ****输入提示信息要求为:无 ****输出格式要求为: \ \参考答案

#include int main() {

int x, y, z, count = 0;

for (x = 0; x <= 5; x++) //1 {

for (y = 0; y <= 10; y++) //1 {

z = 50 - x - y;//1

if (10 * x + 5 * y + z == 100) //2 {

count++; //1

printf(\ } } }

printf(\ return 0; }

Q423.(10分)分数比较。比较两个分数的大小。

**输入格式要求:\提示信息:\

**输出格式要求:\程序运行示例如下: Input two FENSHU : 1 3,1 4 1/3>1/4 参考答案

#include main()

{int i,j,k,l,m,n;

printf(\scanf(\m=zxgb(j,l)/j*i; n=zxgb(j,l)/l*k; if(m>n)

printf(\else if(m==n)

printf(\ else printf(\}

zxgb(a,b) int a,b; { long int c; int d;

if(a

Q461.(10分)(附加题)编程将字符串s倒序输出,要求利用函数递归实现。 **输入格式要求:\提示信息:\

**输出格式要求:\

程序运行的输入输出样例: 屏幕先输出提示信息: input your string:

然后用户键盘输入: abcdefg

最后屏幕输出: Gfedcba

#include

void reverse(char s[]) {

int len;

len = strlen(s); if (len == 1) {

printf(\ } else {

reverse(s + 1); printf(\ } }

int main() {

char s[100];

printf(\ scanf(\ reverse(s); }

Q780.(5分)改错题:用户从键盘任意输入一个数字表示月份值n,程序显示该月份对应的英文表示,若n不在1~12之间,则输出“Illegal month”。 注意:

(1)请将修改正确后的完整源程序拷贝粘贴到答题区内。

(2)对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。 (3)当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。

#include main()

{

int n;

char monthName[][20] = {\\

printf(\ scanf(\

if ((n < 12) || (n > 1)) {

printf(\

} else {

printf(\ } }

参考答案

#include main() {

int n;

char monthName[][20] = {\\

printf(\ scanf(\

if ((n <= 12) && (n >= 1)) {

printf(\

} else {

printf(\ } }

Q263.(10分)从键盘任意输入一个整型表示的月份值,用指针数组编程输出该月份的英文表示,若输入的月份值不在1~12之间,则输出“Illegal month”。 **输入格式要求:\ 提示信息:\**输出格式要求:\

\\

请输入第0行: helloworld

请输入第1行: 12345gogogo 请输入第2行: end bye bye. helloworld 12345gogogo end bye bye.

大写字母数:0 小写字母数:25 数字个数:5 空格个数:2 其它字符:1 参考答案

#include

int main() {

int i, j, uppn, lown, dign, span, othn; char text[3][80];

uppn = lown = dign = span = othn = 0;

for (i = 0; i < 3; i++) {

printf(\请输入第%d行:\\n\ gets(text[i]);

for (j = 0; j < 80 && text[i][j] != '\\0'; j++) {

if (text[i][j] >= 'A' && text[i][j] <= 'Z') {

uppn += 1; }

else if (text[i][j] >= 'a' && text[i][j] <= 'z') {

lown += 1; }

else if (text[i][j] >= '0' && text[i][j] <= '9') {

dign += 1; }

else if (text[i][j] == ' ') {

span += 1; } else {

othn += 1; } } }

for (i = 0; i < 3; i++) {

printf(\ }

printf(\大写字母数:%d\\n\ printf(\小写字母数:%d\\n\ printf(\数字个数:%d\\n\ printf(\空格个数:%d\\n\ printf(\其它字符:%d\\n\

return 0; }

Q559.(10分)一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

**输出格式要求:\程序运行示例如下:

the total of road is 299.609375 the tenth is 0.097656 meter 参考答案

#include int main() {

float sn = 100.0, hn = sn / 2; int n;

for (n = 2; n <= 10; n++) {

sn = sn + 2 * hn; hn = hn / 2; }

printf(\ printf(\ return 0; }

Q498.(20分)对输入的字符串进行长度验证,保证输入的字符串的长度在指定的范围内,如果不在指定的范围内,则一直提示用户输入,直到输入合法长度的字符串为止。 程序的示例运行如下:

请输入一个字符串(长度为[3..5]个字符):a 请输入一个字符串(长度为[3..5]个字符):ab 请输入一个字符串(长度为[3..5]个字符):abcdef 请输入一个字符串(长度为[3..5]个字符):abc 你输入的字符串为:abc 参考答案

#include

void getString(char *str, int min, int max) {

int len;

printf(\请输入一个字符串(长度为[%d..%d]个字符):\\n\ scanf(\ len = strlen(str);

while (len < min || len > max) {

printf(\请输入一个字符串(长度为[%d..%d]个字符):\\n\ scanf(\ len = strlen(str); } }

int main(int argc, char *argv[]) {

char string[100];

getString(string, 3, 5);

printf(\你输入的字符串为:%s\\n\

return 0; }

Q376.(10分)采用递归方法计算x的n次方。 **输入格式要求:\提示信息:\**输出格式要求:\程序运行示例如下: x=? n=?2 8 2**8=256

参考答案

#include main() {

int x,n;

printf(\

scanf(\

printf(\}

power(int x,int n) {

if(n==0) return 1;

else return x*power(x,n-1); }

Q567.(10分)请编写函数fuc(),函数的功能是:根据以下公式求出p的值,结果由函数值返回。m , n 是两个正整数,且 m>n. P= m!/(n!*(n-m))!

**输入格式要求:\提示信息:\请输入m,n的值( m>n ):\\n\**输出格式要求:\项之和为:%lf\\n\程序运行示例如下: 请输入m,n的值( m>n ): 5 3

n项之和为:10.000000 参考答案

#include double fac(int m, int n) {

int i;

long p = 1, q = 1, r = 1; double d = 0.0;

for (i = 1; i <= m; i++) {

p = p * i; }

for (i = 1; i <= n; i++) {

q = q * i; }

for (i = 1; i <= m - n; i++) {

r = r * i; }

d = (double)p / (r * q); return d;

}

main() {

int n, m; double d; do {

printf(\请输入m,n的值( m>n ):\\n\ scanf(\ }

while (m < n); d = fac(m, n);

printf(\项之和为:%lf\\n\}

Q1159.(10分)

下面程序的功能是将数组元素倒置,找出其中的4处错误并改正之。 #include \#define M 5; main()

{ int a[M]={1,2,3,4,5}; int i,j,*t; i=0;j=M-1; while(i) {

t=*(a+i); *(a+i)=*(a+j); *(a+j)=t; i++;j++ }

for(i=0;i

参考答案

#include \#define M 5 main()

{ int a[M]={1,2,3,4,5}; int i,j,t; i=0;j=M-1; while(i<=j) {

t=*(a+i);

*(a+i)=*(a+j); *(a+j)=t; i++;j--; }

for(i=0;i

Q1601.(10分)按如下函数原型编写程序,输入10个整数,用函数编程将其中最大数与最小数位置互换,然后输出互换后的数组。 void MaxMinExchang(int a[], int n); int FindMaxPos(int s[], int n); int FindMinPos(int s[], int n);

输入提示信息:\输入格式:\

输出提示信息:\输出格式:\参考答案

#include

void MaxMinExchang(int a[], int n); int FindMaxPos(int s[], int n); int FindMinPos(int s[], int n); int main() {

int i, a[10];

printf(\ for (i = 0; i < 10; i++) {

scanf(\ }

MaxMinExchang(a, 10); printf(\ for (i = 0; i < 10; i++) {

printf(\ }

printf(\ return 0; }

/* 函数功能:将数组中的最大数与最小数位置互换 */ void MaxMinExchang(int a[], int n) {

int maxPos, minPos, temp; maxPos = FindMaxPos(a, n); minPos = FindMinPos(a, n);

temp = a[maxPos]; a[maxPos] = a[minPos]; a[minPos] = temp; }

/* 函数功能:计算数组中的最大值在数组中的下标位置 */ int FindMaxPos(int s[], int n) {

int maxPos = 0, max = s[0], i; for (i = 1; i < n; i++) {

if (s[i] > max) {

max = s[i]; maxPos = i; } }

return maxPos; }

/* 函数功能:计算数组中的最小值在数组中的下标位置 */ int FindMinPos(int s[], int n) {

int minPos = 0, min = s[0], i; for (i = 1; i < n; i++) {

if (s[i] < min) {

min = s[i]; minPos = i; } }

return minPos; }

Q1687.(10分)用字符指针作函数参数编程实现如下功能:在字符串中删除与某字符相同的字符。

**提示信息: \ \

**输入格式要求:\

**输出格式要求:\程序运行示例1如下: Input a string:hello,world! Input a character:o Results:hell,wrld!

参考答案

#include #include #define N 100

void Squeeze(char *s, char c); int main() {

char str[20], ch;

printf(\ gets(str);

printf(\ ch = getchar(); Squeeze(str, ch);

printf(\ return 0; }

void Squeeze(char *s, char c) {

char str[N]; char *t = str; strcpy(t, s);

for (; *t != '\\0'; t++) {

if (*t != c) {

*s = *t; s++; } }

*s = '\\0'; /* 在字符串t2的末尾添加字符串结束标志 */ }

Q1715.(10分)假设今年的工业产值为100万元,产值增长率为每年c%,请编程计算当c分别为6、8、10、12时工业产值分别过多少年可实现翻一番(即增加一倍)。 输入格式:无

输出格式:\参考答案

#include

#define CURRENT 100 #define N 4 main() {

int i;

int year; /* 产值翻番所需年数 */

int growRate[N] = {6, 8, 10, 12}; /* 工业产值的增长率 */ double output; /* 工业总产值 */ for (i = 0; i < N; i++) {

output = CURRENT; /* 当年产值为100万元 */ for (year = 0; output < 2 * CURRENT; year++) {

output = output * (1 + growRate[i] / 100.0); }

printf(\ %d years.\\n\ } }

Q297.(15分)两个正整数的最大公约数是能够整除这两个整数的最大整数。 请按如下函数原型编写计算最大公约数的函数Gcd()。 int Gcd(int a, int b);

在主函数中调用该函数计算,并输出从键盘任意输入的两整数的最大公约数。 **要求输入提示信息为: \**要求输入格式为: \**要求输出格式为

如果a或b不是正整数,输出: \否则输出: \

注:不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程,主函数不能使用int main和return 0。 参考答案

#include int Gcd(int a, int b); main() {

int a, b, c;

printf(\

scanf(\ c = Gcd(a, b); //1 if (c != -1) //1 {

printf(\ } else {

printf(\ } }

int Gcd(int a, int b) //1

{

int i, t;

if (a <= 0 || b <= 0) //1 {

return -1; //1 }

t = a < b ? a : b; //2 for (i = t; i > 0; i--)//2 {

if (a % i == 0 && b % i == 0)//1 return i; //1 }

return 1; //1 }

Q320.(10分)请用循环语句,打印输出如下图所示的下三角形乘法九九表。 1 2 4 3 6 9

4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 **输入提示信息格式: 无 **输入数据格式要求: 无 **输出数据格式要求: \参考答案

#include int main() {

int i, j;

for (i = 1; i < 10; i++) //2 {

for (j = 1; j <= i; j++) //2 {

printf(\ }

printf(\ //1 }

return 0; }

Q1281.(10分)

程序改错。下面程序的功能是从键盘输入一行字符,统计其中有多少单词。假设单词之间以空格分开。[提示:判断是否有新单词出现的方法是——当前被检验的字符不是空格,而前一被检验字符是空格,则表示有新单词出现。] #include #define ARR_SIZE 80; main() {

char str[ARR_SIZE]; int i, num;

gets(str);

if(str[0] != ' ' && str[0] != '\\0') {

num = 1; } else {

num = 0; }

for(i = 1 ; str[i] != '\\0'; i++) {

if(str[i] != ' ' && str[i-1] {

num++; } }

printf(\}

参考答案

#include #define ARR_SIZE 80 main() {

char str[ARR_SIZE]; int i, num;

gets(str);

if(str[0] != ' ' && str[0] != '\\0') {

num = 1; }

= ' ') else {

num = 0; }

for(i = 1 ; str[i] != '\\0'; i++) {

if(str[i] != ' ' && str[i-1] == ' ') {

num++; } }

printf(\}

Q595.(10分)编程输入一个整数m(int型),输出该整数的位数n。 **输入格式要求:\**输出格式要求:\程序运行示例1如下: 345 n=3

程序运行示例2如下: 0 n=1

参考答案

#include main() {

int m, n;

scanf(\ n = 0; do {

m = m / 10; n++; }

while (m != 0);

printf(\}

Q544.(10分)某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过40人参加考试。请编程计算:(1)每个学生的总分和平均分;(2)每门课程的总分和平均分。 **输入格式要求:\学号) 提示信息:\

\ EN PH:\\n\

**输出格式要求:\n\\\t MT \\t EN \\t PH \\t SUM \\t AVER\\n\\打印学号) \(打印每门课成绩)\(打印总分和平均分) \打印每门课的总分) \每门课的平均分) 程序的运行示例如下:

Input the total number of the students(n<=40):4 Input student’s ID and score as: MT EN PH: 070310122 97 87 92 070310123 92 91 90 070310124 90 81 82 070310125 73 65 80 Counting Result: Student’s ID MT EN PH SUM AVER 070310122 97 87 92 276 92.0 070310123 92 91 90 273 91.0 070310124 90 81 82 253 84.3 070310125 73 65 80 218 72.7 SumofCourse 352 324 344 AverofCourse 88.0 81.0 86.0 参考答案

#include

#define STUD_N 40 /* 最多学生人数 */ #define COURSE_N 3 /* 考试科目数 */ int ReadScore(int score[][COURSE_N], long num[]);

void AverforStud(int score[][COURSE_N], int sum[], float aver[], int n); void AverforCourse(int score[][COURSE_N], int sum[], float aver[], int n); void Print(int score[][COURSE_N], long num[], int sumS[], float averS[], int sumC[], float averC[], int n); int main() {

int score[STUD_N][COURSE_N], sumS[STUD_N], sumC[STUD_N], n; long num[STUD_N];

float averS[STUD_N], averC[STUD_N];

n = ReadScore(score, num); /* 读入学生成绩 */

AverforStud(score, sumS, averS, n); /* 计算每个学生的总分平均分 */ AverforCourse(score, sumC, averC, n); /* 计算每门课程的总分平均分 */ Print(score, num, sumS, averS, sumC, averC, n); /* 输出学生成绩 */ return 0; }

/* 函数功能:输入学生的学号及其三门课的成绩,当输入负值时,结束输入,返回学生人数 */

int ReadScore(int score[][COURSE_N], long num[]) {

int i, j, n;

printf(\

scanf(\ /* 输入参加考试的学生人数 */ printf(\ EN PH:\\n\

for (i = 0; i < n; i++) /* 对所有学生进行循环 */ {

scanf(\ /* 以长整型格式输入每个学生的学号 */ for (j = 0; j < COURSE_N; j++) /* 对所有课程进行循环 */ {

scanf(\ /* 输入每个学生的各门课成绩 */ } }

return i; /* 返回学生人数 */ }

/* 函数功能:计算每个学生的总分和平均分 */

void AverforStud(int score[][COURSE_N], int sum[], float aver[], int n) {

int i, j;

for (i = 0; i < n; i++) {

sum[i] = 0;

for (j = 0; j < COURSE_N; j++) /* 对所有课程进行循环 */ {

sum[i] = sum[i] + score[i][j]; /* 计算第i个学生的总分 */ }

aver[i] = (float)sum[i] / COURSE_N;/* 计算第i个学生的平均分 */ } }

/* 函数功能:计算每门课程的总分和平均分 */

void AverforCourse(int score[][COURSE_N], int sum[], float aver[], int n) {

int i, j;

for (j = 0; j < COURSE_N; j++) {

sum[j] = 0;

for (i = 0; i < n; i++) /* 对所有学生进行循环 */ {

sum[j] = sum[j] + score[i][j]; /* 计算第j门课程的总分 */ }

aver[j] = (float)sum[j] / n; /* 计算第j门课程的平均分 */ } }

/*函数功能:打印每个学生的学号、各门课成绩、总分和平均分,以及每门课的总分和平均分*/

void Print(int score[][COURSE_N], long num[], int sumS[], float averS[],

int sumC[], float averC[], int n) {

int i, j;

printf(\

printf(\\\t MT \\t EN \\t PH \\t SUM \\t AVER\\n\ for (i = 0; i < n; i++) {

printf(\ /* 以长整型格式打印学生的学号 */ for (j = 0; j < COURSE_N; j++) {

printf(\打印学生的每门课成绩 */ }

printf(\打印学生的总分平均分*/ }

printf(\

for (j = 0; j < COURSE_N; j++) /* 打印每门课的总分 */ {

printf(\ }

printf(\

for (j = 0; j < COURSE_N; j++) /* 打印每门课的平均分 */ {

printf(\ }

printf(\}

Q270.(10分)编程用链表方法实现堆栈数据结构。堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据“压住”,只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为“后进先出”。堆栈的长度可随意增加。堆栈结构可用链表实现。设计一个链表结构需包含两个成员:一个存放数据,一个为指向下一个节点的指针。当每次有一个新数据要放入堆栈时,称为“压入堆栈”,这时动态建立一个链表的节点,并连接到链表的结尾;当每次从堆栈中取出一个数据时,称为“弹出堆栈”,这意味着从链表的最后一个节点中取出该节点的数据成员,同时删除该节点,释放该节点所占的内存。 参考答案

#include #include typedef struct stack {

int data;

struct stack *next; } STACK;

STACK *head, *pr;

int nodeNum = 0; /* 堆栈节点数寄存器 */

STACK *CreateNode(int num); STACK *PushStack(int num); int PopStack(void); int main() {

int pushNum[5] = {111, 222, 333, 444, 555}, popNum[5], i; for (i = 0; i < 5; i++) {

PushStack(pushNum[i]);

printf(\ }

for (i = 0; i < 5; i++) {

popNum[i] = PopStack();

printf(\ }

return 0; }

/* 函数功能:生成一个新的节点,并为该节点赋初值,返回指向新的节点的指针 */ STACK *CreateNode(int num) {

STACK *p;

p = (STACK *)malloc(sizeof(STACK)); if (p == NULL) {

printf(\ exit(0); }

p->next = NULL; /* 为新建的节点指针域赋空指针 */ p->data = num; /* 为新建的节点数据区赋值 */ return p; }

/* 函数功能:将整型变量num的值压入堆栈,返回指向链表新节点的指针 */ STACK *PushStack(int num) {

if (nodeNum == 0) /* 若为首节点,则保留该节点地址在head中*/ {

head = CreateNode(num); pr = head;

nodeNum++; /* 堆栈节点数寄存器+1 */ }

else /* 若不是首节点,则将新建节点连到链表的结尾处 */ {

pr->next = CreateNode(num);

pr = pr->next;

nodeNum++; /* 堆栈节点数寄存器+1 */ }

return pr; }

/* 函数功能:将当前栈顶的数据弹出堆栈,返回从堆栈中弹出的数据 */ int PopStack(void) {

STACK *p = head; int result; for (;;) {

if (p->next == NULL) /* 查找最后一个节点 */ {

break; } else {

pr = p; /* 记录最后一个节点的前一个节点的地址 */ p = p->next;

nodeNum--; /* 堆栈节点数寄存器-1 */ } }

pr->next = NULL; /* 将末节点的前一个节点置成末节点 */ result = p->data; free(p);

return result; }

Q1330.(50分)13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。 程序的运行示例如下:

出圈成员及顺序: 3 6 9 12 2 7 11 4 10 5 1 8 最后的成员是: 13 参考答案

#include

#define N 13

struct person {

int number; int nextp; } link[N + 1];

int main(void) {

int i, count, h;

/* 建立队列 */ for (i = 1; i <= N; i++) {

if (i == N) {

link[i].nextp = 1; } else {

link[i].nextp = i + 1; }

link[i].number = i; }

printf(\ count = 0; h = N;

printf(\出圈成员及顺序:\ while (count < N - 1) {

i = 0;

while (i != 3) {

h = link[h].nextp; if (link[h].number) {

i++; } }

printf(\ link[h].number = 0; count++; }

printf(\最后的成员是:\ for (i = 1; i <= N; i++) {

if (link[i].number) {

printf(\

} }

return 0; }

Q1332.(10分)创建并输出一个一维数组(含20个元素),数组元素的值分别是下标的3倍多2。

**输出格式要求:\程序的运行示例如下:

2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 参考答案

#include

main() {

int a[20], k;

for (k = 0; k < 20; k++) {

a[k] = 3 * k + 2; printf(\ } }

Q539.(10分)从键盘输入某班学生某门课的成绩(已知每班人数最多不超过40人,具体人数由键盘输入,成绩为整数),试编程计算其平均分。

**输入格式要求:\提示信息:\ **输出格式要求:\程序的运行示例如下: Input n:3

Input score:80 100 60 Average score is 80 参考答案

#include

intmain() {

inti, result;

for(i = 1; i <= 20; i++) {

result = i * i; if(result > 100) break; else

printf(\ } }

Q1158.(10分)

下面程序的功能是读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。找出其中的错误,并改正之。 #include \main()

{ int i,a,n=1; while(n<=7) { do {

scanf(\ }while(a<1 && a>50); for(i=1;i<=a;i++) printf(\ printf(\ n++; } }

参考答案

#include #define N 40

int Average(int score[], int n); /* Average()函数原型 */ void ReadScore(int score[], int n); /* ReadScore()函数原型 */ int main() {

int score[N], aver, n; printf(\ scanf(\

ReadScore(score, n); /* 数组名作为函数实参调用函数ReadScore() */ aver = Average(score, n); /* 数组名作为函数实参调用函数Average() */ printf(\ return 0; }

/* 函数功能:计算n个学生成绩的平均分 */

int Average(int score[], int n) /* Average()函数定义 */ {

int i, sum = 0;

for (i = 0; i < n; i++) {

sum += score[i];

本文来源:https://www.bwwdw.com/article/pub6.html

Top