大一c语言复习题

178.输入一行字符,以“#”号作为结束标志,分别统计出其中的英文字母.空格.数字和其它字符的个数。要求在程序中用变量letter统计英文字母的个数.space统计空格的个数.count统计数字的个数.other统计其它字符的个数。

正确答案:

#include <stdio.h>
main() {
         char str[30], c;
         int letter = 0, space = 0, count = 0, other = 0;
         while ((c = getchar()) != '#') {
                  if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) letter++;
                  else if (c == ' ') space++;
                  else if (c >= '0' && c <= '9') count++;
                  else other++;
         }
         printf("%d,%d,%d,%d", letter, space, count, other);
}

179.现有班级学生60人,现统计C语言课程的成绩情况,包括平时上机,期末上机考试和笔试成绩。总评成绩=平时上机*20%+上机考试*20%+笔试成绩*60。假设三个成绩的数据已由任课老师录入并存放在e盘根目录下的student.txt文件中。要求:

(1)定义学生结构体,其中包括学生的学号.姓名,以及平时上机.期末上机考试.笔试成绩.总评成绩这4项成绩。用结构体数组存放所有学生的记录,并计算出每个学生的总评成绩。

(2)求60分以下人数D,70-79分人数C,80-89分人数B,90分以上人数A。

(3)在屏幕上输出所有成绩,每行每个成绩设置域宽为8,输完一个学生换行。最后输出A,B,C,D的值。

正确答案:

#include <stdio.h>
struct student {
         char ID[30];
         char name[10];
         int homework; //平时上机成绩
         int pexam; //上机考试成绩
         int fexam; //笔试成绩
         int sumexam; //总评成绩
};
int main() {
         FILE *fp;
         struct student s[100];
         int n = 0;
         int A = 0, B = 0, C = 0, D = 0;
         fp = fopen("e:\\student.txt", "r");
         char str[100];
         for (n = 0; n < 60; n++) {
                  fscanf(fp, "%d%d%d", &s[n].homework, &s[n].pexam, &s[n].fexam);
                  s[n].sumexam = (int)(s[n].homework * 0.2 + s[n].pexam * 0.2 + s[n].fexam * 0.6);
         }
         switch (s[n].sumexam / 10) {
                  case  10:
                          A++;
                          break;
                  case  9:
                          A++;
                          break;
                  case  8:
                          B++;
                          break;
                  case  7:
                          C++;
                          break;
                  default:
                          D++;
         }
         n++;
         fclose(fp);
         for (int i = 0; i < n; i++)
                  printf("%s,%s,%d,%d,%d,%d\n", s[i].ID, s[i].name, s[i].homework, s[i].pexam, s[i].fexam, s[i].sumexam);
         printf("A:%d", A);
         printf("B:%d", B);
         printf("C:%d", C);
         printf("D:%d", D);
         return 0;
}

180.货物征税问题。对一批货物征税,价格在1万元以上部分的征5%,5000元以上(包括5000元).1万元以下部分的征3%,1000元以上(包括1000元).5000以下部分的征2%,1000元以下部分的免税,读入货物价格,计算并输出税金。征税应分段累计,各段采用不同税率进行征收。(8分)

(提示:如对2万元货物,应分1万以上.5千-1万及1千-5千部分进行三段征收)。

正确答案:

#include <stdio.h>
int main() {
         float price, p, tax = 0;
         scanf("%f", &price);
         p = price;
         if (price > 10000) {
                  tax = (price - 10000) * 0.05;
                  price = 10000;
         }
         if (price > 5000) {
                  tax = tax + (price - 5000) * 0.03;
                  price = 5000;
         }
         if (price > 1000) {
                  tax = tax + (price - 1000) * 0.02;
                  price = 1000;
         }
         if (price <= 1000)
                  tax = tax + 0;
         printf("价格为%f的货物应交税%f", p, tax);
}

181.要求定义一个子函数实现求阶乘的计算,在主函数中由用户输入m和n,然后调用子函数计算下列公式并输出计算结果。

正确答案:

