c语言编程练习题

在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各21响。已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,请编程计算观众总共可以听到几次礼炮声。

#include <stdio.h>
int main()
{
    int  n = 0, t;
    for (t=0; t<=20*7; t++)
    {
        if (t%5 == 0 && t <= 20*5)  /* 控制A舰每隔5秒放1次 */
        {
            n++;
            continue;                  /* 继续下一次循环 */
        }
        if ( t%6 == 0 && t <= 20*6)   /* 控制B舰每隔6秒放1次 */
        {
            n++;
            continue;                  /* 继续下一次循环 */
        }
        if (t%7 == 0)                  /* 控制C舰每隔7秒放1次 */
        {
            n++;
        }
    }
    printf("n = %d\n", n);
}

已知今年的工业产值为100万元,产值增长率为从键盘输入,请编程计算工业产值过多少年可实现翻一番(即增加一倍)。

提示:用符号常量CURRENT表示今年的工业产值为100万元,用变量growRate表示产值增长率,用变量year表示产值翻番所需的年数,则计算年产值增长额的计算公式为:

output  = output * (1 + growRate)

利用迭代法循环计算,直到output >= 2*CURRENT时为止。当output >= 2*CURRENT时,表示已实现产值翻番。此时,循环被执行的次数year即为产值翻番所需的年数。

#include <stdio.h>
#define  CURRENT  100  
int main()
{
    int      year;                        /* 产值翻番所需年数 */ 
    double  growRate;                    /* 工业产值的增长率 */
    double  output;                   /* 工业总产值 */ 
    printf("Input grow rate:");
    scanf("%lf", &growRate);
    output = CURRENT;             /* 当年产值为100万元 */
    for (year=0; output<2*CURRENT; year++)
    {
        output = output * (1 + growRate);
    }
    printf("When grow rate is %.0f%%, the output can be doubled after %d years.\n", growRate*100, year);     
    return 0;
}

一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。

提示:假设这个4位数的前两位数字都是i,后两位数字都是j,则这个可能的4位数

k = 1000*i + 100*i + 10*j + j

式中,i和j都在0~9变化。此外,还应使k=m*m,m是整数。由于k是一个4位数,所以m值不可能小于31。

#include <stdio.h>
int main()
{
    int  i, j, k, m;
    for (i=0; i<=9; i++)
    {
        for (j=0; j<=9; j++)
        {
            if (i != j)
            { 
                k = i * 1000 + i * 100 + j * 10 + j;
                for (m=31; m*m<=k; m++)
                {
                    if (m*m == k)  
                    printf("k=%d, m=%d\n", k, m);
                }
            }
         }
    }
}

36块砖,36人搬,男搬4,女搬3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?请用穷举法编程求解。

#include<stdio.h>
int main()
{
    int x, y, z;
    for (x = 0; x <= 9; x++)
        {
            for (y = 0; y <= 12; y++)
            {
                z = 36 - x - y;
                 
                if ( 4 * x + 3 * y + z / 2 == 36 && z % 2 == 0)
                {
                    printf("men=%d,women=%d,children=%d\n", x, y, z);
                }
            }
        }
    return 0;
}

从键盘任意输入三角形的三边长为a,b,c,编程判断a,b,c的值能否构成一个三角形,若能构成三角形,则计算并输出三角形的面积,否则提示不能构成三角形。已知构成三角形的条件是:任意两边之和大于第三边。

#include <stdio.h>
#include  <math.h>
int main()
{ 
      float  a, b, c, s, area;                
      printf("Input a,b,c:");
      scanf("%f,%f,%f", &a, &b, &c);
       
      if (a+b>c && b+c>a && a+c>b)
        {
            s = (float)(a + b + c) / 2;
             
            area = sqrt(s * (s - a) * (s - b) * (s - c));
             
            printf("area = %f\n", area);
        }
     else
        {
            printf("It is not a triangle\n");
        }
    return 0;
}

从键盘任意输入一个3位整数,编程计算并输出它的逆序数忽略整数前的正负号)。例如,输入-123,则忽略负号,由123分离出其百位1、十位2、个位3,然后计算3*100+2*10+1 = 321,并输出321。按要求在空白处填写适当的表达式或语句,使程序完整并符合题目要求。

#include  <math.h>
#include  <stdio.h>
int main()
{ 
    int  x, b0, b1, b2, y; 
    printf("Input x:");           
    scanf("%d", &x);
    x = (int)fabs(x);
                        
    b2 = x / 100;                   /* 计算百位数字 */
     
    b1 = (x - b2 * 100) / 10;     /* 计算十位数字 */
     
    b0 = x % 10;                   /* 计算个位数字 */
     
    y = b2 + b1*10 + b0*100;
    printf("y = %d\n",y);
    return 0;
}

根据最大公约数的如下3条性质,采用递归法编写计算最大公约数的函数Gcd(),在主函数中调用该函数计算并输出从键盘任意输入的两正整数的最大公约数。

