C语言程序相关练习题

选择结构 输入一行字符,分别统计出其中中英文字母、空格、数字和其他字符的个数:
#include int main () {char c;int letter = 0,space = 0,num = 0,other = 0;while ((c = getchar()) != '\n'){if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'){letter++;/* code */}else if (c == ' '){space++;/* code */}else if (c >= '0' && c <= '9'){num++;/* code */}else {other++;}}printf("字母:%d,数字:%d,空格:%d,其他:%d",letter,num,space,other);return 0;}
任意输入 3 个整数,编程实现对这 3 个整数由小到大进行排序 。
#includeint main(){int a,b,c,t;printf("请输入三个数:");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;}if(b > c){t = b;b = c;c = t;}printf("从小到大的顺序是:%d%d%d\n",a,b,c);return 0;}
3.输入三个整数a,b,c,输出最大的数
#includeint main(){int a,b,c,max;printf("请输入三个数:");scanf("%d%d%d",&a,&b,&c);max = a;if (b > max){max = b;}if (c > max){max = c;}printf("%d",max);return 0;}
循环结构 输入两个正整数m、n,求最大公约数和最小公倍数
#include int main () {int i,m,n;int t;printf("输入m:");scanf("%d",&m);printf("输入n:");scanf("%d",&n);if (m < n)//把大数给m,小数给n{t = m;m = n;n = t;}for ( i = n; i > 0 ; i--)//不超过n,从n开始往下找{if (m % i == 0 && n % i == 0){printf("最大公约数为:%d\n",i);//公约数:可以同时整除m n的最大值printf("最小公倍数为:%d",(m * n) / i);//公倍数:(两数乘积)/公约数break;}}return 0;}
求S = a+aa+aaa+…+aaaaa的值,其中a是一个数字,n是a的位数,例如:n=3——a+aa+aaa,n由键盘输入:
#include int main () {int a = 2,n,i;printf("输入n:");scanf("%d",&n);int sum = 0,num = a;//sum累计num的和,num记录每一次a增加一个单位的值for ( i = 0; i < n; i++){sum += num;//总和num = num*10+a;//num每次自乘10再加上个位数a}printf("%d",sum);return 0;}
20以内的阶乘(1!+2!+3!+····+20!)的和,阶乘(5! = ),其他题目:求n的阶乘,n由键盘输入(解法类似):
#include int main () {int i;long long sum = 1,end = 0;//int、long会溢出,存不了for ( i = 1; i <= 20; i++){sum *= i;//计算单个的阶乘end += sum; //计算总和/* code */}printf("%lld",end); //2561327494111820313return 0;}
求(1+2+3+···+100)+(1平方+2的平方+····+50的平方)+(1/1+1/2+1/3+···+1/10)的值:
#include int main () {int i;int sum1 = 0, sum2 = 0;float sum3 = 0;for ( i = 1; i <= 100; i++){sum1 += i;//1-100求和if (i <= 50){sum2 += i * i;//1-50求平方/* code */}if (i <= 10){sum3 += 1.0 / i;//1-10求 1/i 的和/* code */}/* code */}printf("%f",sum1 + sum2 + sum3); //47977.929688return 0;}
输出1000以内所有水仙花数:
153是一个水仙花数,因为153=1x1x1+5x5x5+3x3x3
#include int main () {int i, a, b, c;for ( i = 100; i < 1000; i++){a = i / 100;//求百位b = (i / 10) % 10;//十位c = i % 10;//个位if (a*a*a + b*b*b + c*c*c == i){printf("%d\t",i);//153370371407/* code */}/* code */}return 0;}
找出1000以内所有完数:
完数:一个数等于它的因子之和,例如:6的因子为:1,2,3,而1+2+3=6,所以6是完数
#include int main () {int i, j, sum;for ( i = 2; i <= 1000; i++){sum = 0;//每次判断完重制sumfor ( j = 1; j < i; j++)//从1开始找 i 的因子{if (i % j == 0)//如果能被整除,代表是因子,则叠加到sum中{sum += j;}}if (sum == i)//如果因子的和与这个数一致,它就是完数{printf("%d\t",i);//628496}}return 0;}
求此分数序列(2/1,3/2,5/3,8/5···)前20项的和:
#include int main () {int i;float a = 2, b = 1, sum = 0, t;for ( i = 0; i < 20; i++){sum += a / b;//是分子 a / 分母 b 的累加和,而下一项的分子 a 是此项 a+b 的和,分母是此项的 分子at = a;//将分子 a 提取出来a = a + b;//下一项分母为此项的 a+bb = t;//赋值给分母/* code */}printf("%f",sum);//32.660263return 0;}
一个球从100m高度落下,落地后反弹回原高度的一半,再落下再反弹,第10次落地时,共经过了多少米?第10次反弹多高?
#include int main () {int i;float sum = 0, a = 100;for ( i = 1; i <= 10; i++){sum += a;//总计1-10次落下的距离a = a / 2;//弹起距离 = 上次落下距离 / 2if (i <= 9){sum += a;//总计1-9次弹起的距离,在弹起的距离等于下一次落下的距离,持续循环累加到下一次sum里}}printf("共经过:%f米\n",sum);//共经过:299.609375米printf("第十次反弹%f米",a);//第十次反弹0.097656米return 0;}---------写法2---------------int main(){int i;float sum = 100, drop, jump;for ( i = 0; i < 10; i++){drop += sum; //10次落下的总和sum = sum/2; //每次落下后弹起距离减半jump += sum; //10次弹起的总和(包括第10次落下后弹起)}printf("%f %f",drop+jump-sum,sum); //10次落下的总和不包括第10次弹起,所以减去sum,sum为每次弹起/落下的距离return 0;}
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个 。第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个 。以后每天早上都吃了前一天剩下的一半零一个 。到第 10 天早上想再吃时,发现只剩下一个桃子了 。编写程序求猴子第一天摘了多少个桃子
#include int main () {int i, sum, rest;rest = 1;//第10天余剩的个数for ( i = 9; i > 0; i--)//执行9次{sum = (rest + 1) * 2;//推算前一天桃子的总数是(今日余剩个数 + 1) * 2 个rest = sum;//前一天的余剩个数/* code */}printf("%d",sum);//1534return 0;}