#include <stdio.h>
int fac(int n) {
         int f;
         if (n < 0) printf("n<0,data error!");
         else if (n == 0 || n == 1)  f = 1; //终止条件
         else f = fac(n - 1) * n; //递归步骤
         return (f);
}
main() {
         int m, n;
         scanf("%d,%d", &m, &n);
         int s = fac(m) / (fac(n) * fac(m - n));
         printf("result=%d\n", s);
}

182.任意读入10个字符串,降序排列,然后输出屏幕,同时写入myFile.txt文件中。

正确答案:

#include <stdio.h>
#include <string.h>
#define N 10
int main() {
         char s[N][20];  //假设每个串的串长都小于20
         char h[40] = "";
         char *p[N];   //借助指针数组,可以只交换指向串的指针,不交换串本身
         int i, j, k;
         for (i = 0; i < N; i++)  p[i] = s[i]; //让指针数组p的每一个元素依次存放s每行的首地址
         for (i = 0; i < N; i++)  gets(s[i]); //读入10个串,存放到s的每一行中
         //选择法排序
         for (i = 0; i <= N - 2; i++) {
                  k = i;
                  for (j = i + 1; j <= N - 1; j++)
                          if (strcmp(p[j], p[k]) > 0)k = j;
                  if (k != i) {
                          char *t;
                          t = p[i];
                          p[i] = p[k];
                          p[k] = t;
                  }
         }
         puts("降序排列后:");
         for (i = 0; i < N; i++) puts(p[i]);
         FILE *fp;
         fp = fopen("myFile.txt", "w");
         for (i = 0; i < N; i++) fprintf(fp, "%s\n", p[i]);
         fclose(fp);
         return 0;
}

183.编写程序,输入一个大于3的整数n,判定它是否为素数(素数:只能被1和它自己整除的数)。

正确答案:

#include <stdio.h>
#include <math.h>
int main() {
         int n, i, k;
         printf("please enter a integer number,n=?");
         scanf("%d", &n);
         k = sqrt(n);
         for (i = 2; i <= k; i++)
                  if (n % i == 0) break;
         if (i <= k) printf("%d is not a prime number.\n", n);
         else printf("%d is a prime number.\n", n);
         return 0;
}

184.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。编程求第一天共摘多少桃子。(要求用循环实现)

#include <stdio.h>
main() {
         int day, peach;
         peach = 1;
         for (day = 9; day >= 1; day--) peach = (peach + 1) * 2;
         printf("The first day:%d\n", peach);
}

185.编写嵌套的循环程序,输出1-100这个范围内的素数。

正确答案:

#include <stdio.h>
#include <math.h>
int main() {
         int i, j, k = 0, count = 0;
         int isPrime;
         printf("1100之间的素数从小到大分别为:\n");
         for (i = 2; i <= 100; i++) {
                  isPrime = 1;
                  for (j = 2; j <= sqrt(i); j++) {
                          if (i % j == 0) {
                                   isPrime = 0;
                                   break;
                          }
                  }
                  if (isPrime == 1) {
                          printf("%d\t", i);
                          count++;
                  }
         }
         printf("一共%d个素数\n", count);
         return 0;
}

186.编写嵌套的循环程序,输出1-100这个范围内的素数。

正确答案:

#include <stdio.h>
#include <math.h>
int main() {
         int i, j, k = 0, count = 0;
         int isPrime;
         printf("1100之间的素数从小到大分别为:\n");
         for (i = 2; i <= 100; i++) {
                  isPrime = 1;
                  for (j = 2; j <= sqrt(i); j++) {
                          if (i % j == 0) {
                                   isPrime = 0;
                                   break;
                          }
                  }
                  if (isPrime == 1) {
                          printf("%d\t", i);
                          count++;
                  }
         }
         printf("一共%d个素数\n", count);
         return 0;
}

187.请编写2个程序,分别用while.do…while 循环计算:10!

提示:10!=1×2×3×…×10

正确答案:

#include <stdio.h>
main() {
         int i = 1, product = 1;
         while (i <= 10) {
                  product = product*i;
                  i = i + 1;
         }
         printf("10!=%d\n", product);
}
 
#include <stdio.h>
main() {
         int i = 1, product = 1;
         do {
                  product = product * i;
                  i = i + 1;
         } while (i <= 10);
         printf("10!=%d\n", product);
}

188.键盘输入3位学生3 门课程的成绩,输出每位学生的总成绩。(要求用二位数组实现,运行成功的请将程序和运行截图上传)

正确答案:

#include <stdio.h>
int main( ) {
         int score[3][3], i, j ;    //行代表每一位学生,列表示某一门课程
         float avg[3] = {0} ;
         printf( "Please input:\n" ) ;
         for ( i = 0 ; i <= 2 ; i++ ) {
                  for ( j = 0 ; j <= 2 ; j++ )   {
                          scanf( "%d", &score[i][j] ) ;
                          avg[i] += score[i][j] ;
                  }
                  printf( "%d位同学的总成绩为:%.1f", i + 1,  avg[i]);
         }
         return 0;
}

189.编写一个程序,输出所有的水仙花数。若一个三位数等于其各位上数字的立方和,则称这个三位数为水仙花数。例如,153是一个水仙花数,因为

正确答案:

#include<stdio.h>
int main( ) {
         int n, i, j, k ;
         printf( "Output\n" ) ;
         for (n = 100 ; n < 1000 ; n++ ) {
                  i = n % 10 ; /* 个位 */
                  j = ( n / 10 ) % 10 ; /* 十位 */
                  k = n / 100 ; /* 百位 */
                  if ( n == i * i * i + j * j * j + k * k * k )
                          printf( "%d\n", n ) ;
         }
         return 0 ;
}

190.编写程序,从键盘输入任意位数整数,求出其逆序整数,并输出。

正确答案:

#include <stdio.h>
main( ) {
         int num, nixu_num = 0;
         printf("请输入一个整数:");
         scanf("%d", &num);
         while (num != 0) {
                  nixu_num = nixu_num * 10 + num % 10;
                  num = num / 10;
         }
         printf("逆序整数为:%d\n", nixu_num);
}

191.将一个二维数组a[3][4]行列元素互换,存放到另一个数组b中,要求按行输出b中的元素。

正确答案:

#include <stdio.h>
int main( ) {
         int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} } ;
         int b[4][3], i, j ;
         printf( "array a:\n" ) ;
         for ( i = 0 ; i <= 2 ; i++ ) {
                  for ( j = 0 ; j <= 3 ; j++ ) {
                          printf( "%4d", a[i][j] ) ;
                          b[j][i] = a[i][j] ;
                  }
                  printf( "\n" ) ;
         }
         printf( "array b:\n" ) ;
         for ( i = 0 ; i <= 3 ; i++ ) {
                  for ( j = 0 ; j <= 2 ; j++ )
                          printf( "%4d", b[i][j] ) ;
                  printf( "\n" ) ;
         }
         return 0 ;
}

192.数组的大小为8,输入,各个数组元素,然后求出数组中的最大值和最小值,以及他们所在的位置(位置编号从1开始),依次输出到屏幕上。

要求:1.请将程序及截图上传。

2.验证的时候,输入的数组元素为:12 56 85 4 23 45 90 110

正确答案:

#include <stdio.h>
void print_a(int *p) {
         int max = *p, min = *p, max_index = 0, min_index = 0;
         for (int i = 0; i < 8; i++) {
                  if (max < p[i]) {
                          max = p[i];
                          max_index = i + 1;
                  }
         }
         for (int i = 0; i < 8; i++) {
                  if (min > p[i]) {
                          min = p[i];
                          min_index = i + 1;
                  }
         }
         printf("最大值:%d,位置%d", max, max_index);
         printf("\n最小值:%d,位置%d", min, min_index);
}
int main() {
         int a[8];
         int *p = a;
         for (int i = 0; i < 8; i++) {
                  scanf("%d", p + i);
         }
         print_a(p);
}

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值