性质1  如果a>b,则a和b与a-b和b的最大公约数相同,即Gcd(a, b) = Gcd(a-b, b)

性质2  如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd(a, b) = Gcd(a, b-a)

性质3  如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd(a, b) = a = b

#include <stdio.h> 
int Gcd(int a, int b);
int main() 
{     
     int a, b, c;     
     printf("Input a,b:");     
     scanf("%d,%d", &a, &b);
     c = Gcd(a, b);
     if ( c!= -1)
          printf("Greatest Common Divisor of %d and %d is %d\n", a, b, c);
     else        
          printf("Input number should be positive!\n");
     return 0; 
}
 
int Gcd(int a, int b) 
{     
     if (a <= 0 || b <= 0)     
          return -1;
     if (a == b)
          return a;
     else if (a > b)
          return Gcd(a - b, b);
     else        
          return Gcd(a, b - a);
 }

下面程序的功能是输入某年某月某日,计算并输出它是这一年的第几天。

程序的运行结果如下:

Please enter year, month, day:2014,12,29↙

yearDay = 363

#include    <stdio.h>
int  DayofYear(int year, int month, int day);
int dayTab[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int main()
{
    int year, month, day, yearDay;
    printf("Please enter year, month, day:");
    scanf("%d,%d,%d", &year, &month, &day);
    yearDay = DayofYear(year, month, day);
    printf("yearDay = %d\n", yearDay);
    return 0;
}
 
/* 函数功能:对给定的某年某月某日,计算并返回它是这一年的第几天 */
int  DayofYear(int year, int month, int day)
{
    int  i, leap;
    leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);  /* 若year为闰年,即leap值为1,则用第1行元素dayTab[1][i]计算;
                                       否则leap值为0,用第0行dayTab[0][i]计算 */
    for (i=1;  i<month; i++)
    {
        day = day + dayTab[leap][i];
    }
    return day;         /* 返回计算出的day的值 */
}

500以内10个最大素数及其和并分别输出。

#include <stdio.h>
#include <math.h> 
int sum_prime(int a[]);
int prime(int n);
int main()
{
    int i, a[10], sum;
    sum = sum_prime(a);
    for (i = 0; i < 10; i++)
         printf("%6d", a[i]);
    printf("\nsum=%d\n", sum);
    return 0;
}
  
int sum_prime(int a[])
{
    int i, j = 499, sum = 0;
    for (i = 0; i < 10; )
    {
        if (prime(j))
        {
            sum = sum + j ;
             a[i] = j;
             
            i++;
        }
        j--;
    }
    return sum;
}
 
int prime(int n)
{
    int i, k;
    k = (int) sqrt((double)n);
     
    for (i = 2; i <= k; i++)
    {
        if (n % i == 0)
         
             return 0;
    }
     
    if ( i >= k + 1)
     
           return 1;
  
}

编程计算下面组合数的值

#include <stdio.h>
unsigned long Factorial(unsigned int number);
int main()
{
     int m, k;
     double p;
      
     do{
          printf("Please input m,k (m>=k>0):");
          scanf("%d, %d", &m, &k);
       } while (m<k || m<0 || k<0);
     p = (double)Factorial(m) / (Factorial(k) * Factorial (m-k));
     printf("p=%.0f\n", p);
     return 0;
}
//函数功能:计算无符号整型数number的阶乘
unsigned long Factorial(unsigned int number)
{
     unsigned long i, result = 1;
      
     for (i=2; i<=number; i++)
     {
          result *= i;
     }
     return result;
}

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。 

识别码的计算方法如下: 

   首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,...,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。 

   你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。

#include <stdio.h> 
int main() 
{      
    char isbn[13];   
    int i, k = 0, last, p;     
    gets(isbn);     
    for (i = 0, p = 0; i < 11; i ++)     
    {         
         if (isbn[i] == '-') continue;        
         p ++;         
         k += (isbn[i] - 48) * p;     
    }     
   last = k % 11;  
       
   if (last == 10) 
         last = 'X';     
   else 
        last += 48;     
   
  if (last == isbn[12]) 
       printf("Right");     
  else    
  {         
      isbn[12] = last;        
      printf("%s", isbn);     
  }     
  return 0; 
}

下面程序的功能是统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。

#include  <stdio.h>
#include  <string.h>
#define NUM_ELECTORATE 10
#define NUM_CANDIDATE 3
struct candidate
{
    char  name[20];
    int   count;
}candidate[3] = {"li",0, "zhang",0, "wang",0};
 
int main()
{
    int  i, j, flag = 1, wrong = 0;
    char  name[20];
    for (i=1; i<=NUM_ELECTORATE; i++)
    {
       printf("Input vote %d:", i);
       scanf("%s", name);
       strlwr(name); /* C语言的标准库函数,功能是将name中的字符全部变成小写字母 */
       flag = 1;
        
       for (j=0; j<NUM_CANDIDATE; j++)
       {         
            if (strcmp(name, candidate[j].name) == 0) 
            {
                candidate[j].count++;
                flag = 0;
            }
        }
         
       if (flag)
        {
            wrong++;  /* 废票计数 */
            flag = 0;
        }
        }
       printf("Election results:\n");
        
       for (i=0; i<NUM_CANDIDATE; i++)
       {
            printf("%s:%d\n", candidate[i].name, candidate[i].count);
       }
        
       printf("Wrong election:%d\n", wrong);
       return 0;
}

 编程计算并输出m×n阶矩阵的转置矩阵。其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。