C语言程序相关练习题

文章插图
输出星星菱形
#include int main () {int i, j, k, xx = 1;//初始星星 = 1for ( i = 0; i < 7; i++){for ( j = 0; j < (7 - xx) / 2; j++)//空格数量 = (最宽/长的星星数 - 当前星数)/ 2{printf(" ");}for ( k = 0; k < xx; k++)//输出星星{printf("*");}printf("\n");if (i < 3)//当x < 3时,前3行(i = 2)为每次星星数递增 2;第4行时(i = 3)每次递减 2{xx += 2;}else {xx -= 2;}}return 0;}
两个乒乓球队进行比赛,各出三人 。甲队为a,b,c三人,乙队为x,y,z三人 。已抽签决定比赛名单 。有人向队员打听比赛的名单 。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单 。
#include int main(){char i,j,k;for ( i = 'x'; i <= 'z'; i++){for ( j = 'x'; j <= 'z'; j++){for ( k = 'x'; k <= 'z'; k++){if (i != j && i != k && j != k){if (i != 'x'&& k != 'x' && k != 'z'){printf("a--%c,b--%c,c--%c",i,j,k);//a--z,b--x,c--y}}}}}return 0;}
求100-200之间全部素数(类似题:输入一个大于3的整数n,判断它是否为素数)
素数:只能被1和它本身整除的数
#include int main () {int i, j, mark;for ( i = 100; i <= 200; i++){mark = 1;//进入循环时全部打上标记for ( j = 2; j < i; j++)//从2 - i-1的范围循环{if (i % j == 0)//如果能被任意j整除的数就不是素数,标记变为0{mark = 0;}}if (mark == 1)//经过循环后标记还是1的就是素数{printf("%d\t",i);}}return 0;}
数组 用数组求数列前20项(每行显示5个):
(斐波那契):第1,2项的值为1,往后每一项的值的都是前两项相加的和,例如:1,1,2,3,5····
【C语言程序相关练习题】#includeint main(){int a[20], i;a[0] = 1,a[1] = 1;//第一二项为1for ( i = 2; i < 20; i++)//从第3三项开始{a[i] = a[i-1] + a[i-2];}for ( i = 0; i < 20; i++){if (i % 5 == 0)//到第五个换行{printf("\n");}printf("d",a[i]);}return 0;}
输入10个数的数组,从小到大使用冒泡排序:
#includeint main(){int a[10], i ,j ,t;for ( i = 0; i < 10; i++){scanf("%d",&a[i]);}for ( i = 0; i < 9; i++)//从第一个元素到最后一位走9趟{for ( j = 0; j < 9 - i; j++)//比较9-j次,已比较的不需要再比较{if (a[j] > a[j+1])//如果第j项大于第j+1项,则互换位置{t = a[j];a[j] = a[j+1];a[j+1] = t;}}}for ( i = 0; i < 10; i++){printf("%d\t",a[i]);}return 0;}
输入一行字符,统计一共有多少个单词,单词间用空格隔开
#include#include int main(){char str[100];char c;int i, num = 0, word = 0;gets(str);for ( i = 0; (c = str[i]) != '\0'; i++)//获取str的每一个字符{if (c == ' ')//当字符是空格时word记为0{word = 0;}else if (word == 0)//当字符不是空格并且前一个字符是空格时表示新单词出现,word标记1,num累加{word = 1;num++;}}printf("共:%d个单词",num);------------------一行秒杀写法---------------char str[100];char c;gets(str);int num = 0;for (int i = 0; (c = str[i]) != '\0'; i++){if (str[i] == ' ' && str[i-1] != ' ') num++;//若本字符是空格且前一个字符不为空格则代表新单词}printf("%d", num);return 0;}
利用筛选法求100以内的素数
#include#include int main(){int a[100];int i, j;for ( i = 0; i < 100; i++)//写入数组{a[i] = i + 1;//从1开始}a[0] = 0;//1不是素数所以直接为0for ( i = 1; i < 100; i++)//从2开始往后遍历{for ( j = i + 1; j < 100; j++)//如果2往后的数能被2整除,则不是素数,设为0{if (a[i] != 0 && a[j] != 0){//排除往后已经被设为0的数if (a[j] % a[i] == 0){a[j] = 0;}}}}for ( i = 0; i < 100; i++){if (a[i] != 0)//剩下不是0的数就是素数{printf("%d ",a[i]);}}return 0;}
用选择法对10个整数排序
#include int main(){int a[11];int i, j, t;for ( i = 0; i < 10; i++) {scanf("%d",&a[i]); }for ( i = 0; i < 9; i++)//从第1项到第9项遍历{for ( j = i + 1; j < 10; j++)//从第2项到第10项遍历{if (a[i] > a[j]){//如果i大于j(i+1)的值则互换位置,然后用现在的i(原j的值)与下一个j(i+1的再下一项)对比t = a[i];//用第一项与余剩全部项比较,找到最小的值放在数组第一位,再继续第二项比较a[i] = a[j];a[j] = t;}}}for ( i = 0; i < 10; i++){printf("%d ",a[i]);}return 0;}
输入一个数,按照排序规律将他插入到一个已排好序的数组中:
#include int main(){int arr[11]={1,4,6,9,13,16,19,28,40,100};int i, j, a;scanf("%d",&a);if (a > arr[9])//如果a大于数组的最大值就直接插到尾部{arr[10] = a;}else {for ( i = 0; i < 10; i++){if (arr[i] > a){//遍历数组找到第一项大于a的值,从那一项到数组最后一项往后挪一位,再把a插入到那一项的位置中并退出循环for ( j = 9; j >= i; j--){arr[j + 1] = arr[j];}arr[i] = a;break;//插入完一定要结束循环!!}}}for ( i = 0; i < 11; i++){printf("%d ",arr[i]);}return 0;}
将一个数组中的值按逆序重新存放,例如原来顺序为8,6,5,4,1,要求改为1,4,5,6,8 。(没说不能用新数组吧):
#include int main(){int i, arr[9] = {5,9,6,2,4,61,71,6,81};int newArr[9]; //新数组int k = 8;//数组长度for ( i = 0; i < 9; i++){newArr[i] = arr[k];//把旧数组最后一项[k]赋值给新数组第一项[i]k--; //k随i增加减少}for ( i = 0; i < 9; i++){printf("%d ",newArr[i]);}return 0;/*-----------正常同一个数组翻转--------------*/int i, arr[9] = {15,61,71,6,81,45,138,44,8};int t, arrlen = 8;int a = arrlen % 2 == 0 ? arrlen/2 : arrlen/2+1; //如果数组长度为单数则多执行一次for ( i = 0; i < a; i++) //只执行数组长度的一半次数{t = arr[i];arr[i] = arr[arrlen-i];arr[arrlen-i] = t;//与数组对应位置的元素交换}for ( i = 0; i < 9; i++){printf("%d ",arr[i]);}return 0;}/*考试建议用这个*/ /*考试建议用这个*/ /*考试建议用这个*/#include void exChange(int *x,int n) { //n为数组长度int *i, *j, *p, t, m = (n-1)/2;i = x, j = x+n-1, p = x+m;//i指向数组第一个值,j指向数组最后一个值,p指向数组中间的值(向下取整)for ( ; i <= p; i++,j--)//交换 i 和 j 的值,同时向中间p ++和--{t = *i;*i = *j;*j = t;}}int main(){int a[10] = {15,61,71,6,81,45,138,44,8,99};exChange(a,10);for (int i = 0; i < 10; i++){printf("%d ",a[i]);}return 0;}
杨辉三角
C语言程序相关练习题

文章插图
#include int main(){int len;scanf("%d",&len);int i, j;int arr[len][len]; //建立一个等宽二维数组for ( i = 0; i < len; i++){arr[i][0] = 1; //每一行的第一项和最后一项都为1arr[i][i] = 1;for ( j = 1; j < i; j++) //从第二项开始循环{arr[i][j] = arr[i-1][j-1] + arr[i-1][j];//第J项等于上一行的J-1和J项的和}}for ( i = 0; i < len; i++){for ( j = 0; j < len-i-1; j++) //等腰三角形,直角可去{printf("");/* code */}for ( j = 0; j <= i; j++) //输出每一项的值{printf("%4d",arr[i][j]);}printf("\n");}return 0;}
函数 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,整数在键盘输入:
#include int big(int n1,int n2) {int i, t;if (n1 < n2){t = n2;n2 = n1;n1 = t;}for ( i = n2; i > 0; i--){if (n1 % i == 0 && n2 % i == 0){return i;}}} int small(int n1,int n2,int n3) {return (n1 * n2) / n3;}int main(){int n1,n2;scanf("%d%d",&n1,&n2);int num = big(n1,n2);printf("最大公约数为:%d\n",num);printf("最小公倍数为:%d",small(n1,n2,num));return 0;}
写一个判断素数的函数,输入一个素数,输出是否素数的信息:
#include int prime(int n) {int i, j;for ( i = 2; i < n; i++){if (n % i == 0){printf("不是素数");return 0;}}printf("%d是素数",n);}int main(){int n;scanf("%d",&n);prime(n);return 0;}
写一个函数,翻转输入的字符串:
#include #include void reveStr(char str[]) {int i, len = strlen(str), n = len - 1;char newStr[len];for ( i = 0; i <= len; i++)//i <= len因为要把'\0'也拿过来{newStr[i] = str[i + n];//最后一项给新字符串第一项赋值,依次到倒数第二项···n -= 2;}puts(newStr);-------------与数组翻转相同--------------------int i, len, a, t;len = strlen(str)-1;a = len%2==0 ? len/2 : len/2+1;for ( i = 0; i < a; i++){t = str[i]; str[i] = str[len-i]; str[len-i] = t;}puts(str);}int main(){char str[100];gets(str);reveStr(str);return 0;}
一个连接两个字符串的函数:
#include #include void strCat(char str[],char str2[]) {int len = strlen(str);int len2 = strlen(str2);char newStr[len + len2];int i;for ( i = 0; i < len+len2; i++){if (i < len){newStr[i] = str[i];}else if(i >= len){newStr[i] = str2[i-len];}}newStr[i] = '\0';puts(newStr);}int main(){char str[100];gets(str);char str2[100];gets(str2);strCat(str,str2);return 0;} //------------------老赖做法#include #include void connect(char str1[],char str2[]) {strcat(str1,str2);puts(str1);}int main(){char str1[100];char str2[100];gets(str1);gets(str2);connect(str1,str2);return 0;}
写一个函数,输入一个4位数字,要求每两个数字中间有一个空格,例如输入1234,输出1 2 3 4 。
#include #include void space(char str[]) {int i;for(i=strlen(str);i>0;i--)//从数组最后一个元素开始,到第二个元素结束,也就是'\0'- 输入的第一个数{str[2*i]=str[i];//因为加每个数中加空格 = 数组长度*2是最后一项,把数组最后一项'\0'放在数组长度*2 位置上str[2*i-1]=' ';//并在前一个位置加空格,继续循环倒数第二项,然后加空格····}printf("\nOutput:\n%s",str);}int main(){char str[100];gets(str);space(str);return 0;}//-----------------------老赖做法#include #include #define MaxSize 100void space(char str[]){int i;for ( i = 0; i < strlen(str); i++){printf("%c ",str[i]);}}int main(){char str[MaxSize];gets(str);space(str);return 0;}
写一个函数,传入一个字符串,统计其中字母、数字、空格和其他字符的个数:
#include #include void Statistics(char str[]) {int len = strlen(str);int i, letter = 0, num = 0, space = 0, other = 0;for ( i = 0; i < len; i++){if (str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z'){letter++;}else if (str[i] >= '0' && str[i] <= '9'){num++;}else if (str[i] == ' '){space++;}else {other++;}}printf("字母:%d,数字:%d,空格:%d,其他:%d",letter,num,space,other);}int main(){char str[100];gets(str);Statistics(str);return 0;}
写一个函数,用冒泡排序对输入的10个字符排序:
#include int maopao(int num[]) {int i, j, t = 0;for ( i = 0; i < 9; i++){for ( j = 0; j < 9 - i; j++){if (num[j] > num[j+1]){t = num[j];num[j] = num[j+1];num[j+1] = t;}}}for ( i = 0; i < 10; i++){printf("%d ",num[i]);}}int main(){int num[100];int i;for ( i = 0; i < 10; i++){scanf("%d",&num[i]);}maopao(num);return 0;}
输入一个整数n,求斐波那契数列的第n项:
斐波那契数列:每一项等于前二项的和,例如1,1,2,3,5,8,13·····
#include long Fibonacci(int n) {long s;if (n == 1 || n == 2){return 1;}else {s = Fibonacci(n-1) + Fibonacci(n-2);}return s;}int main(){int n;scanf("%d",&n);if (n < 0){printf("不能为0");}else {printf("第%d项的值为:%ld",n,Fibonacci(n));}return 0;}
输入10个整数,将最小的数与第一个数对换,最大的数与最后一个对换
#include void change(int a[10]) {int max = a[0],min = a[0],t,i,imax = 0,imin = 0;for ( i = 0; i < 10; i++){if (a[i] > max){max = a[i];imax = i;}if (a[i] < min){min = a[i];imin = i;}}t = a[0];a[0] = a[imin];a[imin] = t;t = a[9];a[9] = a[imax];a[imax] = t;}int main(){int a[10],i;for ( i = 0; i < 10; i++){scanf("%d",&a[i]);}change(a);for ( i = 0; i < 10; i++){printf("%d ",a[i]);}return 0;}
指针 输入三个整数,要求从大到小排序输出,用函数实现:
#include void swap(int *pt,int *pt1) {int t;t = *pt;*pt = *pt1;*pt1 = t;}void Big(int *q,int *q1,int *q2) {if (*q < *q1){swap(q,q1);} if (*q < *q2){swap(q,q2);}if (*q1 < *q2){swap(q1,q2);}}int main(){int a, b, c, *p, *p1, *p2;scanf("%d%d%d",&a,&b,&c);p = &a;p1 = &b;p2 = &c;Big(p,p1,p2);printf("%d %d %d",a,b,c);return 0;}
输入三个字符串,从小到大排序:
#include #include void change(char *q,char *q1) {char str[20];strcpy(str,q);strcpy(q,q1);strcpy(q1,str);}void Big(char *pt,char *pt1,char *pt2) {if (strcmp(pt,pt1) > 0){change(pt,pt1);}if (strcmp(pt,pt2) > 0){change(pt,pt2);}if (strcmp(pt1,pt2) > 0){change(pt1,pt2);}}int main(){char a[100], b[100], c[100];gets(a);gets(b);gets(c);char *p ,*p1 ,*p2;p = a;p1 = b;p2 = c;Big(p,p1,p2);printf("%s %s %s",a,b,c);return 0;}
输入10个整数,将最小的数与第一个数对换,最大的数与最后一个对换:
#include #include void change(int a[10]) {int i ,t;int *p,*max,*min;p = max = min = a;for ( i = 0; i < 10; i++,p++){if (*p > *max){max = p;}if (*p < *min){min = p;}}t = a[0];a[0] = *min;*min = t;t = a[9];a[9] = *max;*max = a[9];}int prin(int a[10]) {int i;for ( i = 0; i < 10; i++){printf("%d ",a[i]);}}int main(){int i, a[10];for ( i = 0; i < 10; i++){scanf("%d",&a[i]);}change(a); prin(a);return 0;}