#include <stdio.h>
#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("Input m, n:");
    scanf("%d,%d", &m, &n);
    InputMatrix(s, m, n);
    Transpose(s, st, m, n);
    printf("The transposed matrix is:\n");
    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("Input %d*%d matrix:\n", m, n);
    for (i=0; i<m; i++)
    {
        for (j=0; j<n; j++)
        {
            scanf("%d", &a[i][j]); 
        }
    }
}
/* 函数功能:输出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("%d\t", at[i][j]);
        }
        printf("\n"); 
    }
}

有一堆零件(100--200之间),如果分成4个零件一组的若干组,则多2个零件,如果分成7个零件一组的若干组,则多3个零件,如果分成9个零件一组的若干组,则多5个零件,编程计算这堆零件的总数。

#include <stdio.h>
int main()
{
    int i;
    for (i = 100; i <= 200; i++)
        {
            if ( (i - 2) % 4 == 0)
            {
                if ((i - 3) % 7 == 0)
                {
                    if ((i - 5) % 9 == 0)
                            printf("%d\n", i);
                }
            }
        }
    return 0;
}

 

  • 35
    点赞
  • 233
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: 指针是C语言非常重要的概念,它可以用来存储和操作内存地址。通过指针,可以直接访问或者修改内存的数据。 在C语言,有很多关于指针的编程练习题。下面我举两个简单的例子来说明: 1. 编写一个程序,使用指针将两个变量的值进行交换。 ``` #include <stdio.h> void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 10; int y = 20; printf("交换前:x=%d, y=%d\n", x, y); swap(&x, &y); printf("交换后:x=%d, y=%d\n", x, y); return 0; } ``` 这个例子,我们定义了一个交换函数`swap`,它接收两个指针参数,然后交换这两个指针所指向的值。在`main`函数,我们定义了两个变量`x`和`y`,然后调用`swap`函数交换它们的值。 2. 编写一个程序,使用指针找到数组的最大值和最小值。 ``` #include <stdio.h> void findMinMax(int *array, int size, int *min, int *max) { *min = *max = array[0]; for (int i = 1; i < size; i++) { if (array[i] < *min) { *min = array[i]; } if (array[i] > *max) { *max = array[i]; } } } int main() { int array[] = {6, 2, 8, 1, 9, 4}; int min, max; findMinMax(array, sizeof(array) / sizeof(int), &min, &max); printf("最小值:%d\n", min); printf("最大值:%d\n", max); return 0; } ``` 这个例子,我们定义了一个`findMinMax`函数,它接收一个整型数组、数组大小以及两个指针作为参数。函数,我们使用两个指针来记录当前的最小值和最大值,并遍历数组,逐个比较更新最小值和最大值。在`main`函数,我们声明了一个数组,并调用`findMinMax`函数来找到这个数组的最小值和最大值。 通过这些练习题,可以加深对指针的理解,并提高C语言编程的能力。当然,这只是两个简单的例子,实际上还有很多其他有趣和复杂的指针相关的编程题目等待我们去探索。 ### 回答2: 指针在C语言编程扮演着重要的角色,它允许我们直接访问内存地址,以便于对内存的数据进行操作和管理。下面我将通过一个具体的编程练习题来展示指针的应用。 我们假设有一个整型数组arr,数组存储了10个整数。现在我们要编写一个函数,该函数接受一个指针参数,用于将数组的每个元素都加1。 首先,我们定义一个函数addOne,该函数接受一个整型指针作为参数,并且没有返回值。函数体内,我们使用for循环来遍历数组的每个元素,对每个元素执行加1操作。示例代码如下: ```c void addOne(int* ptr) { int i; for(i=0; i<10; i++) { *(ptr + i) += 1; } } ``` 在主函数,我们创建一个整型数组arr,并将其传递给addOne函数。这样,函数内部对数组进行的加1操作就会生效。示例代码如下: ```c int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; printf("加1前的数组:"); for(int i=0; i<10; i++) { printf("%d ", arr[i]); } addOne(arr); printf("\n加1后的数组:"); for(int i=0; i<10; i++) { printf("%d ", arr[i]); } return 0; } ``` 运行这段代码,输出的结果将是: 加1前的数组:1 2 3 4 5 6 7 8 9 10 加1后的数组:2 3 4 5 6 7 8 9 10 11 通过这个练习题,我们可以看到指针的作用。指针可以传递数组的首地址给函数,在函数内部使用指针对数组进行操作,使得函数可以修改数组的元素。这样的操作提高了程序的效率和灵活性,并在一些场景下十分有用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suxiaorui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值